JWT
JWT (JSON Web Token, RFC 7519) — компактный формат передачи claims в подписанном JSON. Используется в OIDC, OAuth, session tokens, service-to-service auth.
Структура
Три части через точку: header.payload.signature. Все — base64url.
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjMifQ.h8_S3...
# декодировано:
{"alg":"HS256","typ":"JWT"}.{"sub":"123"}.<signature>
Header
alg— алгоритм: HS256, RS256, ES256, EdDSAkid— Key ID (для JWKS)typ— обычноJWT
Standard claims (RFC 7519)
| Claim | Что |
|---|---|
iss | issuer |
sub | subject (user ID) |
aud | audience (для кого) |
exp | expiry (unix time) |
nbf | not before |
iat | issued at |
jti | JWT ID (уникальный) |
Алгоритмы
- HS256/384/512 — HMAC (симметрично, один секрет)
- RS256/384/512 — RSA-PKCS#1
- ES256/384/512 — ECDSA
- EdDSA — Ed25519
- PS256/384/512 — RSA-PSS
- none — никогда не использовать!
Классические уязвимости
alg: none— валидатор без проверки пропускаетalg-confusion — подменить RS256 на HS256, использовать публичный ключ как секрет- Кража токена — Bearer, украл — используешь. Мит: короткий exp, DPoP
- Отсутствие проверки
aud/iss— токен от одного сервиса подойдёт к другому
JWS vs JWE
- JWS (Signed) — подписан, читаем всеми. То что называют "JWT" обычно
- JWE (Encrypted) — зашифрован
Не для сессий (мнение)
Многие эксперты (например, Cross) считают что JWT для сессий — плохая идея: нельзя отозвать без списка revoked-tokens (что убивает stateless-выигрыш). Для сессий лучше opaque + сервер БД. См. сессия vs токен.