Генератор JWT
Соберите JWT с sub, name, iat, exp и своими claims и подпишите по HS256 через Web Crypto в браузере. Токен из трёх частей и проверка в декодере.
Зачем генерировать JWT вручную
Генератор JWT нужен тогда, когда надо быстро получить настоящий подписанный токен для тестов: проверить, как фронтенд разбирает exp, подсунуть тестовой авторизации свой sub и role, разобрать на практике, из чего состоит JSON Web Token. Токен собирается по RFC 7519: заголовок и полезная нагрузка кодируются в base64url, к ним применяется подпись HMAC-SHA-256 по вашему секрету, и три части склеиваются точками. Всё считается в браузере через Web Crypto, без серверной части. Для учёбы это самый короткий путь: вы меняете один claim — и сразу видите, как меняется подпись.
Что умеет генератор
- Собирает payload из полей sub, name, iat и exp с автозаполнением дат в секундах Unix
- Принимает произвольные claims вида ключ–значение, числа остаются числами
- Подписывает токен алгоритмом HS256 через Web Crypto, без внешних библиотек
- Показывает готовый токен и каждую из трёх частей отдельно, с копированием в один клик
- Прячет секрет под маской и предупреждает, что браузерная подпись годится только для тестов
Как получить токен
- Заполните sub, name и даты: кнопки подставят iat со временем сейчас и exp на час вперёд
- Добавьте свои claims при необходимости, например role или user_id
- Введите секретный ключ и нажмите «Подписать токен»
- Скопируйте готовую строку из трёх частей и проверьте её в декодере
Как строится подпись
Токен состоит из трёх частей, разделённых точками. Первая часть — заголовок, для HS256 это фиксированный JSON с полями alg и typ, и в base64url он всегда выглядит одинаково. Вторая — payload, то есть ваш набор claims в формате JSON. Каждая часть кодируется в base64url: вариант base64, где плюс заменён на дефис, слэш на подчёркивание, а паддинг убран, чтобы токен спокойно жил в заголовке Authorization. Третья часть — подпись: над строкой «первая часть.вторая часть» считается HMAC-SHA-256 с вашим секретом. Ключ импортируется через crypto.subtle.importKey, подпись снимается crypto.subtle.sign, и всё это происходит в вашем браузере.
Claims, которые чаще всего попадают в payload
| Claim | Пример значения | Что означает |
|---|---|---|
| sub | "user-42" | идентификатор субъекта, о ком этот токен |
| name | "Иван" | человеческое имя, публичный claim без специального смысла |
| iat | 1735689600 | issued at: момент выпуска в секундах Unix |
| exp | 1735693200 | expiration: после этого момента токен недействителен |
| iss | "auth.example.com" | кто выпустил токен |
| aud | "api.example.com" | для какой аудитории предназначен |
| role | "admin" | произвольный claim приложения, сервер трактует сам |
| jti | "a1b2c3" | уникальный идентификатор токена, полезен для отзыва |
| nbf | 1735689600 | not before: токен недействителен раньше этого момента |
| "ivan@example.com" | тоже публичный claim, читается всеми без секрета |
Первые шесть claims из списка — зарегистрированные в RFC 7519, остальные встречаются как публичные или приватные соглашения между вашими сервисами.
Где подписанный токен нужен прямо сейчас
Тестирование авторизации — первая сцена. Фронтенд-разработчик проверяет, как приложение ведёт себя при истёкшем exp: ставишь exp на минуту вперёд, ждёшь, смотришь, появился ли экран повторного входа. Бэкенд-разработчик принимает токен от фронтенда и хочет удостовериться, что middleware правильно отклоняет токен с подделанной подписью: генерируешь корректный токен, потом меняешь в нём букву, и оба случая разложены по полочкам. QA готовит набор фикстур: валидный токен, просроченный, токен без роли, токен с чужим sub — всё это занимает минуты.
Вторая сцена — учёба и разбор. На настоящем примере видно, как payload превращается в строку, как меняется подпись от изменения одного символа, почему сервер не примет токен с правленным claim. Студент или джун, собравший токен руками, больше не путает подпись с шифрованием и понимает, почему пароль никогда не кладут в payload. Полное устройство формата с картинкой-схемой разобрано в статье JWT: что внутри токена — она хорошо дополняет практику на этом генераторе.
- Фикстуры для автотестов: валидный, просроченный и подделанный токены
- Проверка обработки exp на фронтенде и middleware на бэкенде
- Отладка роли и sub в авторизации без запуска сервера аутентификации
- Учебные задания по формату JWT и подписи HMAC
- Демо и документация: показать команде настоящий токен, а не мок
Типичные ошибки при генерации токенов
Первая ошибка — использовать настоящий продакшен-секрет в браузерной форме. Даже если страница не отправляет данные по сети, секрет остаётся в истории ввода браузера и в памяти расширений, а привычка вводить его в сторонние формы опасна сама по себе. Для генератора годится тестовый секрет вроде строки из двенадцати случайных символов, а настоящие ключи держат на сервере и на генератор не тратят.
Вторая ошибка — перепутать секунды и миллисекунды в iat и exp. Стандарт требует секунды; если передать миллисекунды, число окажется в далёком будущем, и токен с формально правильным exp будет жить несколько столетий. Третья — забыть, что payload читается всеми: пароли, номера карт и персональные данные туда не кладут, даже если токен подписан. И четвёртая — считать, что подпись HS256 защищает содержимое от чтения: она защищает только от изменения.
- Настоящий секрет не вводят в браузерные генераторы, только тестовый
- iat и exp в секундах Unix, без миллисекунд
- Payload не шифруется: секретных данных в нём быть не должно
- Подпись гарантирует неизменность, но не тайну содержимого
- Слишком долгий exp делает отзыв доступа невозможным
- Изменённый даже на один символ payload меняет всю подпись
Разбор примера: токен на трёх частях
Возьмём минимальный payload: sub равен user-1, name равен Иван, iat и exp заполнены кнопками. Заголовок HS256 фиксирован, поэтому его base64url всегда одинаковый. Payload после упаковки получится длиной около сотни символов — кириллица в JSON уходит в UTF-8, поэтому Иван занимает больше байтов, чем латиница. Подпись считается над строкой «заголовок.payload» с вашим секретом и превращается в 43 символа base64url. Склеенные точками части и есть готовый токен длиной в пару сотен символов, который удобно копировать целиком.
Дальше полезно посмотреть на токен глазами декодера: он покажет те же самые claims и подпись отдельно. Если поменять в payload одну букву и переподписать — подпись изменится вся, потому что HMAC размазывает изменение по всем 32 байтам. Если поменять букву и НЕ переподписать — сервер отклонит токен на проверке подписи. В таблице ниже — что куда входит.
Из чего складывается готовый токен
| Часть | Что содержит | Как получается |
|---|---|---|
| header | alg HS256 и typ JWT | фиксированный JSON в base64url, выглядит как eyJhbGciOiJI... |
| payload | ваши claims: sub, name, iat, exp и свои | JSON кодируется в base64url |
| signature | 32 байта двоичных данных | HMAC-SHA-256 над header.payload с секретом |
| разделитель | точка между частями | части склеиваются в одну строку |
| кодирование | base64url вместо base64 | плюс меняется на дефис, слэш на подчёркивание |
| длина | около 200 символов для такого payload | зависит от числа и размера claims |
| передача | заголовок Authorization | Bearer и токен без переносов строк |
| проверка | сервер пересчитывает подпись | совпала — токен подлинный, не совпала — отклонён |
Ни одна из трёх частей не содержит секрета: секрет нужен только в момент подписи и в момент проверки, в сам токен он не попадает.
Что почитать и чем дополнить генератор
Генератор и декодер образуют пару: один собирает токен, другой разбирает. После того как токен готов, загляните в декодер JWT и сверьте claims. Чтобы понять, какая математика стоит за подписью, откройте генератор HMAC — там видно, как сообщение и ключ превращаются в 32 байта подписи, и есть проверочные векторы. Секреты для настоящих систем делают случайными строками: для этого подходит генератор паролей, а требования к длине и энтропии разобраны в статье о надёжном пароле.
Для глубокого погружения в формат остаётся текст стандарта: RFC 7519 описывает JWT, а RFC 7515 — способ подписи JWS, который здесь и используется. В учебных материалах сайта формат разобран по частям в статье JWT: что внутри токена, а упаковка base64url — в разборе Base64 простыми словами. Связка этих четырёх текстов покрывает и практику, и теорию: собрал, разобрал, понял подпись, понял упаковку.
- Генератор и декодер дополняют друг друга: собрал — проверь
- HMAC-генератор показывает математику подписи на проверяемых векторах
- Настоящие секреты генерируют случайными строками и хранят на сервере
- RFC 7519 описывает claims, RFC 7515 — саму подпись
- Для нескольких сервисов с разными ключами смотрят в сторону RS256
Частые вопросы
Из чего состоит JWT
Почему токен подписан, но не зашифрован
Что такое iat и exp и в каком они формате
Что делает алгоритм HS256
Чем HS256 отличается от RS256
Можно ли доверять токену, сгенерированному в браузере
Как проверить токен, который я здесь получил
Зачем нужен base64url вместо обычного base64
Полезные статьи
HMAC-подпись API-запроса: зачем она и как её считать
Зачем подписывать API-запросы и вебхуки, как устроен HMAC простыми словами, почему подпись не шифрование, безопасное сравнение подписей, JWT HS256 и пошаговый расчёт HMAC-SHA-256 с проверенным примером.
HS256 и RS256: какую подпись JWT выбрать
Чем HS256 отличается от RS256, кому хватает одного секрета, когда нужна пара ключей RSA, размеры подписей и скорость, атака alg confusion и фиксация алгоритма, проверка токена обоими способами на реальном примере.
Похожие инструменты
Кодирование / Декодирование Base64
Кодируйте текст в Base64 или декодируйте строки Base64 с поддержкой Unicode
URL-кодирование / Декодирование
Кодируйте и декодируйте URL-адреса с полным или компонентным режимом
Определение кодировки
Определите кодировку текста или файла онлайн: UTF-8, UTF-16, ASCII, Windows-1251, KOI8-R. Уверенность определения, разбор байтов и превью «как выглядит текст» в разных кодировках
Кодирование / Декодирование HTML-сущностей
Кодируйте и декодируйте HTML-сущности вроде < > & "
Декодер JWT-токенов
Декодируйте JWT-токены для просмотра заголовка, полезной нагрузки и подписи
Шифр ROT13
Кодируйте или декодируйте текст с помощью шифра подстановки ROT13
Переводчик азбуки Морзе
Конвертируйте текст в азбуку Морзе и обратно с визуальным представлением и звуком
Двоичный переводчик
Конвертируйте текст в двоичный код (0 и 1) и обратно с побайтовым разбором