Wat is een JSON Web Token?
Een JSON Web Token (JWT) is een compacte, URL-veilige envelop voor een kleine claims-payload. Het is het standaard credential-formaat voor stateless websessies, OAuth/OIDC ID-tokens, machine-tot-machine API-authenticatie en ondertekende magic links. Een JWT bestaat altijd uit drie base64url-segmenten verbonden door punten: header.payload.signature. De header en payload zijn JSON; de handtekening is een binaire MAC of digitale handtekening over de eerste twee segmenten.
Hoe werken JWT’s?
Wanneer deze tool een token decodeert, volgt hij hetzelfde driestappenpad dat elke JWT-bibliotheek volgt:
- Splits het token op de punten in precies drie niet-lege segmenten. Elke andere vorm is misvormd.
- Decodeer segment 0 en 1 met base64url en voer vervolgens
JSON.parseop elk uit. De header bevat het algoritme (alg) en het tokentype (typ). De payload bevat de claims (sub,exp,iat, aangepaste sleutels). - Als er een secret is opgegeven, herberekent hij de MAC over
<segment0>.<segment1>met het algoritme uit de header. Vergelijk de bytes met het derde segment. - Toon het verificatieresultaat naast de gedecodeerde claims, inclusief een voor mensen leesbare vervalindicator berekend op basis van de
exp-claim.
Waarom JWT’s in de browser decoderen?
Een echte, actief gebruikte JWT in een externe debugger plakken lekt het credential naar de logs en observability-stack van die dienst en naar elke partner waarmee die dienst gegevens deelt. Zelfs wanneer de site van een derde claimt geen tokens te loggen, heb je geen manier om dat te verifiëren. Deze tool is gebouwd zodat je dat compromis nooit hoeft te sluiten:
- Nul netwerk: de runtime bevat geen
fetch-,XMLHttpRequest- ofsendBeacon-aanroepen. Open DevTools tijdens het decoderen en verifiëren — het Netwerk-paneel blijft stil. - Native Web Crypto: HMAC-verificatie gebruikt
crypto.subtle.importKeyencrypto.subtle.sign, dezelfde primitieven die je runtime zou aanroepen. - Statische deploy: elke pagina is één statisch HTML-bestand zonder server-endpoint dat gecompromitteerd kan worden. Er valt geen token te lekken, want er is geen server om het naar te lekken.
Wat verifieert deze tool, en wat niet?
Versie 1 van deze tool verifieert alleen handtekeningen uit de HMAC-SHA-familie. Concreet:
- Ondersteund: HS256, HS384, HS512. Geef het gedeelde secret op en de tool herberekent en vergelijkt de MAC.
- Nog niet ondersteund: RS256/384/512 (RSA), ES256/384/512 (ECDSA), EdDSA en PS256/384/512 (RSA-PSS). Deze vereisen een publieke sleutel in PEM- of JWK-vorm en zijn bewust uitgesteld naar een volgende release.
- Geweigerd:
alg: "none". De tool decodeert het token wel, maar markeert het expliciet als onveilig — er vindt geen handtekeningvalidatie plaats, en elk productiesysteem dat zo'n token accepteert heeft een ernstige kwetsbaarheid.
Hoe ziet een voorbeeld van JWT-decodering eruit?
Plak het canonieke voorbeeldtoken uit RFC 7519 in het invoerveld hierboven:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
De header decodeert tot {"alg":"HS256","typ":"JWT"} en de payload tot {"sub":"1234567890","name":"John Doe","iat":1516239022}. Voer your-256-bit-secret in het verifieerpaneel in en de handtekeningcontrole geeft geldig terug. Verander één teken van het secret en hij geeft ongeldig terug. Niets hiervan verlaat je browser.
Dit is de JWT-decoder waarvan we wilden dat hij bestond toen we een token in productie moesten debuggen: privacyvriendelijk, snel en gebouwd op dezelfde primitieven die de runtime gebruikt.