§

Plak je JWT

Het parsen en de handtekeningverificatie gebeuren beide lokaal. Niets over het token wordt naar een server verzonden.
§

Header

json
§

Payload

json
§

Handtekening verifiëren

Voer een secret in om de handtekening te verifiëren.

JWT's vormen de ruggengraat van vrijwel elke Nederlandse identiteitsflow: DigiD en eHerkenning leveren ID-tokens via Logius' OIDC-implementatie, MijnOverheid stapelt aanvullende claims voor BSN-koppeling onder strikte AVG-controle, en bedrijfsapps van Bunq, ASR Verzekeringen en NS gebruiken JWT's voor sessiebeheer in hun mobiele clients. PSD2-tokens van Rabobank, ING en KBC volgen het FAPI-profiel met sterke clientauthenticatie. Voor Belgische teams gelden CSAM-OIDC- en eHealth-tokens. Plak je token in deze decoder om header, payload en signing-algoritme lokaal te inspecteren: er gaat niets naar een server, wat cruciaal is wanneer Autoriteit Persoonsgegevens-conforme review eist dat persoonsgegevens uit de payload jouw werkstation niet verlaten. Verifieer HS256-handtekeningen met je geheim om snel een mismatch te diagnosticeren.

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:

  1. Splits het token op de punten in precies drie niet-lege segmenten. Elke andere vorm is misvormd.
  2. Decodeer segment 0 en 1 met base64url en voer vervolgens JSON.parse op elk uit. De header bevat het algoritme (alg) en het tokentype (typ). De payload bevat de claims (sub, exp, iat, aangepaste sleutels).
  3. 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.
  4. 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- of sendBeacon-aanroepen. Open DevTools tijdens het decoderen en verifiëren — het Netwerk-paneel blijft stil.
  • Native Web Crypto: HMAC-verificatie gebruikt crypto.subtle.importKey en crypto.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.