JWT — формат токенов аутентификации¶
JWT (JSON Web Token, произносится «джей-дабл-ю-ти») — открытый стандарт (RFC 7519) представления утверждений (claims) в виде компактного формата на основе JSON, предназначенного для обмена данными между двумя сторонами. Токен состоит из трёх частей, закодированных в Base64URL и соединённых точками, и криптографически подписывается (или шифруется) отправителем, чтобы получатель мог проверить подлинность и целостность содержимого. JWT широко применяется в веб-аутентификации, механизмах single sign-on (SSO), OAuth 2.0 и защите API.
¶Структура токена
JWT имеет вид строки из трёх компонентов, разделённых символом .:
`` xxxxx.yyyyy.zzzzz ``
| Часть | Название | Содержимое |
|---|---|---|
| Первая | Header (заголовок) | JSON с типом токена (typ: "JWT") и используемым алгоритмом подписи (alg: HS256, RS256, ES256 и др.) |
| Вторая | Payload (полезная нагрузка) | JSON с утверждениями (claims): стандартные (iss, sub, exp, iat, aud) и произвольные пользовательские |
| Третья | Signature (подпись) | Криптографическая подпись, вычисленная по первым двум частям |
Каждая из первых двух частей кодируется алгоритмом Base64URL без дополнения нулями. Важно, что Base64 — это не шифрование: содержимое payload легко прочитать любому, у кого есть токен. Конфиденциальные данные в JWT помещать нельзя — только идентификаторы, роли, сроки действия.
¶Подпись и алгоритмы
JWT поддерживает два семейства алгоритмов подписи:
- HMAC (HS256, HS384, HS512) — симметричные, используют один общий секрет у отправителя и получателя. Подходят, когда токен подписывает и проверяет один и тот же сервис.
- RSA и ECDSA (RS256, RS384, RS512, ES256, ES384, ES512) — асимметричные: подписывающая сторона использует приватный ключ, проверяющая — публичный. Такая схема удобна для распределённых систем, где множество сервисов должны проверять токены, но не должны знать секрет подписи.
Существует также алгортим none, формально допускающий отсутствие подписи; его использование в продакшене считается критической уязвимостью и во всех библиотеках отключено по умолчанию.
¶Процесс аутентификации
Типичный сценарий использования JWT выглядит так:
- Клиент отправляет учётные данные (логин и пароль) на сервер аутентификации.
- Сервер проверяет их и формирует JWT: заполняет payload (например,
sub— идентификатор пользователя,exp— срок действия), подписывает токен секретным ключом. - Токен возвращается клиенту, который хранит его (обычно в localStorage или в httpOnly-cookie) и передаёт в заголовке
Authorization: Bearer <token>при каждом запросе к защищённому API. - Сервер проверяет подпись публичным ключом или секретом, убеждается, что срок действия не истёк, и выполняет запрос.
В отличие от сессий на стороне сервера, JWT не требует хранить состояние на сервере — токен самодостаточен (self-contained). Это упрощает масштабирование, но лишает возможность мгновенного отзыва: чтобы «отозвать» JWT, приходится использовать чёрные списки, короткое время жизни или ротацию ключей.
¶Стандартные утверждения (claims)
RFC 7519 определяет набор зарегистрированных утверждений:
iss(issuer) — издатель токена;sub(subject) — субъект, к которому относится токен (обычно ID пользователя);aud(audience) — предполагаемый получатель;exp(expiration time) — момент истечения срока действия (Unix-время);nbf(not before) — момент, до которого токен недействителен;iat(issued at) — время выдачи;jti(JWT ID) — уникальный идентификатор токена (для защиты от повторного использования).
¶Применение
- Аутентификация в SPA и мобильных приложениях — основной сценарий, заменяющий серверные сессии.
- OAuth 2.0 и OpenID Connect — в OIDC ID-токен и access-токен являются JWT.
- Межсервисная аутентификация — подписанные токены позволяют сервисам доверять данным друг друга без общего хранилища сессий.
- Безопасный обмен данными (JWT Compact Serialization) — в формате JWE токен может быть ещё и зашифрован.
¶Ограничения и риски
- Невозможность мгновенного отзыва. Токен действителен до
exp; для отзыва нужен дополнительный механизм. - Размер. Токен передаётся в каждом HTTP-запросе, поэтому payload должен быть компактным.
- Утечка при XSS. Если JWT хранится в localStorage, JavaScript-код на странице может его украсть; использование httpOnly-cookie снижает риск.
- Алгоритм
noneи подменаalg. Сервер обязан жёстко проверять алгоритм подписи и не доверять полюalgиз заголовка токена. - Отсутствие шифрования по умолчанию. Стандартный JWT (JWS) лишь подписывает данные; для шифрования применяется расширение JWE.
¶Стандарты и экосистема
Спецификация JWT входит в семейство стандартов JOSE (JSON Object Signing and Encryption), описанных в RFC 7515–7519. Для популярных языков программирования существуют зрелые библиотеки: PyJWT и python-jose (Python), jsonwebtoken (Node.js), java-jwt (Java), go-jose (Go), Microsoft.IdentityModel.Tokens (.NET). Реализации поддерживают все основные алгоритмы, проверку exp/nbf, работу с JWK (JSON Web Key) и JWKS (наборы ключей).
Источники:
- RFC 7519 — JSON Web Token (JWT)
- RFC 7515 — JSON Web Signature (JWS)
- RFC 7517 — JSON Web Key (JWK)
- OWASP cheat sheet «JSON Web Token (JWT)»
