Разбор JSON Web Token на header, payload и signature с расшифровкой claims. Плюс необязательная HMAC-верификация подписи прямо в браузере — секрет никуда не отправляется.
JWT — Base64url-строка из трёх частей, разделённых точками. Header — алгоритм и тип. Payload — набор claims (данных). Signature — подпись header+payload секретом. Все три части — Base64url без padding, читаются глазами при желании.
Header и алгоритмы
alg
HS256, HS384, HS512 · RS256, ES256, none
HS* — симметричные, подпись общим секретом (HMAC-SHA). RS*/ES* — асимметричные, приватным ключом (RSA/ECDSA). alg: 'none' означает без подписи — принимать только для отладки, никогда в prod. Никогда не доверяйте alg из заголовка при валидации — жёстко фиксируйте набор допустимых.
Стандартные claims
RFC 7519
iss, sub, aud, exp, nbf, iat, jti
Reserved-поля из спецификации: iss (issuer), sub (subject), aud (audience), exp (expiration, Unix), nbf (not before), iat (issued at), jti (unique id). Приложение может добавлять любые свои claims (name, email, roles). Обычно короткие имена, чтобы токен не разрастался.
Что можно и нельзя
Безопасность
нет: пароль · да: id, роли, срок
JWT не шифрует, только подписывает — любой может прочитать payload. Не кладите пароли, номера карт, PII. Кладите user id, роли, срок действия. Секрет храните только на сервере. При компрометации — короткий срок жизни (exp) + refresh-механизм.
05
Частые вопросы
Вставьте токен — он разберётся на три части, а заголовок и полезная нагрузка покажутся отформатированным JSON. Стандартные поля подписаны по-русски, а значения времени переведены в обычные даты, поэтому сразу видно, когда токен выпущен, когда истекает и сколько ему осталось. Если частей не три, инструмент так и скажет, а не покажет пустой разбор.
Нет. Разбор идёт целиком в браузере, токен никуда не передаётся и нигде не сохраняется. Секрет для проверки подписи — тоже: он остаётся на странице. Для JWT это критично, потому что действующий токен равен действующему доступу к аккаунту, и вставлять его в сервисы, обрабатывающие данные на сервере, нельзя.
Нет. Обычный JWT только подписан: полезная нагрузка записана в base64url и читается кем угодно без всякого ключа — эта страница тому и доказательство. Поэтому в токен не кладут пароли, номера документов и прочее, что не должно попасться на глаза. Подпись защищает от подделки, а не от чтения.
Время истечения в формате Unix timestamp — число секунд с 1 января 1970 года по UTC. Инструмент показывает его обычной датой и отмечает, истёк ли токен и сколько осталось. Рядом обычно встречаются `iat` — время выпуска, и `nbf` — момент, раньше которого токен считать действительным нельзя.
Для токенов с алгоритмом HS256, HS384 или HS512 — введите секрет в разделе проверки, и подпись будет пересчитана прямо в браузере. Совпала — токен не изменяли после выпуска. Для RS* и ES* проверка недоступна: там нужен открытый ключ сервера, и это уже задача принимающей стороны, а не просмотрщика.
Из трёх частей, разделённых точками: заголовок с алгоритмом подписи, полезная нагрузка с данными и сама подпись. Первые две — это base64url от JSON, третья — результат криптографической операции над ними и секретом. Отсюда узнаваемый вид токена с двумя точками и отсутствие знаков выравнивания на конце.