Dekodirati JSON Web Token (JWT)

dekodira vaš JWT token (JSON Web Token) i prikazuje informacije koje sadrži na čitljiv i strukturiran način

Što je JWT (JSON web token)?

JSON web token, skraćeno od JWT (izgovara se "jot"), je format kompaktan definiran prema RFC 7519 koji dopušta prijenos niza zahtjeva (potraživanja) između dviju strana. JWT, ili JWT token, danas je dominantan format za prenošenje autentificiranog identiteta u HTTP API-ju. JWT se pojavljuje kao ASCII niz sastoji se od tri segmenta odvojena točkama:

header.payload.signature

Svaki segment je kodiran u Base64URL, varijanti Base64 bez ispune = i koji zamjenjuje + s - i / s _ tako da može teći kroz URL ili HTTP zaglavlje bez dodatnog izbjegavanja.

Važno: JWT NIJE šifriran. Standardni JWT (JWS) format je jednostavno potpisan: potpis jamči integritet sadržaja, ali ne pruža nikakvu povjerljivost. Svatko može dekodirati JWT korisni teret s jednostavnim obrnutim Base64URL-om, kao što to čini ovaj online jwt decode alat.

Anatomija JWT-a

Json web token sastoji se od tri vrlo različita dijela, od kojih svaki ima određenu ulogu u mehanizmu provjere autentičnosti:

1. Zaglavlje

Zaglavlje je JSON objekt koji opisuje kako je token potpisan. Sadrži najmanje:

  • alg (algoritam): korišteni algoritam potpisa. Tipične vrijednosti: HS256, RS256, ES256, EdDSA.
  • typ (vrsta): vrsta tokena, gotovo uvijek "JWT".
  • kid (ID ključa): izborno, identificira koji ključ treba koristiti za ovjeru potpisa. Praktično uz prisutnost rotirajućeg seta ključeva (JWKS).

2. Korisni teret

Korisni teret sadrži potraživanja, to jest potraživanja koja postavlja izdavatelj o korisniku ili sesiji. RFC 7519 definira sedam standardnih zahtjeva (registriranih potraživanja):

  • iss (izdavatelj): tko je izdao token, na primjer "https://accounts.google.com".
  • sub (subject): tko je vlasnik tokena, u praksi korisnički ID.
  • aud (publika): kome je token namijenjen. Izbjegavajte token izdano za API A prihvaća API B.
  • exp (vrijeme isteka): Unix vremenska oznaka nakon koje token više ne vrijedi.
  • nbf (ne prije): vremenska oznaka ispred koje token nije još uvijek aktivan.
  • iat (izdano u): vremenska oznaka izdavanja tokena.
  • jti (JWT ID): jedinstveni identifikator tokena, koji se koristi za opoziv i sprječavanje ponavljanja.

Ovim standardnim zahtjevima općenito se dodaju prilagođeni zahtjevi specifični za aplikacija (uloge, scope, tenant_id, e-mail, dopuštenja...).

3. Potpis

Potpis je kriptografski kondenzat izračunat na base64url(zaglavlje) + "." + base64url(payload) pomoću ključa. Ona je ta koja dokazuje da nitko nije modificirao zaglavlje ili sadržaj od emitiranja. Najčešći algoritmi:

  • HS256 / HS384 / HS512: HMAC-SHA simetrični potpis. Zajednički tajni ključ između izdavatelja i verifikatora. Jednostavno, ali neprikladno kada postoji više od jednog potrošača.
  • RS256 / RS384 / RS512: asimetrični RSA potpis. Odašiljač se potpisuje svojim ključem privatni, svaki potrošač provjerava odgovarajućim javnim ključem. De facto standard za OAuth2 i OpenID Connect.
  • ES256 / ES384 / ES512: ECDSA asimetrični potpis. Ista svojstva kao RS256 ali s mnogo kraćim ključevima i potpisima.
  • EdDSA (Ed25519): moderan, brz i kompaktan asimetričan potpis.

Još jednom: potpis štiti integritet, a ne povjerljivost. The korisni teret ostaje čitljiv svakome tko posjeduje token.

Zašto dekodirati JWT?

Operacija dekodiranja tokena jwt zadovoljava nekoliko konkretnih potreba programera ili inženjer sigurnosti:

  • Authentication Debug: vaš API vraća 401 ili 403, želite vidjeti što je zapravo u korisnom teretu (sub, scope, uloge, exp) umjesto nagađanja.
  • Provjeri zahtjeve: potvrdite da token sadrži zahtjev očekivano (npr. tenant_id ili permissions) prije pretraživanja drugdje u lancu autorizacije.
  • Istek čitanja: pretvori vremensku oznaku exp u ljudski datum za potvrditi da je token istekao, ili naprotiv, da bi još uvijek trebao biti valjan.
  • Sigurnosna revizija: osiguravanje da usluga treće strane ne curi informacije osjetljivi u sadržaju (e-pošta, interni identifikatori, osobni podaci).
  • Obuka i razumijevanje: pogledajte konkretno što a jsonwebtoken koji dolazi od pružatelja OAuth (Google, Auth0, Keycloak, AWS Cognito) za razumjeti mehaniku bez poniranja u dokumentaciju.
  • Istraživanje javnih tokena: pregledajte JWT pronađen u zapisima, u kolačić ili u presretljivoj OAuth razmjeni.

Dekoder protiv verifikatora: kritična razlika

Ove dvije operacije izgledaju slične, ali nemaju nikakve veze u smislu sigurnosnih jamstava:

  • Dekodiranje JWT-a sastoji se od dijeljenja niza na . i primijenite obrnuti Base64URL na prva dva segmenta. Čita se jednostavno, nadohvat ruke bilo koje troredne skripte. Nema provjere potpisa nije učinjeno.
  • Provjera JWT-a sastoji se od ponovnog izračunavanja potpisa iz zaglavlja, korisni teret i ključ, zatim uspoređujući rezultat s potpisom prisutnim u tokenu. to je koji jamči da token nije neovlašteno mijenjan.

Praktični zaključak: dekodiranju ne vrijedi vjerovati. Sve dok potpis nije potvrđen ispravnim ključem, sadržaj korisnih podataka može biti potpuno lažan. Za fazi povjerenja, koristite naš JWT Verifier.

Kako ga koristiti

  1. Nabavite JWT za pregled, na primjer iz zaglavlja Autorizacija: nositelj , iz kolačića sesije, iz localStorage iz preglednika ili iz zapisnika aplikacije.
  2. Zalijepite cijeli niz u polje za unos. Tri segmenta moraju ostati odvojena bodova.
  3. Alat odmah prikazuje zaglavlje dekodirano u formatirani JSON, s algoritam i tip.
  4. Korisni teret se zatim dekodira i prikazuje. Tamo vidite sve tvrdnje standardni i prilagođeni.
  5. Alat također ukazuje na podatke o potpisu (deklarirani algoritam, duljina), bez provjere.
  6. Kako biste potvrdili da token nije neovlašteno mijenjan, prijeđite na naš JWT Verifier s očekivanim javnim ključem ili tajnom.

Sve se dekodiranje vrši u vašem pregledniku u JavaScriptu: vaš se token nikada ne šalje našim poslužiteljima.

JWT i sigurnost: zamke koje treba izbjegavati

NIKADA ne spremajte osjetljive podatke u sadržaj potpisanog JWT-a.

Lozinke, brojevi kreditnih kartica, medicinski podaci, API tajne, identifikatori kritične unutarnje komponente: sve u korisnom teretusvatko može pročitati posjeduje tokenuključujući i samog korisnika putem alata za razvojne programere njegov preglednik. Potpis ne prikriva ništa, on samo dokazuje da je izdavatelj doista za koga tvrdi da jest.

Nekoliko zlatnih pravila za pravilno korištenje JWT-a u proizvodnji:

  • Uvijek provjerite potpis na strani poslužitelja prije davanja bilo kakvih prava. Naš JWT Verifier ilustrira upravo ovu operaciju.
  • Dajte prednost RS256 ili ES256 umjesto HS256 za javne API-je. Potpis asimetrično izbjegava dijeljenje tajne između odašiljača i svakog potrošača.
  • Uvijek poštujte tvrdnju exp. JWT bez isteka ili s predaleko izdisanje je tempirana bomba u slučaju curenja.
  • Potvrdite iss i aud na strani poslužitelja kako biste spriječili legitimni token izdan za drugu uslugu prihvaća se greškom.
  • Odbijte alg: "none" na strani za potvrdu. Ovo je klasična mana što omogućuje napadaču krivotvoriti bilo koji korisni teret.
  • Životni vijek neka bude kratak (na primjer 15 minuta) i uparite s refresh token dulji, ali opoziv na strani poslužitelja.

Primjer dekodiranog JWT tokena

Evo tipičnog JWT-a:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoiSm9obi IsImlhdCI6MTUxNjIzOTAyMn0.jrU9j8LZcRK2_BZjqXjU7lEpJbkqmXfTQIu9vT45j-I

Nakon dekodiranja, evo njegovog sadržaja:

// Zaglavlje
{
  "alg": "HS256",
  "vrsta": "JWT"
}

// Korisni teret
{
  "pod": "123",
  "ime": "Ivan",
  "iat": 1516239022
}

// Potpis (binarno, Base64URL kodirano)
HMACSHA256(
  base64url(zaglavlje) + "." + base64url(korisni teret),
  tajna
)

Gdje pronaći JWT za kopiranje?

U praksi, JWT za dešifriranje (u smislu dekodiranja) najčešće dolazi iz jednog od ovih lokacije:

  • HTTP kolačić: otvorite razvojne alate (F12), tab Aplikacija ili Pohrana, zatim Kolačići. Uočite kolačić s nazivom access_token, jwt, session ili slično.
  • localStorage / sessionStorage: ista ploča, Odjeljak Lokalna pohrana. Mnogi SPA-ovi tamo pohranjuju svoj token pod ključem token ili auth.
  • Zaglavlje
  • Autorizacija: kartica Mreža, odaberite jednu API zahtjev, pročitajte zaglavlje Authorization: Bearer . Kopiraj samo dio iza Nositelj .
  • Zapisnici poslužitelja: JWT se ponekad pojavljuje u zapisima pristupnika ili obrnuti proxy (treba izbjegavati u proizvodnji, ali koristan u otklanjanju pogrešaka).

Često postavljana pitanja

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.

Primjer zahtjeva

curl -X POST https://cdrn.fr/api/v1/tools/jwt-decoder/execute \
  -H "Content-Type: application/json" \
  -d '{"token":"..."}'

Ulazna shema

Polje Tip Obavezno Zadano
token text

Krajnje točke

  • GET https://cdrn.fr/api/v1/tools - ispisuje sve dostupne alate
  • GET https://cdrn.fr/api/v1/tools/jwt-decoder - dohvaća shemu ovog alata
  • POST https://cdrn.fr/api/v1/tools/jwt-decoder/execute - izvršava ovaj alat s JSON payloadom