Декодиране на JSON Web Token (JWT)
- Табло
- Документация
- API
Какво е JWT (JSON уеб токен)?
JSON уеб токен, съкратен до JWT (произнася се "джот"), е формат компактен, дефиниран от RFC 7519, позволяващ транспортирането на поредица от искове (искове) между две страни. JWT, или JWT токен, е доминиращият формат днес за предаване на удостоверена самоличност в HTTP API. JWT се появява като ASCII низ съставен от три сегмента, разделени с точки:
header.payload.signature
Всеки сегмент е кодиран в Base64URL, вариант на Base64 без подплата
= и който замества + с - и / с _
така че да може да преминава през URL или HTTP заглавка без допълнително екраниране.
Важно: JWT НЕ е шифрован. Стандартният JWT (JWS) формат е просто подписан: подписът гарантира целостта на съдържанието, но не осигурява никаква конфиденциалност. Всеки може да декодира JWT полезен товар с прост обратен Base64URL, както прави този онлайн инструмент за jwt декодиране.
Анатомия на JWT
json web token се състои от три много различни части, всяка от които играе специфична роля в механизма за удостоверяване:
1. Заглавка
Заглавката е JSON обект, който описва как е подписан токенът. Съдържа поне:
alg(алгоритъм): използваният алгоритъм за подпис. Типични стойности:HS256,RS256,ES256,EdDSA.typ(тип): типът на токена, почти винаги"JWT".kid(идентификатор на ключ): по избор, идентифицира кой ключ трябва да се използва за проверка на подписа. Практично при наличие на въртящ се комплект ключове (JWKS).
2. Полезен товар
Полезният товар съдържа претенциите, т.е. претенциите, които емитентът прави относно потребителя или сесията. RFC 7519 дефинира седем стандартни претенции (регистрирани искове):
iss(издател): кой е издал токена, например„https://accounts.google.com“.sub(тема): кой притежава токена на практика потребителското име.aud(аудитория): за кого е предназначен токенът. Избягвайте токен издаден за API A се приема от API B.exp(време на изтичане): Unix клеймо за време, след което токенът вече не е валиден.nbf(не преди): клеймо за време, пред което не е маркерът все още активен.iat(издадено на): клеймо за издаване на токен.jti(JWT ID): уникален идентификатор на токена, използван за отмяна и предотвратяване на повторение.
Към тези стандартни искове обикновено се добавят персонализирани искове, специфични за
приложението (роли, обхват, tenant_id, имейл,
разрешения...).
3. Подпис
Подписът е криптографски кондензат, изчислен върху
base64url(header) + "." + base64url(полезен товар) с помощта на ключ. Тя е тази, която доказва
че никой не е променил заглавката или полезния товар след излъчването. Най-често срещаните алгоритми:
- HS256 / HS384 / HS512: HMAC-SHA симетричен подпис. Споделен таен ключ между емитента и верификатора. Просто, но неподходящо, когато има повече от един потребител.
- RS256 / RS384 / RS512: асиметричен RSA подпис. Предавателят се подписва с ключа си частен, всеки потребител проверява със съответния публичен ключ. Де факто стандарт за OAuth2 и OpenID Connect.
- ES256 / ES384 / ES512: ECDSA асиметричен подпис. Същите свойства като RS256, но с много по-къси ключове и подписи.
- EdDSA (Ed25519): модерен, бърз и компактен асиметричен подпис.
Още веднъж: подписът защитава целостта, а не поверителността. The полезният товар остава четим от всеки, който притежава токена.
Защо да декодирам JWT?
Операцията декодиране на токен jwt отговаря на няколко конкретни нужди на разработчика или инженер по безопасност:
- Отстраняване на грешка при удостоверяване: вашият API връща 401 или 403, искате да видите
какво всъщност е в полезния товар (
sub,scope,роли,exp), а не гадаене. - Проверка на искове: потвърдете, че токенът съдържа искането
очаквано (напр.
tenant_idилиpermissions) преди търсене другаде във веригата за оторизация. - Изтичане на срока на четене: преобразувайте клеймото
expв човешка дата за потвърдите, че токенът е изтекъл или напротив, че трябва да е все още валиден. - Одит на сигурността: гарантиране, че услуга на трета страна няма да изтече информация чувствителни в полезния товар (имейли, вътрешни идентификатори, лични данни).
- Обучение и разбиране: вижте конкретно какво a jsonwebtoken, идващ от доставчик на OAuth (Google, Auth0, Keycloak, AWS Cognito) за разберете механиката, без да се гмуркате в документите.
- Изследване на публични токени: проверете JWT, намерен в регистрационни файлове, в бисквитка или в прихванат OAuth обмен.
Декодер срещу верификатор: критичното разграничение
Двете операции изглеждат подобни, но нямат нищо общо по отношение на гаранциите за сигурност:
- Декодирането на JWT се състои от разделяне на низа на
.и приложете обратен Base64URL към първите два сегмента. Това е лесно четиво, достъпно на всеки триредов скрипт. Без проверка на подпис не е направено. - Проверката на JWT се състои от преизчисляване на подписа от заглавката, полезен товар и ключ, след което сравнява резултата с присъстващия в токена подпис. това е което гарантира, че токенът не е бил манипулиран.
Практически извод: декодирането не заслужава доверие. Стига подписа не е проверен с правилния ключ, съдържанието на полезния товар може да е напълно фалшиво. За фаза на доверие, използвайте нашия JWT Verifier.
Как да го използвате
- Вземете JWT за проверка, например от заглавка
Упълномощаване: Носител, от бисквитка на сесия, отlocalStorageот браузъра или от регистрационен файл на приложение. - Поставете пълния низ в полето за въвеждане. Трите сегмента трябва да останат разделени с точки.
- Инструментът веднага показва заглавката, декодирана във форматиран JSON, с алгоритъма и типа.
- След това полезният товар се декодира и показва. Виждате всички искове там стандартни и персонализирани.
- Инструментът също така посочва сигнатурната информация (деклариран алгоритъм, дължина), без да го проверявате.
- За да потвърдите, че токенът не е бил манипулиран, преминете към нашия JWT Verifier с очаквания публичен ключ или тайна.
Цялото декодиране се извършва във вашия браузър в JavaScript: вашият токен никога не се изпраща към нашите сървъри.
JWT и сигурност: капани, които трябва да се избягват
НИКОГА не съхранявайте чувствителни данни в полезния товар на подписан JWT.
Пароли, номера на кредитни карти, медицински данни, API тайни, идентификатори критични вътрешни елементи: всичко в полезния товар ечетимо от всеки притежава токенавключително самия потребител чрез инструментите за разработчици на неговия браузър. Подписът не прикрива нищо, той само доказва, че издателят е наистина за когото се представя.
Няколко златни правила за правилно използване на JWT в производството:
- Винаги проверявайте подписа от страната на сървъра преди да предоставите каквито и да е права. Нашият JWT Verifier илюстрира точно тази операция.
- Предпочитайте RS256 или ES256 пред HS256 за публични API. Подписът asymmetric избягва споделянето на тайна между предавателя и всеки потребител.
- Винаги уважавайте твърдението
exp. JWT без изтичане или с твърде далечното издишване е бомба със закъснител в случай на изтичане. - Потвърдете
issиaudот страна на сървъра, за да предотвратите легитимен токен, издаден за друга услуга, се приема по погрешка. - Отказване на
alg: "none"от страната за проверка. Това е класически недостатък което позволява на нападателя да фалшифицира всякакъв полезен товар. - Поддържайте продължителността на живота кратка (15 минути например) и сдвоявайте с refresh token е по-дълъг, но може да бъде отменен от страната на сървъра.
Пример за декодиран JWT токен
Ето типичен JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoiSm9obi IsImlhdCI6MTUxNjIzOTAyMn0.jrU9j8LZcRK2_BZjqXjU7lEpJbkqmXfTQIu9vT45j-I
След декодиране, ето съдържанието му:
// Заглавка
{
"alg": "HS256",
"тип": "JWT"
}
// Полезен товар
{
"под": "123",
"име": "Джон",
"iat": 1516239022
}
// Подпис (двоичен, Base64URL кодиран)
HMACSHA256(
base64url(заглавка) + "." + base64url(полезен товар),
тайна
)
Къде да намеря JWT за копиране?
На практика JWT за декриптиране (в смисъл на декодиране) най-често идва от един от тези местоположения:
- HTTP Cookie: отворете инструментите за разработка (F12), раздел
Приложение или Съхранение, след това Бисквитки. Намерете бисквитка с име
access_token,jwt,sessionили подобни. localStorage/sessionStorage: същия панел, Раздел Локално хранилище. Много SPA съхраняват своя токен там под ключtokenилиauth.Упълномощаванезаглавка: раздел Мрежа, изберете един API заявка, прочетете заглавкатаAuthorization: Bearer. Копирайте само част следНосител.- Сървърни регистрационни файлове: JWT понякога се появява в регистрационните файлове на шлюз или обратен прокси (да се избягва при производство, но полезен при отстраняване на грешки).
Често задавани въпроси
Le JWT est-il chiffré ou en clair ?
Un JWT signé (format JWS) est seulement encodé en Base64URL, pas chiffré. Toute personne qui intercepte un token peut lire le payload en quelques secondes. Si vous devez transporter des données vraiment confidentielles dans le token, il faut utiliser le format JWE (JSON Web Encryption), qui ajoute une couche de chiffrement par-dessus la signature. En pratique, le JWE reste rare : on préfère ne pas mettre de données sensibles dans un jeton et conserver les informations critiques en base côté serveur.
Comment révoquer un JWT avant son expiration ?
C'est l'un des points faibles du JWT : par construction, le serveur n'a pas besoin de stocker
l'état du token, donc il ne sait pas non plus comment le marquer comme révoqué. Trois approches
existent. Liste de révocation : maintenir côté serveur la liste des
jti invalidés, et la consulter à chaque requête. Durées de vie courtes :
émettre des access tokens valides 5 à 15 minutes, et utiliser un refresh token révocable côté
serveur pour en générer de nouveaux. Rotation de clé de signature : invalider
toute une génération de tokens en changeant la clé. La deuxième approche est de loin la plus
répandue.
Quelle différence entre un JWT et une session classique ?
Une session classique stocke un identifiant opaque côté client (généralement dans un cookie) et conserve toutes les données associées (utilisateur, droits, expiration) en mémoire ou en base côté serveur. Un JWT, au contraire, transporte directement ces données dans le token signé. Avantage du JWT : le serveur n'a pas besoin de stocker de session, ce qui simplifie le scaling horizontal et l'architecture microservices. Inconvénients : la révocation est plus complexe, le token est plus volumineux à chaque requête, et la moindre fuite expose le payload.
Différence entre JWT, JWS et JWE ?
JWT (RFC 7519) est un format de jeton générique. Il peut être implémenté de deux manières concrètes : JWS (RFC 7515, JSON Web Signature) qui se contente de signer le payload, et JWE (RFC 7516, JSON Web Encryption) qui le chiffre. En pratique, quand on parle de "JWT" sans précision, on parle presque toujours d'un JWS : un token signé mais lisible par tous. Le JWE est utilisé dans les contextes où la confidentialité du payload est indispensable, par exemple dans certains scénarios OpenID Connect avancés.
Mon JWT n'est pas accepté par l'API, pourquoi ?
Les causes classiques sont, par ordre de fréquence : token expiré (vérifiez
le claim exp), signature invalide (clé secrète ou clé publique
ne correspond pas à celle utilisée par l'émetteur), mauvais aud
(le token a été émis pour un autre service), mauvais iss
(l'émetteur déclaré n'est pas celui attendu), algorithme refusé (l'API exige
par exemple RS256 et reçoit un HS256), horloges désynchronisées entre
l'émetteur et le vérificateur (joue sur exp et nbf). Décoder le
token avec cet outil permet déjà d'éliminer la moitié des hypothèses en lisant directement les
claims.
Comment générer un JWT ?
La plupart des langages disposent d'une bibliothèque dédiée : jsonwebtoken en
Node.js, PyJWT en Python, lcobucci/jwt ou
firebase/php-jwt en PHP, jjwt en Java, golang-jwt/jwt
en Go. Toutes prennent en entrée un objet payload, une clé et un algorithme, et retournent la
chaîne header.payload.signature prête à être envoyée. Il est fortement déconseillé
d'implémenter la génération à la main : la cryptographie comporte trop de pièges (comparaisons
non constantes, gestion incorrecte de alg: none, etc.).
Le decoder accepte-t-il un JWT expiré ?
Oui. Le decoder se contente d'afficher le contenu du token sans porter de jugement sur sa
validité temporelle. Il n'évalue ni exp, ni nbf, ni la signature.
C'est utile pour comprendre pourquoi un token a été rejeté par une API : on peut
comparer la valeur de exp à l'heure actuelle pour confirmer qu'il est bien
expiré.
Mon JWT est-il valide si le decoder l'affiche correctement ?
Non. L'affichage prouve uniquement que la chaîne est bien formée (trois segments séparés par des points, encodage Base64URL correct, JSON valide dans le header et le payload). Cela ne dit rien de l'authenticité du token. Un JWT entièrement falsifié peut s'afficher sans erreur dans un decoder, c'est précisément pour cela qu'on doit le passer à un verifier.
Пример за заявка
curl -X POST https://cdrn.fr/api/v1/tools/jwt-decoder/execute \
-H "Content-Type: application/json" \
-d '{"token":"..."}'
Входна схема
| Поле | Тип | Задължително | По подразбиране |
|---|---|---|---|
token |
text | ✓ | – |
Крайни точки
GET https://cdrn.fr/api/v1/tools- изброява всички достъпни инструментиGET https://cdrn.fr/api/v1/tools/jwt-decoder- извлича схемата на този инструментPOST https://cdrn.fr/api/v1/tools/jwt-decoder/execute- изпълнява този инструмент с JSON payload