Как пользоваться
- Выберите HS256, HS384 или HS512.
- Измените утверждения payload и нажмите «Установить iat и exp», чтобы добавить текущее время и срок действия.
- Введите тестовый секрет или сгенерируйте случайный 256-битный секрет.
- Скопируйте подписанный токен. Чтобы проверить токен, переключитесь на «Проверить подпись», вставьте его и введите секрет.
Как это работает
JSON Web Token (RFC 7519) состоит из трёх частей в кодировке Base64URL: заголовка, полезной нагрузки с утверждениями и подписи. При использовании алгоритмов HMAC HS256, HS384 и HS512 подпись представляет собой HMAC с SHA-256, SHA-384 или SHA-512 по строке «header.payload», вычисленный с общим секретом. Любой, у кого есть секрет, может создавать и проверять токены.
Инструмент сериализует заголовок и полезную нагрузку в компактный JSON, кодирует их и подписывает с помощью crypto.subtle — Web Crypto API, встроенного в ваш браузер. Поле alg в заголовке всегда соответствует выбранному алгоритму, typ по умолчанию имеет значение JWT, а любые другие поля заголовка, например kid, сохраняются. Кнопка «Установить iat и exp» записывает текущее время как iat (issued at) и добавляет выбранное время жизни как exp; оба значения указаны в секундах с 1 января 1970 года по UTC. Результат совпадает с другими библиотеками JWT; например, классический образец токена с jwt.io воспроизводится точно.
Секрет может быть обычным текстом (ключом служат его байты в UTF-8) или байтами в кодировке Base64/Base64URL, которую используют многие фреймворки. Кнопка случайного секрета создаёт 32 случайных байта с помощью crypto.getRandomValues. Для HS256 используйте не менее 32 случайных байтов; короткие секреты, выбранные человеком, можно подобрать офлайн из любого токена.
Проверка декодирует токен, убеждается, что используется алгоритм HMAC, и повторно вычисляет подпись с помощью crypto.subtle.verify. Она также показывает, когда значения exp или nbf означают, что токен истёк или ещё не действует. Алгоритмы RS256, ES256 и другие алгоритмы с открытым ключом не поддерживаются, а проверка здесь не проверяет издателя, аудиторию и другие утверждения, которые могут требоваться вашему приложению.
Примеры
Локальное тестирование API
Ваш сервер разработки ожидает HS256-токены, подписанные «dev-secret-change-me». Укажите sub как тестовый идентификатор пользователя, нажмите «Установить iat и exp», выбрав 1 час, введите секрет и отправьте токен в заголовке Authorization: Bearer.
Проверка секрета, которым подписан токен
Токен staging не проходит проверку. Вставьте его в «Проверить подпись» и попробуйте секрет staging: «Подпись недействительна» означает, что токен был подписан другим секретом или секрет представлен в другом формате (текст или Base64).
Воспроизведение примера с jwt.io
С заголовком {"alg":"HS256","typ":"JWT"}, payload {"sub":"1234567890","name":"John Doe","iat":1516239022} и секретом «your-256-bit-secret» токен заканчивается на SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c — так же, как на jwt.io.
Часто задаваемые вопросы
Отправляется ли мой секрет на ваш сервер?
Нет. Подписание и проверка выполняются с помощью Web Crypto API в вашем браузере, секрет нигде не сохраняется и никуда не отправляется. Тем не менее рекомендуем использовать только тестовые секреты: настоящий секрет подписи не следует вводить ни на каком сайте.
Почему подпись недействительна, хотя секрет правильный?
Проверьте формат секрета. Некоторые системы используют текст секрета, другие сначала декодируют его из Base64 — при этом получаются разные байты ключа. Также убедитесь, что токен не изменялся и что используется тот же алгоритм.
Можно ли создавать токены RS256 или ES256?
В этом инструменте нет. Поддерживаются только алгоритмы HMAC с общим секретом: HS256, HS384 и HS512.
Зашифрован ли payload?
Нет. Подписанный JWT лишь закодирован, и любой может декодировать и прочитать payload. Подпись только доказывает, что он не был изменён. Не помещайте пароли и другие секреты в payload.
Конфиденциальность
Токены создаются и проверяются только в вашем браузере с помощью Web Crypto API. Заголовок, payload, токен и секрет не загружаются, не сохраняются и не используются в аналитике.