Zo gebruik je het
- Plak het volledige token: drie Base64URL-delen, gescheiden door punten.
- 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.
- 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.
- 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 eenkiddie 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
| Claim | Naam | Betekenis |
|---|---|---|
iss | Issuer (uitgever) | Wie het token heeft gemaakt en ondertekend |
sub | Subject (onderwerp) | Over wie het token gaat, meestal een gebruikers-ID |
aud | Audience (doelgroep) | De dienst waarvoor het token bedoeld is |
exp | Expiration time (vervaltijd) | Na dit moment moet het token worden geweigerd |
nbf | Not before (geldig vanaf) | Vóór dit moment moet het token worden geweigerd |
iat | Issued at (uitgegeven op) | Wanneer het token is gemaakt |
jti | JWT-ID | Unieke 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,issenaudcontroleren.
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?
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.