Анатомия JWT
JSON Web Token (RFC 7519) — это три части в кодировке Base64URL, соединённые точками: заголовок.полезная нагрузка.подпись. Заголовок указывает, каким алгоритмом он подписан. Полезная нагрузка — JSON-объект с утверждениями (claims) о субъекте. Подпись покрывает первые две части, так что проверяющий может определить, было ли что-то изменено.
Первые две части только закодированы, а не зашифрованы. Любой, у кого есть токен, может прочитать каждый claim — поэтому этот декодер работает без ключа, и поэтому JWT никогда не должен содержать секреты.
Стандартные claims
| Claim | Значение |
|---|---|
| iss | Issuer: кто создал токен |
| sub | Subject: о ком токен, обычно ID пользователя |
| aud | Audience: для какого сервиса предназначен токен; проверяющие обязаны это проверять |
| exp | Срок действия, Unix-время в секундах |
| nbf | Not before: токен недействителен до этого момента |
| iat | Время выпуска |
| jti | Уникальный ID токена, используется для списков отзыва |
Алгоритмы подписи
HS256 (HMAC с SHA-256) использует один общий секрет и для подписи, и для проверки, поэтому любой, кто может проверить, может и подделать; он подходит для одного сервиса, общающегося с самим собой. RS256, ES256 и EdDSA используют закрытый ключ для подписи и открытый для проверки — именно их применяют провайдеры идентификации (Auth0, Keycloak, Google, Azure AD), чтобы любой сервис мог проверять токены, не имея возможности их выпускать. Открытые ключи обычно публикуются по URL /.well-known/jwks.json.
Что обязаны проверять верификаторы
- Подпись, ключом, соответствующим
algв заголовке, и никогда не принимая"alg": "none". - Что
expв будущем, аnbf, если присутствует, в прошлом (с небольшим допуском на расхождение часов). - Что
issиaudсоответствуют ожидаемым значениям.
Вопросы
Безопасно ли вставлять сюда мой токен?
Токен декодируется JavaScript в вашем браузере и не передаётся. Тем не менее токен — это учётные данные: обращайтесь с ним как с паролем и при отладке предпочитайте короткоживущие тестовые токены.
Почему декодер говорит, что мой токен истёк?
Его claim exp раньше, чем часы вашего компьютера. Токены обычно живут недолго (от минут до часов); получите новый через эндпоинт входа или обновления. Если ваши часы неверны, проверка тоже будет неверной.
Можно ли здесь проверить токен RS256?
Не в этой версии. RS256 требует открытый ключ издателя (из его эндпоинта JWKS). Декодер показывает заголовок, полезную нагрузку и временные проверки для любого алгоритма; секретом можно проверить только алгоритмы HMAC.
Почему полезная нагрузка читается без секрета?
Потому что JWT подписан, а не зашифрован. Base64URL обратим по замыслу. Если содержимое нужно скрыть, токен должен быть зашифрован как JWE — он выглядит похоже, но состоит из пяти частей.
Что означает временная метка в exp?
Секунды с 1 января 1970 UTC (Unix-время). Декодер переводит её в дату в вашем часовом поясе и показывает, сколько осталось. Для преобразования других значений используйте инструмент Unix timestamp.