Ответ
JWT (JSON Web Token) — это компактный, URL-безопасный стандарт для представления утверждений (claims), которые могут быть переданы между двумя сторонами. Он часто используется для аутентификации и авторизации. JWT состоит из трех частей, разделенных точками (.
):
-
Header (Заголовок):
- Содержит метаданные о токене, такие как тип токена (
typ
, всегдаJWT
) и алгоритм подписи (alg
), используемый для создания подписи. - Пример:
{ "alg": "HS256", "typ": "JWT" }
- Эта JSON-структура кодируется в Base64URL.
- Содержит метаданные о токене, такие как тип токена (
-
Payload (Полезная нагрузка):
- Содержит утверждения (claims) — информацию о сущности (обычно пользователе) и дополнительные данные. Claims могут быть зарегистрированными (например,
iss
- издатель,exp
- время истечения,sub
- субъект), публичными или приватными. - Пример:
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022, "exp": 1516242622 }
- Эта JSON-структура также кодируется в Base64URL.
- Содержит утверждения (claims) — информацию о сущности (обычно пользователе) и дополнительные данные. Claims могут быть зарегистрированными (например,
-
Signature (Подпись):
- Используется для проверки целостности токена и подтверждения того, что он был отправлен доверенным источником и не был изменен по пути.
- Создается путем хеширования закодированных Header и Payload с использованием секретного ключа (для симметричных алгоритмов, например, HS256) или приватного ключа (для асимметричных алгоритмов, например, RS256).
- Формула для HS256:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret_key )
Итоговая структура JWT:
Токен представляет собой конкатенацию этих трех частей, разделенных точками:
base64UrlEncode(Header)
.base64UrlEncode(Payload)
.Signature
Пример: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Важное замечание: JWT не шифрует данные в Header и Payload, а лишь кодирует их в Base64URL. Это означает, что любая информация в этих частях токена видна всем. Для обеспечения конфиденциальности данных используйте HTTPS и никогда не храните чувствительную информацию в Payload без дополнительного шифрования. Подпись гарантирует только целостность и аутентичность, но не конфиденциальность.