Перейти к содержимому

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

Посмотрите заголовок, утверждения (claims) и срок действия JSON Web Token. Токен — это рабочие учётные данные, поэтому здесь ничего никуда не отправляется и никогда не сохраняется.

  • Не сохраняется
  • Без очереди и ожидания
  • Без регистрации и водяных знаков

Ваш токен не покидает эту страницу. Он декодируется прямо здесь, без запросов к какому-либо серверу, — и это важно, ведь JWT обычно работает как действующие учётные данные. Отключите Wi-Fi после загрузки страницы — декодирование всё равно сработает: ничего не отправляется.

Префикс «Bearer » не мешает — он игнорируется.

Как это работает

1

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

С префиксом «Bearer » или без него. Он остаётся на этой странице; запросы не отправляются.

2

Посмотрите три части

Заголовок, payload и подпись — каждая декодирована и отформатирована. Временные метки превращаются в настоящие даты, и видно, сколько времени осталось.

3

Проверьте предупреждения

Истёкшие токены, отсутствие срока действия, алгоритм «none» и другие проблемы отмечаются с объяснением, что они значат.

Что проверяется, а что только читается

Всё на этой странице, кроме двух сравнений дат, — это просто расшифровка записи. Заголовок и payload декодируются из Base64URL и выводятся; подпись копируется как есть и не трогается, потому что ключа здесь нет и никакая криптография не выполняется. Два суждения, которые страница всё же выносит, — это арифметика по часам вашего устройства: утверждение о сроке действия сравнивается с текущим моментом, и утверждение «не действителен до» — тоже. Расхождение часов не учитывается, хотя сервер, проверяющий тот же токен, обычно допускает минуту-другую. Ноутбук, чьи часы спешат на пять минут, покажет действующий токен как истёкший, хотя с токеном всё в порядке.

Две детали разбора определяют, что вы на самом деле видите. Утверждения о времени читаются, только если они записаны как числа JSON: токен, у которого срок действия записан строкой "1699999999", считается токеном вообще без срока и получает предупреждение, что сам он никогда не истечёт, — то есть прямо противоположное истине. А payload разбирается встроенным JSON-парсером браузера, а не парсером с сохранением всех цифр, который работает в наших JSON-инструментах, поэтому 64-битное числовое утверждение — например, ID пользователя в формате snowflake в поле sub — показывается с округлёнными последними цифрами. Именно поэтому идентификаторы в JWT обычно строки; если это не так, читайте значение из исходного payload, а не из таблицы утверждений.

Токен из пяти частей отклоняется как зашифрованный JWE, и это решение принимается только по количеству частей, без чтения заголовка, — на практике верно, но стоит знать, что это упрощение. Всё, что не состоит из трёх частей, отклоняется сразу, как и payload, который декодируется в массив JSON или просто строку вместо объекта. Предупреждения выдаются для алгоритма «none» и для семейства HS, где ключ подписи — общий секрет, а не открытый ключ. Токены, подписанные RS, ES или PS, никаких предупреждений не вызывают, так что молчание страницы означает лишь отсутствие известной плохой структуры, а не одобрение.

Если нужно другое

Здесь ничего не сохраняется — и только поэтому эта страница вообще имеет право на существование, — но вырабатывать такую привычку всё равно не стоит. Обещание конфиденциальности нельзя проверить, прочитав его: отключитесь от сети после загрузки страницы и убедитесь, что декодер продолжает работать, — именно этого не может инструмент, за которым стоит сервер. А если токен, который вы вставили куда-то, что не можете проверить, всё ещё действителен, замените его, а не рассуждайте. Замена — минутное дело. Альтернатива — долгий спор с самим собой об учётных данных, которые всё ещё открывают дверь. Чтобы прочитать токен на компьютере, а не во вкладке, payload достаётся одной командой в терминале: вырежьте второе поле между точками, пропустите его через base64 -d и передайте в jq.

Когда вопрос в том, подлинный ли токен, а не что в нём написано, эта страница не подходит по самому своему устройству — как и любой другой онлайн-декодер. Проверка должна происходить там, где уже есть ключ: в библиотеке JWT вашего языка на вашем сервере, со сверкой с опубликованным JWKS издателя. Это несколько строк кода, это единственный ответ, который что-то значит, а любой сайт, предлагающий сделать это за вас, просит тот самый секрет, который никогда нельзя отдавать сайту.

Частые вопросы

Мой токен куда-нибудь отправляется?

Нет — и для этой страницы это не функция, а весь смысл. JWT обычно — действующие учётные данные: кто им владеет, может действовать от вашего имени, пока не истечёт срок. Вставить его в онлайн-декодер, который отправляет его на сервер, — значит отдать рабочий ключ, и никакие обещания не вести журналы этого не отменят. Этот декодер — обычный JavaScript на странице, которую вы видите. Ничего не сохраняется, ничего не записывается в журналы, запросы не отправляются. После загрузки страницы отключите Wi-Fi — всё будет работать точно так же. Это самый простой способ проверить обещание конфиденциальности самостоятельно, а не верить нам на слово.

Проверяется ли подпись?

Нет, и ни один онлайн-декодер не может честно сделать это без вашего ключа подписи. Декодирование и проверка — совершенно разные операции. Декодирование просто снимает с токена Base64 — это может сделать кто угодно с любым токеном, и это ничего не говорит о том, подлинный ли он. Проверка означает повторное вычисление подписи с секретом или открытым ключом, которым токен подписан, а этот ключ никогда не следует вставлять на сайт. Здесь вы видите то, что токен ЗАЯВЛЯЕТ. Можно ли доверять этим заявлениям, может ответить только ваш сервер, у которого есть ключ.

Может ли кто-то прочитать JWT, который я ему отправлю?

Да — полностью, и многие об этом не догадываются. JWT подписан, а не зашифрован. Заголовок и payload — это Base64, кодировка без всякого секрета, поэтому любой, кто перехватит токен, прочитает каждое утверждение в нём. Подпись не даёт ИЗМЕНИТЬ токен, но никак не мешает его ПРОЧИТАТЬ. Никогда не кладите в payload JWT ничего конфиденциального: ни паролей, ни номеров карт, ни личных данных, которые вы не написали бы на открытке.

Что значит предупреждение об алгоритме «none»?

Что токен заявляет о себе как о неподписанном, и это одна из самых серьёзных находок, о которых сообщает эта страница. `alg: none` — задокументированный обход аутентификации: злоумышленник берёт настоящий токен, меняет payload так, чтобы в нём значилось, что он администратор, ставит алгоритм «none», удаляет подпись — и библиотека, доверяющая заголовку, принимает токен. Все серьёзные библиотеки JWT сейчас блокируют это по умолчанию, но реализации, доверяющие `alg`, всё ещё встречаются. Токен с `alg: none` следует считать атакой, пока не доказано обратное.

Как узнать срок действия?

Это сделано за вас. `exp`, `iat` и `nbf` — это Unix-метки времени, секунды с 1970 года, и в виде чисел их не прочитать. Каждая показывается как настоящая дата в вашем часовом поясе с указанием, сколько времени прошло или осталось, а об истёкшем токене сообщается прямо, а не оставляется вам на подсчёт. Токен вообще без `exp` тоже отмечается: JWT без срока действия нельзя отозвать истечением срока, и он остаётся действительным, пока действует ключ подписи.

В моём токене пять частей, а не три

Значит, это JWE — зашифрованный, а не просто подписанный токен, и его содержимое действительно нельзя прочитать без ключа расшифровки. Страница распознаёт такую структуру и сообщает об этом, а не показывает бессмыслицу. Пять частей означают, что payload — настоящий шифротекст; декодировать тут нечего.

Какие утверждения стандартные?

Зарегистрированные утверждения: `iss` — кто выпустил токен, `sub` — к кому он относится (обычно ID пользователя), `aud` — для кого он предназначен, `exp` — когда истекает, `nbf` — не действителен до, `iat` — когда выпущен, и `jti` — уникальный ID токена. Всё остальное придумывает тот, кто строил систему. Каждое зарегистрированное утверждение в результате подписано своим значением, так что не нужно помнить, какое трёхбуквенное сокращение что означает.

Полезно знать: Здесь токен декодируется, но не проверяется. Подпись JWT доказывает, что токен не изменён, а для её проверки нужен секрет или открытый ключ издателя — который никогда не стоит вставлять на веб-страницу. Считайте всё, что показано здесь, заявленным, а не доказанным, и проверяйте на своём сервере.

Разместите этот инструмент на своём сайте

Бесплатно для любого блога, страницы класса или справочной статьи. Вставьте один фрагмент кода — и посетители смогут пользоваться инструментом прямо на вашей странице.