Как декодировать и проверять JWT-токены
JSON Web Tokens (JWT) — это самый распространённый способ управления аутентификацией в современных веб-приложениях. Когда что-то идёт не так с auth — пользователь отключается без причины, права неправильные или API возвращает 401 — декодирование JWT часто является первым шагом отладки.
Что содержит JWT
JWT имеет три части, разделённые точками:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
Заголовок — содержит алгоритм (HS256, RS256 и т. д.) и тип токена.
{"alg": "HS256", "typ": "JWT"}
Полезная нагрузка — содержит заявления (утверждения) о пользователе и токене.
{"sub": "1234567890", "name": "Alice", "exp": 1700000000}
Подпись — криптографический отпечаток, гарантирующий, что токен не был изменён. Вы не можете прочитать её без ключа подписи.
Распространённые JWT-заявления
| Заявление | Полное имя | Содержимое |
|---|---|---|
sub |
Subject | ID или идентификатор пользователя |
exp |
Expiration | Unix-timestamp окончания действия |
iat |
Issued At | Unix-timestamp создания |
iss |
Issuer | Кто создал токен (ваш auth-сервер) |
aud |
Audience | Кому предназначен токен |
nbf |
Not Before | Токен не действителен до этой даты |
jti |
JWT ID | Уникальный идентификатор токена |
Как декодировать JWT
- Вставьте ваш токен — введите полный JWT (формат заголовок.нагрузка.подпись) в декодер.
- Просмотрите декодированные секции — инструмент отображает заголовок (алгоритм), полезную нагрузку (заявления) и подпись в виде отформатированного JSON.
- Проверьте заявления — изучите дату истечения, эмитента, субъекта и любые пользовательские заявления.
Отладка с JWT
Истёкший токен? Проверьте заявление exp. Конвертируйте Unix-timestamp в читаемую дату. Если она прошла, токен истёк и должен быть обновлён.
Неправильные права? Ищите заявления роли или области в полезной нагрузке. Они различаются по реализациям, но часто похожи на "role": "admin" или "scope": "read write".
Проблема с идентичностью пользователя? Заявление sub идентифицирует пользователя. Проверьте, что оно соответствует ожидаемому ID.
Токен отклонён? Проверьте заявление aud (audience). Если API ожидает определённую аудиторию, а у токена другая, он будет отклонён.
Важные заметки безопасности
- JWT не зашифрованы — любой может декодировать полезную нагрузку. Не помещайте пароли, API-ключи или другие секреты в JWT.
- Всегда проверяйте подписи на стороне сервера — декодер показывает вам, что заявляет токен, но только проверка подписи доказывает, что он не был изменён.
- Проверяйте истечение — истёкшие токены всегда должны отклоняться. Если ваше приложение принимает истёкшие токены, это уязвимость безопасности.
Часто задаваемые вопросы
Можно ли проверить подпись JWT с помощью декодера?
Нет. Проверка подписи требует секрет подписи или открытый ключ, хранящиеся на вашем сервере. Декодер показывает вам, что в токене, но криптографическая проверка должна происходить на вашем бэкенде. Никогда не доверяйте непроверенному JWT в продакшене.
Безопасно ли вставлять JWT в онлайн-инструмент?
Да, когда инструмент работает в вашем браузере. Браузерные декодеры обрабатывают токен локально — ничего не отправляется на сервер. Избегайте инструментов, которые делают сетевые запросы с вашим токеном.
Что такое заявление exp?
Заявление exp (expiration) — это Unix-timestamp, указывающий, когда токен истекает. После этой даты токен должен быть отклонён. Всегда проверяйте это заявление для отладки проблем аутентификации.
Могут ли JWT быть зашифрованы?
Стандартные JWT (JWS) подписаны, но не зашифрованы — любой может декодировать полезную нагрузку. Токены JWE (JSON Web Encryption) зашифрованы, но менее распространены. Никогда не помещайте конфиденциальные данные (пароли, секреты) в стандартную полезную нагрузку JWT.