JSON Web Token

jwt

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

JWT может использоваться при аутентификации и авторизации пользователя, создании временных токенов доступа и других сценариях.

Формат JSON Web токена
  • Заголовок (header) содержит название алгоритма, которым зашифрован токен и тип токена
    {
      "alg": "",
      "typ": "JWT"
    }
  • Полезная нагрузка (payload) может хранить любые данные под любыми ключами и служебную информацию о токене в специальных полях:
    • iss - (Issuer) издатель токена
    • sub - (Subject) субъект, для которого выпущен токен
    • aud - (Audience) получатели, для которых предназначен токен
    • exp - (Expiration Time) время, после которого токен перестанет быть действителен
    • nbf - (Not Before) время, до которого токен не должен приниматься к обработке
    • iat - (Issued At) время, когда токен был выпущен
    • jti - (JWT ID) уникальный идентификатор токена
    Все приведенные специальные поля являются опциональными, то есть необязательными к заполнению.
    {
      "sub": "user123",
      "name": "vasyapupkin",
      "iat": 1516239022
    }
  • Подпись (signature) используется для проверки целостности токена и обеспечивает подлинность данных. Подпись формируется из заголовка и полезной нагрузки, с использованием ключа шифрования, известного только серверу, создающему токен, с применением одного из алгоритмов:
    • HMAC (Hash-based Message Authentication Code) - использует хэш-функцию и секретный ключ для создания подписи.
    • RSA (Rivest–Shamir–Adleman) - использует пару ключей (открытый и закрытый) для создания и проверки подписи.
    • ECDSA (Elliptic Curve Digital Signature Algorithm) - алгоритм цифровой подписи, основанный на эллиптических кривых.

В итоге, сформированный JWT токен состоит из трёх частей, разделённых точками. Заголовок и данные зашифрованы по умолчанию в формате base64, который, как мы увидим в задаче, может быть легко расшифрован.


             заголовок                          данные                            подпись
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.OYkcX0_sy5JLWoEOrVkzajdLIB52q1550J411XzBgBk

Важно помнить, что JWT токен не предназначен для передачи чувствительной (конфиденциальной) информации, так как его содержимое не зашифровано по умолчанию. Подпись лишь обеспечивает защиту от подмены токена.


Задача

Необходимо проверить, что JWT токен, формируемый сервером соответствует приведённым ниже требованиям.

Для расшифровки JWT токена можно воспользоваться официальным сайтом jwt.io, вставив токен в поле Encoded.