Декодировщик JWT

Для HS256, HS384 и HS512: общий секрет. Для RS, PS, ES и EdDSA: публичный ключ (PEM, сертификат, JWK или JWK set).

Любой, у кого есть этот секрет, тоже может создавать действительные токены. Лучше используйте тестовый секрет, а не секрет из рабочей среды.

Проверяем подпись...

Вставьте JWT (три части, закодированные в base64url и разделённые точками). Декодер покажет заголовок, полезную нагрузку и подпись, декодированные и аккуратно отформатированные, а также обнаруженный алгоритм, срок действия токена по вашему местному времени и согласованность значений nbf («не ранее»), iat («время выпуска») и exp («срок действия»). При наличии секрета или открытого ключа подпись можно дополнительно проверить.

Как декодировать JWT

  1. 1

    Вставьте токен

    Три строки в формате base64url, разделённые символом `.` (заголовок.полезная нагрузка.подпись).

  2. 2

    Прочитайте декодированный заголовок

    Алгоритм, тип и идентификатор ключа (`kid`): алгоритм указывает, какой тип ключа требуется для верификации.

  3. 3

    Прочитайте полезную нагрузку

    Стандартные утверждения (`iss`, `sub`, `aud`, `exp`, `iat`, `nbf`, `jti`) плюс любые пользовательские утверждения, которые выпускает ваше приложение.

  4. 4

    Проверить (опционально)

    Укажите секрет HMAC (для алгоритмов HS256, HS384 и HS512) или публичный ключ (для алгоритмов RS256, ES256 и других) для подтверждения действительности подписи.

Анатомия JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNjAwMDAwMDAwfQ
.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Каждый сегмент закодирован в base64url (а не в стандартном base64). Заголовок, это JSON вида {"alg":"HS256","typ":"JWT"}, полезная нагрузка, JSON вида {"sub":"1234567890","name":"Alice","iat":1600000000}, а подпись, это HMAC- или RSA-подпись строки header.payload.

Стандартные утверждения (RFC 7519)

Утверждение Название Примечания
iss Издатель Кто выпустил токен
sub Субъект О ком этот токен
aud Аудитория Для кого предназначен токен
exp Время истечения Метка времени Unix; после неё токен отклоняется
nbf Не ранее Метка времени Unix; до неё токен отклоняется
iat Время выпуска Метка времени Unix создания токена
jti Идентификатор JWT Уникальный идентификатор для списков отзыва

Поддерживаемые алгоритмы

Значение alg Тип ключа
HS256/HS384/HS512 Общий секрет HMAC
RS256/RS384/RS512 Открытый ключ RSA
ES256/ES384/ES512 Открытый ключ ECDSA
PS256/PS384/PS512 Открытый ключ RSA-PSS
EdDSA / Ed25519 Кривая Эдвардса
none Никогда не доверяйте этому, неподписанные токены

Ловушка alg: none

Ранние библиотеки JWT допускали токены "alg": "none" и наивно считали их действительными. Всегда:

  • Заносите в белый список алгоритмы, которые принимает ваше приложение.
  • Безоговорочно отклоняйте alg: none.
  • Отклоняйте alg: HS256, когда код проверки ожидает RS256 (атака «путаница алгоритмов»).

Чем JWT НЕ является

  • Не зашифрован. Заголовок и полезная нагрузка закодированы в base64, что декодируется элементарно. Никогда не помещайте секреты в JWT, не обернув его в JWE.
  • По умолчанию не отзывается. После выпуска JWT действителен вплоть до exp. Для отзыва нужен чёрный список или короткий срок действия плюс токены обновления.
  • Не является заменой сессионной cookie во всех сценариях. Непрозрачные токены, хранящиеся на стороне сервера, часто проще и безопаснее.

Частые ошибки

  • Доверять заголовку. Значения kid и alg берутся из самого токена. Скомпрометированный сервер может задать их произвольно; всегда сверяйтесь с фиксированным списком.
  • Игнорировать расхождение nbf и iat. Из-за дрейфа часов возможна ситуация iat > now. Закладывайте небольшой допуск (30–60 с).
  • Логировать JWT целиком. Полезная нагрузка часто содержит идентификаторы пользователей, адреса электронной почты, права доступа, PII, которым не место в stdout.
  • Использовать HS256 со слабым секретом. Секрет из 16 символов подбирается перебором за считаные минуты. Используйте не менее 256 бит случайной энтропии.

Часто задаваемые вопросы

Нет. Декодирование выполняется в вашем браузере. Токен сохраняется локально, это важно, поскольку JWT-токены часто содержат данные сессии, идентификаторы пользователей и права доступа.

Да. При вставке общего секрета HMAC или публичного ключа, закодированного в формате PEM, проверка выполняется в вашем браузере; ключ никогда не покидает вашего устройства.

Это означает, что токен не подписан. Ни в коем случае не принимайте такие токены в производственной среде, их можно легко подделать. Несколько известных уязвимостей типа CVE были связаны именно с библиотеками, которые по умолчанию использовали формат alg: none.

Подпись по протоколу JWT подтверждает подлинность данных, но не их конфиденциальность. Заголовок и полезная нагрузка кодируются с использованием формата Base64URL, этот процесс обратим. Для обеспечения конфиденциальности рекомендуется применять алгоритм шифрования JSON Web Encryption (JWE) к данным в формате JWT или избегать передачи чувствительной информации в полезную нагрузку.

Сопутствующие инструменты

Смешивание цветов

Смешайте два HEX-цвета в 2-20 равномерных образцов. Каждый промежуточный цвет показывается как HEX-код в верхнем регистре, включая оба края.

Генератор вымышленных телефонных номеров

Создавайте до 50 вымышленных номеров из официально зарезервированных диапазонов пяти стран.

Генератор конфигурации webpack

Создайте webpack.config.js для webpack 5 по короткой форме: задайте entry, папку вывода и режим, затем включите TypeScript, Babel, загрузчик CSS, HtmlWebpackPlugin и сервер разработки.

Генератор случайных букв

Генерируйте случайные буквы A-Z. Выберите количество, верхний или нижний регистр либо смешанный вариант для игр, заданий и уроков.

Генератор бейджей README

Создавайте бейджи shields.io для файлов README на GitHub: статус сборки, версия, лицензия, число загрузок и покрытие кода. Просмотрите и скопируйте фрагмент Markdown.

Генератор случайных адресов

Создавайте 1–20 похожих на адрес записей для макетов и тестов в трёх упрощённых форматах.

Инструмент доступен на других языках