JWT: аутентификация и подводные камни

JWT (JSON Web Token) — стандарт для stateless аутентификации. Популярен, но полон опасностей при неправильной реализации.

Структура токена

Header.Payload.Signature — три Base64URL-части через точки. Header: тип и алгоритм. Payload: claims (sub, exp, iat, custom). Signature: HMAC или RSA от header+payload. Токен читаем — не для хранения секретов!

Алгоритмы

HS256 (HMAC-SHA256): симметричный, простой. RS256 (RSA-SHA256): асимметричный, для микросервисов (проверка без знания private key). ES256 (ECDSA): короче RSA. Никогда не используйте "none" — атака alg:none позволяет подделать токен.

Уязвимости и атаки

alg:none: сервер принимает токен без подписи. Algorithm confusion: RS256 → HS256 с публичным ключом как секретом. Weak secrets: HS256 с "secret" ломается за минуты. JWK spoofing: подмена ключа через jwk header. Все актуальные библиотеки закрыли эти дыры — используйте свежие версии.

Best practices

Короткий TTL (15 мин) + refresh tokens. Storage: httpOnly cookie (не localStorage — XSS-риск). Revocation: blacklist или короткий TTL. Claims validation: exp, aud, iss обязательно. Rotate signing keys периодически. Не храните sensitive data в payload.