Из чего состоит JWT
JSON Web Token — три сегмента base64url, соединённые точками:
header.payload.signature. Заголовок называет алгоритм подписи, полезная
нагрузка несёт утверждения, подпись покрывает первые две части. Первые две части
закодированы, а не зашифрованы — их прочитает любой, у кого есть токен.
Поэтому в JWT нельзя класть секреты.
Как пользоваться
Вставьте токен. Заголовок и полезная нагрузка появятся отформатированным JSON, а любое временное поле будет показано и как ISO-метка, и в вашем часовом поясе; просроченный токен подсвечивается в строке состояния.
Какие поля стоит проверять
| Поле | Что означает | Что обычно ломается |
| --- | --- | --- |
| exp | Срок истечения, в секундах | Путают с миллисекундами, получая дату 1970 года |
| iat | Время выпуска | Расхождение часов между сервисами делает свежий токен «из будущего» |
| nbf | Не действителен раньше | Молча отвергает токен, который выглядит нормальным |
| aud | Для кого предназначен | Токен другого сервиса принимают, потому что поле никто не проверяет |
| alg | Алгоритм подписи | none или RS256-токен, проверяемый как HS256 |
Декодировать — не значит проверить
Эта страница отвечает на вопрос «что написано в токене». Она не отвечает на вопрос «можно ли ему верить» — для этого нужны ключ, часы и политика по получателю и издателю, и всё это живёт на вашем сервере. Используйте инструмент, чтобы понять, что вы отправляете; проверку оставьте там, где хранится секрет.
Вопросы
Проверяется ли подпись?+
Нет, и это сделано намеренно. Для проверки HS256 нужен общий секрет, для RS256 — открытый ключ. Вставить секрет подписи в веб-страницу — ровно та ошибка, ради предотвращения которой этот инструмент и сделан. Декодирование показывает, что токен утверждает; решать, верить ли ему, должен только ваш бэкенд.
Токен уходит на сервер?+
Нет. Токен разбивается и раскодируется из Base64 прямо в этой вкладке. Можно открыть панель сети и убедиться, что со страницы ничего не уходит. В этом и весь смысл локального декодера для учётных данных.
Почему exp — большое число, а не дата?+
RFC 7519 определяет exp, iat и nbf как секунды с 1970 года, а Date в JavaScript работает в миллисекундах. Если передать сырое значение в new Date(), получится дата в 1970-м — классическая ошибка в 1000 раз. Здесь умножение сделано правильно, показаны и ISO-значение, и ваше локальное время.
В токене alg: none — это проблема?+
Да. Неподписанный токен может отредактировать кто угодно. Библиотека, принимающая alg: none без явного разрешения, содержит известную уязвимость; если вы видите такое на боевом токене, это находка, а не любопытный факт.