Что такое JWT и как его использовать для аутентификации?php-50

JWT (JSON Web Token) — это открытый стандарт (RFC 7519) для создания токенов доступа, которые передают информацию между сторонами в виде JSON-объекта. Токен подписывается цифровой подписью (например, HMAC или RSA), что гарантирует его подлинность и целостность данных.

Структура JWT

JWT состоит из трех частей, разделенных точками:

  1. Header — содержит метаданныe (например, алгоритм подписи и тип токена).
  2. Payload — хранит полезные данные (claims), такие как идентификатор пользователя, срок действия токена и др.
  3. Signature — создается путем кодирования header и payload с использованием секретного ключа и алгоритма, указанного в header.

Пример структуры:

Header.Payload.Signature

Как использовать JWT для аутентификации?

  1. Пользователь входит в систему, отправляя логин и пароль.
  2. Сервер проверяет учетные данные и, если они верны, генерирует JWT.
  3. Токен возвращается клиенту (обычно в заголовке Authorization: Bearer <token>).
  4. Клиент отправляет токен в каждом запросе к защищенным ресурсам.
  5. Сервер проверяет токен (подпись, срок действия) и предоставляет доступ.

Пример кода на PHP

Генерация JWT (с использованием библиотеки firebase/php-jwt):

<?php
use Firebase\JWT\JWT;

$key = "ваш_секретный_ключ";
$payload = [
    "user_id" => 123,
    "exp" => time() + 3600 // Токен действителен 1 час
];

$jwt = JWT::encode($payload, $key, 'HS256');
echo $jwt;
?>

Проверка JWT на сервере:

<?php
try {
    $decoded = JWT::decode($jwt, $key, ['HS256']);
    print_r($decoded);
} catch (Exception $e) {
    http_response_code(401);
    echo "Ошибка аутентификации: " . $e->getMessage();
}
?>

Преимущества JWT

  • Статусность (Stateless): серверу не нужно хранить сессию.
  • Масштабируемость: подходит для микросервисов.
  • Гибкость: можно передавать дополнительные данные в payload.

Недостатки

  • Невозможность отзыва токена до истечения срока (если не использовать blacklist).
  • Риск утечки: если токен украден, злоумышленник получит доступ.

Резюмируем:

JWT — это удобный и безопасный способ аутентификации, особенно для RESTful API и SPA. Важно правильно настраивать срок жизни токена и использовать HTTPS для защиты передаваемых данных.