Что такое JWT (JSON Web Token) и как он работает?

«Что такое JWT (JSON Web Token) и как он работает?» — вопрос из категории Тестирование безопасности, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Структура токена (3 части, разделенные точками):

  1. Header (alg, typ): Определяет алгоритм подписи (например, HS256) и тип токена.
  2. Payload (claims): Содержит утверждения (claims) — данные о пользователе (например, user_id, roles, exp — срок действия).
  3. Signature: Создается путем кодирования header и payload, их объединения и подписи секретным ключом (HMAC) или приватным ключом (RSA). Подпись верифицирует отправителя и гарантирует целостность данных.

Пример декодированного JWT:

// HEADER: ALGORITHM & TOKEN TYPE
{
  "alg": "HS256",
  "typ": "JWT"
}

// PAYLOAD: DATA
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022,
  "exp": 1516242622
}

// SIGNATURE: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

Типичный flow аутентификации:

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

Преимущества для тестирования безопасности:

  • Stateless: Серверу не нужно хранить сессию, что упрощает масштабирование.
  • Самостоятельный (self-contained): В токене есть все необходимые данные.
  • Уязвимости для проверки: Срок действия токена (exp), надежность алгоритма подписи, хранение на клиенте (не в localStorage для предотвращения XSS).
  • Недостаток: Сложность отзыва до выпуска срока действия (решается короткоживущими токенами и refresh-токенами).