Створити підписаний JSON Web Token (JWT)
- Панель керування
- Документація
- API
Що таке JWT Builder?
JWT Builder — онлайн-інструмент, що виробляє підписаний JSON Web Token (JWT) з payload JSON і HMAC-секрету. Він призначений для розробників, яким потрібно швидко згенерувати тестовий токен для перевірки поведінки API, симулювання автентифікованої сесії в Postman або відтворення помилки, пов'язаної з терміном дії або областю токена.
На відміну від нашого JWT decoder, який лише зчитує наявний токен, JWT Builder створює повний токен: будує заголовок, кодує payload, обчислює HMAC-підпис і збирає все у компактний формат header.payload.signature, очікуваний усіма JWT-бібліотеками ринку.
Навіщо генерувати JWT?
JWT builder не призначений для емісії виробничих токенів. Це насамперед інструмент розробки та тестування. Ось найпоширеніші сценарії:
- Інтеграційне тестування: генерувати передбачувані JWT для керування E2E-тестами, що звертаються до захищених ендпоінтів без залежності від справжнього провайдера ідентифікаційних даних.
- Моки API: тимчасово замінити дзвінок до IdP JWT-токеном, підписаним локально з тим самим тестовим секретом.
- Локальна розробка: підключитися до власного бекенда, вручну генеруючи токен з потрібними claims, без проходження всього OAuth2 flow.
- Демонстрації: проілюструвати процес автентифікації або workflow на основі дозволів без реального IdP під рукою.
- Відтворення помилок: підробляти прострочений токен, токен з неправильним
aud, токен без певних claims, щоб тестувати шляхи помилок вашого API. - Налагодження кастомного парсера: впроваджувати спеціально побудовані JWT для тестування власного JWT-парсера.
Склад JWT
Підписаний JWT складається з трьох сегментів, розділених крапками, кожен закодований у Base64URL (варіант Base64 без padding та з -/_ замість +//):
- Header: JSON-об'єкт, що описує алгоритм підпису і тип токена, наприклад
{"alg":"HS256","typ":"JWT"}. JWT Builder генерує його автоматично на основі вибраного алгоритму. - Payload: довільний JSON-об'єкт, що містить claims токена (суб'єкт, дозволи, дати закінчення терміну дії). Це частина, яку ви надаєте.
- Signature: HMAC-SHA, обчислений на конкатенації
base64url(header) + "." + base64url(payload)з вашим секретним ключем. Саме він гарантує цілісність токена.
Детальні випадки використання
- API mock для E2E тестів: ваш набір Cypress або Playwright має викликати API, що вимагає
Authorization: Bearer .... Замість повної організації входу для кожного тесту, підписуємо JWT на льоту зі спільним секретом і впроваджуємо його в заголовок. - Демонстрація SSO: представлення процесу федеративної автентифікації без залежності від онлайн-IdP.
- Тестові fixture: генерувати детермінований JWT з відомого payload для використання як стабільна fixture в юніт-тестах.
- Діагностика кастомного парсера: тестувати власний JWT-парсер зі спеціально мінімальними або навмисно незвичайними токенами (відсутні claims, несподівані типи).
- Навчання: конкретно зрозуміти, як будується JWT, змінюючи payload і спостерігаючи, як змінюється підпис.
Підтримувані алгоритми: HS256, HS384, HS512
Наш інструмент підтримує три стандартні алгоритми HMAC специфікації JWT (RFC 7519):
- HS256: HMAC з SHA-256. Підпис 32 байти. Найпоширеніший на практиці, хороший компроміс між швидкістю та криптографічною надійністю. Рекомендовано за замовчуванням.
- HS384: HMAC з SHA-384. Підпис 48 байт. Підходить для контекстів, що вимагають більшого запасу безпеки.
- HS512: HMAC з SHA-512. Підпис 64 байти. Найнадійніший, за рахунок дещо більшого токена.
HMAC чи RSA?
Алгоритми HS* є симетричними: той самий ключ служить для підпису та перевірки. Це просто і швидко, але означає, що будь-який сервіс, здатний перевірити токен, також здатний його емітувати. Якщо вам потрібно розділити ці дві ролі (один емітент, кілька споживачів), зверніться до алгоритмів RS256/RS384/RS512 (RSA, асиметричних), які можна перевірити за допомогою нашого JWT verifier.
Безпека: захищайте ваш секрет
Безпека JWT, підписаного HMAC, повністю залежить від конфіденційності секрету. Кілька основних правил:
- Використовуйте довгий і випадковий секрет. RFC 7518 рекомендує мінімум розмір виводу алгоритму (32 байти для HS256, 48 для HS384, 64 для HS512). Людський пароль, як
azerty123, тривіально піддається атаці перебором в офлайн-режимі. - Ніколи не підписуйте JWT на стороні клієнта. Секрет опиниться в JavaScript-коді, розповсюдженому браузеру, і буде доступний будь-якому користувачу. Підпис завжди повинен залишатися на стороні сервера.
- Зберігайте секрет у змінній середовища (напр.
JWT_SECRET), ніколи в Git-репозиторії. Розгляньте використання сховищ, як HashiCorp Vault, AWS Secrets Manager або Symfony Secrets залежно від вашого стека. - Регулярно ротуйте секрет (key rotation), особливо після будь-якого інциденту або після звільнення особи, що мала доступ до конфігурації.
- JWT Builder призначений для тестування та навчання. Для виробництва використовуйте JWT-бібліотеку вашого фреймворка (lcobucci/jwt, firebase/php-jwt, jose-php).
Найкращі практики claims
Payload є вільним JSON-об'єктом, але RFC 7519 визначає набір registered claims, які JWT-бібліотеки вміють інтерпретувати. Включення правильних claims робить ваш токен портативним і уникає тонких помилок:
- iss (issuer): ідентифікатор емітента, наприклад
"https://api.example.com". - sub (subject): ідентифікатор особи або суті, зазвичай ID користувача.
- aud (audience): кому призначений токен, щоб запобігти повторному використанню токена в іншому API.
- exp (expiration time): Unix-timestamp, після якого токен більше не дійсний. Завжди включайте, навіть для тестового токена: токен без терміну дії є поганою звичкою, яку важко потім виправити.
- nbf (not before): Unix-timestamp, до якого токен ще не дійсний. Корисний для попередньої емісії токена, який стане активним пізніше.
- iat (issued at): Unix-timestamp емісії, корисний для журналювання та відкликання.
- jti (JWT ID): унікальний ідентифікатор токена, необхідний для ідемпотентності та реалізації списку відкликань.
Приклад типового payload
{
"iss": "https://api.example.com",
"sub": "user-12345",
"aud": "mobile-app",
"iat": 1714723200,
"exp": 1714726800,
"jti": "9f2d6b1e-2c4a-4f8a-9c3a-87a2b8a4b7e1",
"scope": "read:profile write:profile"
}
Як користуватися інструментом
- Введіть payload у вигляді валідного JSON. Це об'єкт, тому починається з
{і закінчується}. - Вкажіть HMAC-секрет. Виберіть довгу випадкову рядок для виробничих токенів.
- Виберіть алгоритм: HS256 за замовчуванням, HS384 або HS512 залежно від ваших потреб.
- Натисніть створити. Підписаний JWT з'являється, готовий до вставки в заголовок
Authorization: Bearer .... - Потім можете перевірити токен з тим самим секретом для підтвердження правильності round-trip, або декодувати його для повторного перегляду вмісту.
Часті запитання
Який алгоритм вибрати: HS256, HS384, HS512?
Для переважної більшості випадків HS256 є правильним вибором. Він пропонує цілком достатній рівень безпеки для автентифікаційних токенів, з компактним підписом (32 байти) і швидким обчисленням. HS384 і HS512 виправдані лише в конкретних регуляторних контекстах або якщо ви керуєте токенами з дуже тривалим терміном дії. Більший розмір підпису обтяжує кожен HTTP-запит.
Як згенерувати пару RSA для підпису JWT?
Через OpenSSL двома командами: openssl genrsa -out private.pem 2048 для приватного ключа, потім openssl rsa -in private.pem -pubout -out public.pem для витягу публічного ключа. Для нових сервісів сьогодні рекомендуються ключі 3072 або 4096 біт. Приватний ключ залишається на стороні емітента; публічний ключ вільно розповсюджується сервісам, що мають перевіряти токени.
Який рекомендований термін дії?
Для access token: 5-15 хвилин. Для refresh token: від кількох днів до кількох тижнів, але з механізмом відкликання на стороні сервера. Чим довше живе токен, тим більше вікно для використання у разі витоку. Для тестових JWT можна взяти більш щедрий термін, але уникайте exp на кілька років: вони в кінцевому рахунку просочуються в Git-репозиторії.
Чи можна підписувати з дуже коротким секретним ключем?
Технічно так, але це настійно не рекомендується. HMAC-секрет менше 16 байт слабко стійкий до офлайн-атак перебором, і в природі існують інструменти, що зламують JWT HS256 зі слабким секретом за кілька секунд. RFC 7518 рекомендує мінімум розмір виводу алгоритму: 32 байти для HS256, 48 для HS384, 64 для HS512. Генеруйте секрети через openssl rand -base64 64.
Чому мій payload відхиляється?
Payload має бути валідним JSON-об'єктом. Поширені помилки: одинарні лапки замість подвійних, зайва кома перед }, значення без лапок для рядка. Спочатку перевірте JSON за допомогою нашого форматера JSON.
Чи може хтось інший розшифрувати згенерований JWT?
Підписаний JWT не зашифрований: payload просто закодований у Base64URL. Будь-хто може його прочитати. Якщо payload містить конфіденційні дані, використовуйте формат JWE (JSON Web Encryption), який додає шифрування. Наш інструмент виробляє JWS (лише підписаний).
Приклад запиту
curl -X POST https://cdrn.fr/api/v1/tools/jwt-builder/execute \
-H "Content-Type: application/json" \
-d '{"payload":"...","secret":"...","algorithm":"HS256"}'
Схема вхідних даних
| Поле | Тип | Обов'язкове | За замовчуванням |
|---|---|---|---|
payload |
text | ✓ | – |
secret |
text | ✓ | – |
algorithm |
choice (HS256, HS384, HS512) | ✓ | HS256 |
Точки доступу
GET https://cdrn.fr/api/v1/tools- перелічує всі доступні інструментиGET https://cdrn.fr/api/v1/tools/jwt-builder- отримує схему цього інструментуPOST https://cdrn.fr/api/v1/tools/jwt-builder/execute- виконує цей інструмент з JSON-payload