Что значит « декодировать JWT »?
Декодировать JWT (« jwt decode », « decode jwt online ») — это разрезать строку по двум точкам, а затем декодировать каждый сегмент из Base64URL, чтобы получить исходный JSON. Ключ не нужен: заголовок и payload просто закодированы, но не зашифрованы. Это ровно смысл запросов « jwt payload decoder » или « decode jwt without verify » — посмотреть, что содержит токен, не утверждая, что он подлинный.
Не путайте эти два действия. Чтение JWT ничего не доказывает: кто угодно может собрать токен с привлекательным payload и подписать его собственным секретом. Проверить — значит убедиться, что содержимое не изменено третьей стороной. Декодер, показывающий « admin: true » без проверки подписи, рассказывает историю, а не факт.
Три сегмента JWT
Строка делится ровно на три части, разделённые точками: header.payload.signature. Заголовок содержит как минимум alg и typ, иногда kid чтобы указать, какой ключ был использован. Payload содержит claims, эти пары ключ-значение, реестр которых ведёт IANA. Подпись охватывает первые два сегмента, склеенные точно так, как они записаны, — любое изменение пробела или символа ломает сравнение.
Вся сложность в том, что эти сегменты записаны в Base64URL, а не в Base64: знак плюс заменяется дефисом, косая черта — подчёркиванием, а заполнение = исчезает. Поэтому обычный декодер Base64 не справится с валидным JWT. Таблица « Base64URL против классического Base64 » во вкладке справочника показывает именно эти замены.
Как проверить подпись: HS256, RS256, ES256
Для алгоритма HMAC — HS256, HS384, HS512 — один и тот же секрет нужен и для подписи, и для проверки: инструмент пересчитывает HMAC(secret, base64url(header) + "." + base64url(payload)) и сравнивает результат с подписью из токена. Это самый распространённый и самый опасный случай: любой сервис, владеющий секретом, может выпускать токены. Секрет короче 32 байт, повторно использованный между окружениями, достаточен, чтобы скомпрометировать всю цепочку.
Для алгоритмов асимметричных — RS256, RS384, RS512, ES256, ES384, ES512, PS256 — для проверки нужен только открытый ключ, поэтому можно проверить токен от третьей стороны, ни разу не передавая секрет подписи. Вставьте ключ в формате PEM -----BEGIN PUBLIC KEY----- (SPKI); сырой результат экспорта OpenSSL можно использовать напрямую. Для ES256 подпись имеет формат r||s, который ожидает WebCrypto.
И наконец, опасайтесь alg confusion : если ваш сервис ожидает RS256, но принимает токен, в заголовке которого объявлен HS256, атакующий подпишет его открытым ключом — ставшим HMAC-ключом — и пройдёт проверку. Фиксируйте ожидаемый алгоритм на сервере и никогда не читайте его из самого токена.
exp, iat, nbf: метки времени, которые подводят
Эти три claim — это секунды Unix, без миллисекунд и без часового пояса: iat = 1516239022 означает 2018-01-17T21:30:22Z. Две ошибки повторяются постоянно: сравнение с датой в миллисекундах (значение в десять тысяч раз больше) и интерпретация timestamp в локальном часовом поясе вместо UTC. Вкладка « Срок действия » преобразует в обе стороны, показывает ISO 8601, локальную дату и оставшееся или прошедшее время — так сразу видно « уже истёкший» токен с точностью до секунды.
Продление времени жизни не повышает уровень безопасности: перенесённый exp меняет отображаемое значение, но не подпись. Если нужно перевыпустить, подпишите токен заново секретом или закрытым ключом — именно это делает вкладка « Кодировать ».
Base64URL: почему классические декодеры не справляются
Base64URL (RFC 4648 §5) использует алфавит A-Z a-z 0-9 - _ и не допускает заполнения. Payload из 20 символов часто даёт длину, не кратную четырём, после удаления = : это нормально, а не повреждение. Символы - и _ неоднозначны для человеческого глаза — это причина половины сообщаемых «сломанных токенов». Наш декодер принимает оба алфавита, смешанный регистр, необязательное заполнение и префикс Bearer.
Безопасность: чего JWT не делает
JWT не даёт ни конфиденциальности, ни отзыва. Payload читается всеми: никогда не помещайте туда e-mail, внутреннюю роль или личные данные, которые вы не согласились бы отправить открытым текстом. И подписанный токен остаётся действительным до exp даже после выхода — нужен список отзыва, jti отслеживание на сервере или короткое время жизни с refresh token. Хорошая привычка: exp короткий (10–15 минут), iat контролируемый, nbf выровненный по iat, aud и iss проверяется при получении.
Рекомендуется для
Бэкенд- и фронтенд-разработчиков (OAuth 2.0, OpenID Connect, REST API), интеграторов и DevOps (инфраструктура идентификации, JWKS, ротация ключей), тестировщиков и пентестеров (перезапись claims, alg confusion, истечение), системных администраторов (отладка непонятного 401), студентов (понять Base64URL и WebCrypto) и всех, кому нужен онлайн-декодер JWT — быстрый, полный и конфиденциальный, его дополнят кодировщик и декодировщик Base64, а также кодировщик и декодировщик URL и форматировщик JSON.