Как пользоваться
- Вставьте токен целиком: три части в Base64URL, разделённые точками.
- Изучите декодированные заголовок и полезную нагрузку. Утверждения exp, iat и nbf показаны в виде дат, а если срок действия токена истёк или ещё не наступил, появится предупреждение.
- Чтобы проверить подпись, введите общий секрет в поле «Секретный ключ» для HS256, HS384 или HS512 либо вставьте открытый ключ PEM в поле «Открытый ключ (PEM, SPKI)» для алгоритмов RS, PS или ES.
- Убедитесь, что утверждения об издателе, получателе и субъекте соответствуют ожиданиям вашего приложения.
Как устроен JWT
JSON Web Token (RFC 7519) состоит из трёх частей, разделённых точками: header.payload.signature. Заголовок и полезная нагрузка — это объекты JSON, закодированные в Base64URL без дополнения. Поэтому токены почти всегда начинаются с eyJ: так выглядят закодированные открывающие символы {". Подпись вычисляется по первым двум частям ровно в том виде, в каком они записаны в токене.
- Заголовок: алгоритм подписи в поле
alg, обычно"typ": "JWT"и частоkidс идентификатором ключа. - Полезная нагрузка: утверждения, например о том, кто пользователь, кто выдал токен и когда истекает срок его действия.
- Подпись: подпись HMAC, RSA или ECDSA, которая доказывает, что заголовок и полезная нагрузка не изменялись.
Токен из пяти частей — это зашифрованный JWE; его содержимое нельзя прочитать без ключа расшифровки.
Зарегистрированные утверждения
| Утверждение | Название | Значение |
|---|---|---|
iss | Издатель | Кто создал и подписал токен |
sub | Субъект | К кому относится токен, обычно идентификатор пользователя |
aud | Получатель | Сервис, для которого предназначен токен |
exp | Время истечения | После этого момента токен нужно отклонять |
nbf | Не ранее | До этого момента токен нужно отклонять |
iat | Время выдачи | Когда токен был создан |
jti | Идентификатор JWT | Уникальный идентификатор для обнаружения повторного использования |
Время задаётся значениями NumericDate: это секунды, прошедшие с 1 января 1970 года UTC, а не миллисекунды. Декодер показывает их в виде понятных дат и сравнивает с часами вашего устройства.
Декодирование — это не проверка
Декодировать JWT может кто угодно, потому что полезная нагрузка только закодирована, а не зашифрована; никогда не помещайте в неё пароли и другие секреты. Доверять токену можно только после проверки подписи правильным ключом, а сервер, принимающий токены, также должен:
- разрешать только ожидаемый алгоритм и отклонять
"alg": "none"— так обозначается неподписанный токен; - никогда не позволять заголовку токена выбирать между HMAC и RSA, иначе злоумышленник сможет подписать поддельный токен вашим открытым ключом, использовав его как секрет HMAC;
- проверять
exp,nbf,issиaudпри каждом запросе.
Необязательная проверка на этой странице использует встроенный в браузер Web Crypto API. Декодирование и проверка выполняются на вашем устройстве, и ничего никуда не загружается. И общее правило: никогда не вставляйте рабочие ключи подписи и действующие токены на сайты, которым вы не доверяете.
Часто задаваемые вопросы
Безопасно ли вставлять JWT в этот декодер?
Токен декодируется и проверяется кодом JavaScript в вашем браузере и никогда не отправляется на сервер. Помните, что действующий токен работает как пароль для любого, у кого он окажется, поэтому, если вы делитесь скриншотами или логами, используйте тестовые или просроченные токены.
Можно ли декодировать JWT без секретного ключа?
Да. Заголовок и полезная нагрузка — это обычный JSON в кодировке Base64URL, поэтому их можно прочитать без всякого ключа. Секретный или открытый ключ нужен только для проверки подписи.
Почему декодер сообщает, что срок действия моего токена истёк?
exp уже прошло по часам вашего устройства. Если токен должен быть ещё действителен, проверьте системные часы и срок жизни токена, настроенный издателем.Какие алгоритмы подписи можно проверить?
HS256, HS384 и HS512 с общим секретным ключом, а также RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384 и ES512 с открытым ключом в формате PEM.
Что означает "alg": "none"?
Так обозначается незащищённый JWT с пустой подписью, описанный в RFC 7518. Создать или изменить такой токен может кто угодно, поэтому сервер, ожидающий подписанные токены, всегда должен его отклонять.