JWT-decoder

Plak een JSON Web Token om de header en payload als opgemaakte JSON te zien, de tijden exp, iat en nbf als datums, en of het token verlopen is. Handtekeningen kun je lokaal verifiëren met een geheime sleutel of een publieke sleutel.

Header

Payload

Claims

Handtekening

Handtekening verifiëren

Werkt volledig in je browser. Er wordt niets geüpload.

Zo gebruik je het

  1. Plak het volledige token: drie Base64URL-delen, gescheiden door punten.
  2. Lees de gedecodeerde header en payload. De claims exp, iat en nbf worden als datums getoond, met een waarschuwing als het token verlopen of nog niet geldig is.
  3. Om de handtekening te verifiëren, voer je de gedeelde geheime sleutel in voor HS256, HS384 of HS512, of plak je de publieke sleutel in PEM-formaat voor RS-, PS- of ES-algoritmen.
  4. Controleer of de claims voor uitgever, doelgroep en onderwerp overeenkomen met wat je applicatie verwacht.

Zo is een JWT opgebouwd

Een JSON Web Token (RFC 7519) bestaat uit drie delen, gescheiden door punten: header.payload.signature. De header en payload zijn JSON-objecten, gecodeerd als Base64URL zonder opvulling. Daarom beginnen tokens bijna altijd met eyJ, de gecodeerde vorm van een openend {". De handtekening wordt berekend over de eerste twee delen, precies zoals ze in het token staan.

  • Header: het ondertekeningsalgoritme in alg, meestal "typ": "JWT" en vaak een kid die de sleutel aanduidt.
  • Payload: de claims, zoals wie de gebruiker is, wie het token heeft uitgegeven en wanneer het verloopt.
  • Handtekening: een HMAC-, RSA- of ECDSA-handtekening die bewijst dat header en payload niet zijn gewijzigd.

Een token met vijf delen is een versleutelde JWE; de inhoud is zonder de ontsleutelingssleutel niet te lezen.

Geregistreerde claims

ClaimNaamBetekenis
issIssuer (uitgever)Wie het token heeft gemaakt en ondertekend
subSubject (onderwerp)Over wie het token gaat, meestal een gebruikers-ID
audAudience (doelgroep)De dienst waarvoor het token bedoeld is
expExpiration time (vervaltijd)Na dit moment moet het token worden geweigerd
nbfNot before (geldig vanaf)Vóór dit moment moet het token worden geweigerd
iatIssued at (uitgegeven op)Wanneer het token is gemaakt
jtiJWT-IDUnieke identificatie, gebruikt om replay-aanvallen te herkennen

Tijden zijn NumericDate-waarden: seconden sinds 1 januari 1970 UTC, geen milliseconden. De decoder toont ze als leesbare datums en vergelijkt ze met de klok van je apparaat.

Decoderen is niet hetzelfde als verifiëren

Iedereen kan een JWT decoderen, want de payload is alleen gecodeerd, niet versleuteld; zet er dus nooit wachtwoorden of andere geheimen in. Vertrouwen ontstaat pas als je de handtekening controleert met de juiste sleutel, en een server die tokens accepteert, moet daarnaast:

  • alleen het verwachte algoritme toestaan en "alg": "none" weigeren, waarmee een niet-ondertekend token wordt aangeduid;
  • de tokenheader nooit laten kiezen tussen HMAC en RSA, want anders kan een aanvaller een vervalst token ondertekenen met je publieke sleutel als HMAC-geheim;
  • bij elk verzoek exp, nbf, iss en aud controleren.

De optionele verificatie op deze pagina gebruikt de Web Crypto API die in je browser is ingebouwd. Decoderen en verifiëren gebeuren op je apparaat en er wordt niets geüpload. Plak als algemene regel nooit ondertekeningssleutels uit productie of actieve tokens in websites die je niet vertrouwt.

Veelgestelde vragen

Is het veilig om een JWT in deze decoder te plakken?

Het token wordt door JavaScript in je browser gedecodeerd en geverifieerd en nooit naar een server verzonden. Houd er wel rekening mee dat een token dat nog niet verlopen is, werkt als een wachtwoord voor iedereen die het in handen heeft. Gebruik dus liever test- of verlopen tokens als je screenshots of logs deelt.

Kan ik een JWT decoderen zonder de geheime sleutel?

Ja. De header en payload zijn gewoon Base64URL-gecodeerde JSON en zijn dus zonder sleutel leesbaar. De geheime of publieke sleutel heb je alleen nodig om de handtekening te verifiëren.

Waarom zegt de decoder dat mijn token verlopen is?
De claim exp ligt vóór de huidige tijd op je apparaat. Als het token nog geldig zou moeten zijn, controleer dan je systeemklok en de geldigheidsduur die de uitgever voor tokens heeft ingesteld.
Welke handtekeningalgoritmen kunnen worden geverifieerd?

HS256, HS384 en HS512 met een gedeelde geheime sleutel, en RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384 en ES512 met een publieke sleutel in PEM-formaat.

Wat betekent "alg": "none"?

Het duidt een onbeveiligde JWT met een lege handtekening aan, zoals gedefinieerd in RFC 7518. Iedereen kan zo'n token maken of wijzigen, dus een server die ondertekende tokens verwacht, moet het altijd weigeren.