JWT Decoder
Декодирование и инспекция JSON Web Token
JWT-токен
Что такое JWT (JSON Web Token)?
JSON Web Token (JWT) — это компактный формат токена, безопасный для URL, определённый в RFC 7519. Он кодирует набор claims как объект JSON, затем подписывает — и при необходимости шифрует — его, чтобы получатель мог убедиться в том, что данные не были изменены. JWT являются де-факто стандартом для безгражданской аутентификации в REST API, системах единого входа и авторизации микросервисов.
Структура JWT: Header · Payload · Подпись
Каждый JWT состоит из трёх сегментов в кодировке base64url, разделённых точками. Header и payload — это обычный JSON, доступный для чтения любому, тогда как подпись — это криптографическое значение, которое можно проверить только с помощью правильного ключа.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkFsaWNlIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzE3MjAwMDAwLCJleHAiOjE3MTcyMDM2MDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "user123",
"name": "Alice",
"role": "admin",
"iat": 1717200000,
"exp": 1717203600
}Зачем использовать декодер JWT?
Необработанные JWT выглядят как случайный текст. Этот инструмент мгновенно отображает header и payload в виде отформатированного JSON, чтобы можно было инспектировать claims, проверять сроки действия и анализировать выбор алгоритмов без написания единой строки кода.
Справочник стандартных claims JWT
RFC 7519 определяет семь зарегистрированных имён claims. Они не являются обязательными, но их использование настоятельно рекомендуется для совместимости. Вы можете добавлять любые пользовательские claims в payload.
| Claim | Описание | Тип |
|---|---|---|
| iss | Издатель — Идентифицирует того, кто выдал токен — например, URL вашего сервера аутентификации или название приложения. | string |
| sub | Субъект — Идентифицирует субъект, которому посвящён JWT — как правило, ID пользователя или сервисная учётная запись. | string |
| aud | Аудитория — Идентифицирует предполагаемых получателей. Принимающая сторона должна проверить, что это соответствует её идентификатору. | string | string[] |
| exp | Время истечения — Unix-временная метка, после которой токен не должен приниматься. Всегда устанавливайте её, чтобы ограничить ущерб от украденного токена. | number |
| nbf | Не раньше — Unix-временная метка, до которой токен не должен приниматься. Полезно для планирования токенов с будущей датой. | number |
| iat | Выдан в — Unix-временная метка, когда был выдан токен. Используется для вычисления возраста токена. | number |
| jti | JWT ID — Уникальный идентификатор токена. Позволяет реализовать отзыв, сохраняя и проверяя использованные значения JTI на стороне сервера. | string |
Алгоритмы подписи JWT
Claim header alg объявляет, каким алгоритмом подписан токен. Выбор влияет на безопасность, производительность и возможность сторонних сервисов проверять токены без закрытого ключа.
| Алгоритм | Семейство | Тип ключа | Примечания |
|---|---|---|---|
| HS256 | HMAC | Symmetric | Самый распространённый. Общий секрет — любой, у кого есть секрет, может подписывать и проверять. |
| HS384 | HMAC | Symmetric | Более надёжный вариант HMAC; умеренная нагрузка на производительность. |
| HS512 | HMAC | Symmetric | Самый надёжный вариант HMAC. |
| RS256 | RSA | Asymmetric | Наиболее используемый асимметричный алгоритм (Google, Auth0, Okta). Публичный ключ проверяет без закрытого. |
| RS384 | RSA | Asymmetric | Вариант RS с повышенной безопасностью. |
| RS512 | RSA | Asymmetric | Самый надёжный вариант RS. |
| ES256 | ECDSA | Asymmetric | Эллиптическая кривая — подписи короче, чем у RSA; популярен на мобильных устройствах и в IoT. |
| PS256 | RSA-PSS | Asymmetric | RSA-PSS: более современный и безопасный, чем RS256 на основе PKCS1v1.5. |
| none | — | — | Без подписи — критически опасно. Никогда не принимайте токены с alg: none в production. |
Соображения безопасности
Декодирование JWT всегда безопасно. Доверие JWT без надлежащей проверки подписи — нет. Помните об этих правилах при работе с токенами в вашем приложении.
- –Декодировать и инспектировать JWT в инструментах разработчика или этом инструменте
- –Использовать exp, iat и nbf для понимания времени жизни токена
- –Записывать claims payload для отладки (опускать конфиденциальные PII)
- –Читать header alg, чтобы понять, как был подписан токен
- –Доверять claims в payload без проверки подписи на стороне сервера
- –Принимать токены с alg: none — это означает полное отсутствие подписи
- –Хранить токены доступа в localStorage в высокозащищённых приложениях (предпочтительнее cookies httpOnly)
- –Устанавливать exp далеко в будущем для токенов с конфиденциальными правами доступа
Распространённые случаи использования
Декодирование JWT в коде
Header и payload закодированы в base64url — просто обратите кодирование. Base64url заменяет + на - и / на _, и опускает набивку =. Только подпись требует секретного ключа.
function decodeJWT(token) {
const [, payload] = token.split('.')
const json = atob(payload.replace(/-/g, '+').replace(/_/g, '/'))
return JSON.parse(json)
}const [, payload] = token.split('.')
const decoded = JSON.parse(
Buffer.from(payload, 'base64url').toString()
)import base64, json
def decode_jwt(token):
payload = token.split('.')[1]
padding = '=' * (-len(payload) % 4)
return json.loads(base64.urlsafe_b64decode(payload + padding))TOKEN="eyJhbGc..." echo $TOKEN | cut -d. -f2 | base64 -d 2>/dev/null | jq .