Как пользоваться декодером JWT
- Вставьте JSON Web Token — длинную строку, которая обычно идёт после
Authorization: Bearer. - Заголовок и полезная нагрузка декодируются и отображаются в виде отформатированного JSON.
- Временные поля (claims), такие как
exp,iatиnbf, преобразуются в читаемые даты, чтобы вы с первого взгляда видели, не истёк ли срок действия токена.
Из чего состоит JWT
JSON Web Token, описанный в RFC 7519, — это компактный способ передачи утверждений (claims) между сторонами. Распространённая подписанная форма (JWS) состоит из трёх частей, разделённых точками:
header.payload.signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMifQ.<signature>
- Заголовок (header): JSON с описанием токена, прежде всего алгоритма подписи.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9декодируется в{"alg":"HS256","typ":"JWT"}. - Полезная нагрузка (payload): JSON с утверждениями (claims) о пользователе или сессии.
- Подпись (signature): вычисляется по закодированным заголовку и полезной нагрузке с помощью секрета (HMAC, например HS256) или закрытого ключа (например, RS256, ES256).
Каждая часть кодируется в base64url — URL-безопасном алфавите Base64 без выравнивания (padding). Поэтому в токенах встречаются - и _, а JWT почти всегда начинаются с eyJ: так кодируются открывающие символы {" JSON-объекта, если за ними следует типичное имя ключа в нижнем регистре. Саму кодировку можно изучить с помощью кодировщика Base64.
Зарегистрированные утверждения (claims)
| Claim | Название | Значение |
|---|---|---|
iss | Issuer (издатель) | Кто создал и подписал токен. |
sub | Subject (субъект) | К кому относится токен, обычно ID пользователя. |
aud | Audience (аудитория) | Для какого сервиса или сервисов предназначен токен. |
exp | Expiration time (срок действия) | Unix-время, после которого токен должен отклоняться. |
nbf | Not before (не ранее) | Unix-время, до которого токен ещё недействителен. |
iat | Issued at (время выдачи) | Unix-время создания токена. |
jti | JWT ID | Уникальный идентификатор, полезный для защиты от повторного использования. |
Все они в RFC 7519 необязательны; какие из них требовать, решают приложения. Временные утверждения указываются в секундах, а не в миллисекундах; разницу объясняет конвертер Unix-времени.
Частые ошибки
Декодировать — не значит проверить
Декодировать JWT может кто угодно — именно это и делает этот инструмент. Декодирование показывает, что токен утверждает, но не то, подлинны ли эти утверждения. Прежде чем доверять чему-либо в полезной нагрузке, сервер должен проверить подпись правильным ключом, а также проверить exp, nbf, iss и aud.
Полезная нагрузка не секретна
Подписанный JWT может прочитать любой, у кого он есть. Не помещайте в полезную нагрузку пароли, персональные данные, которые вы не стали бы показывать клиенту, или внутренние секреты. Если содержимое должно быть конфиденциальным, используйте зашифрованный JWT (JWE) или храните данные на сервере.
alg: none и подмена алгоритма
Спецификации JOSE определяют значение "alg": "none" для незащищённых токенов с пустой подписью. Библиотека, которая доверяет заголовку самого токена, может принять поддельный токен вроде такого:
{"alg": "none", "typ": "JWT"}
{"sub": "admin"}
(пустая подпись)
Родственная атака переключает токен RS256 на HS256, чтобы открытый ключ ошибочно использовался как секрет HMAC. Защита от обеих одинакова: задайте допустимые алгоритмы на сервере и никогда не позволяйте токену выбирать их.
Советы
- Делайте токены доступа (access tokens) короткоживущими, а для длинных сессий используйте токены обновления (refresh tokens).
- Допускайте небольшое расхождение часов (например, минуту) при проверке
expиnbfна разных серверах. - Используйте хорошо поддерживаемую библиотеку JWT, а не разбирайте и проверяйте токены вручную.
Часто задаваемые вопросы
Может ли этот инструмент проверить подпись JWT?
Для проверки нужен секрет или открытый ключ издателя, и выполнять её нужно на вашем бэкенде. Этот инструмент предназначен для просмотра заголовка и утверждений токена во время отладки.
Почему мой токен отображается как просроченный?
Значение exp раньше текущего времени на вашем устройстве. Проверьте, правильно ли идут ваши часы и указал ли издатель exp в секундах.
Шифруются ли JWT?
Подписанные JWT (JWS), а их в использовании подавляющее большинство, только кодируются и подписываются, поэтому прочитать их может кто угодно. У зашифрованных JWT (JWE) пять частей вместо трёх.
Безопасно ли вставлять сюда мой токен?
Декодирование происходит локально, и ничего не передаётся. Общее правило: не вставляйте действующие рабочие токены в онлайн-инструменты, которые вы не проверили.
Обновлено