Декодер JWT

RSS

Вставьте JSON Web Token, чтобы увидеть его заголовок, полезную нагрузку и срок действия. Декодирование выполняется локально — токен никуда не отправляется.

Работает на 100% в вашем браузере. Ничего из вставленного не загружается на сервер и не сохраняется.

Заголовок

Полезная нагрузка

Утверждения (claims)

Подпись показана, но не проверена: для проверки нужен секретный или открытый ключ, а его никогда не следует вставлять на сайты.

Как пользоваться декодером JWT

  1. Вставьте JSON Web Token — длинную строку, которая обычно идёт после Authorization: Bearer.
  2. Заголовок и полезная нагрузка декодируются и отображаются в виде отформатированного JSON.
  3. Временные поля (claims), такие как exp, iat и nbf, преобразуются в читаемые даты, чтобы вы с первого взгляда видели, не истёк ли срок действия токена.
Конфиденциальность: Никогда не вставляйте рабочие (production) токены на сайты, которым не доверяете: действительный токен может повторно использовать любой, кто его увидел, пока не истечёт его срок действия. Этот декодер полностью работает в вашем браузере: токен никогда не загружается, не записывается в журналы и не хранится. И всё же лучше использовать тестовые токены, а любой токен, который мог быть раскрыт, отзывайте.

Из чего состоит 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НазваниеЗначение
issIssuer (издатель)Кто создал и подписал токен.
subSubject (субъект)К кому относится токен, обычно ID пользователя.
audAudience (аудитория)Для какого сервиса или сервисов предназначен токен.
expExpiration time (срок действия)Unix-время, после которого токен должен отклоняться.
nbfNot before (не ранее)Unix-время, до которого токен ещё недействителен.
iatIssued at (время выдачи)Unix-время создания токена.
jtiJWT 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) пять частей вместо трёх.

Безопасно ли вставлять сюда мой токен?

Декодирование происходит локально, и ничего не передаётся. Общее правило: не вставляйте действующие рабочие токены в онлайн-инструменты, которые вы не проверили.

Обновлено

Скопировано в буфер обмена