JSON Web Token (JWT)
JSON Web Token (JWT): een compacte, ondertekende manier om claims zoals identiteit of sessiegegevens tussen systemen te dragen, gedefinieerd in IETF RFC 7519.
Een JSON Web Token (JWT) is een compacte, URL-veilige manier om een reeks claims - beweringen over een gebruiker, een sessie of een apparaat - te verpakken als een JSON-object, zodat ze als een enkele string tussen systemen kunnen reizen. Het is gedefinieerd door de IETF in RFC 7519, gepubliceerd in mei 2015, en bijgewerkt door RFC 8725, "JSON Web Token Best Current Practices", die beveiligingsrichtlijnen toevoegt, waaronder de hieronder beschreven valkuil van algoritmeverwarring.
Een JWT wordt meestal verpakt in een JSON Web Signature (JWS)-structuur, die de claims ondertekent zodat een ontvanger kan controleren dat ze niet zijn gewijzigd. Wanneer de claims vertrouwelijk moeten blijven in plaats van alleen manipulatiebestendig, kan de JWT in plaats daarvan worden verpakt in JSON Web Encryption (JWE), die ze versleutelt zodat alleen de beoogde ontvanger ze kan lezen.
RFC 7519 definieert een klein aantal geregistreerde claimnamen die in vrijwel elke JWT terugkeren, waaronder onder meer:
- iss (issuer): wie het token heeft aangemaakt en uitgegeven
- sub (subject): over wie of wat het token gaat
- aud (audience): voor wie het token is bedoeld
- exp (expiration time): het moment waarna het token moet worden geweigerd
- iat (issued at): wanneer het token is aangemaakt
RFC 7519 registreert ook enkele aanvullende claims voor fijnere controle, zoals nbf (not before), die de geldigheid van een token uitstelt tot een vastgesteld moment, en jti (JWT ID), een unieke identifier waarmee hergebruik (replay) kan worden gedetecteerd.
Dit mechanisme zit achter het ID-token in OpenID Connect (OIDC) en achter veel OAuth 2.0-accesstokens, en het is ook het bouwblok dat SD-JWT uitbreidt om een wallethouder slechts een deel van de claims te laten tonen.
Let op: een gewone JWT is ondertekend, niet versleuteld. Wie hem onderschept kan de header en payload decoderen en de claims volledig lezen - base64url is een omkeerbare codering, geen geheimhouding. Alleen de JWE-variant verbergt de inhoud; een JWT met alleen een signature beschermt de integriteit, niet de vertrouwelijkheid. Een verwante valkuil is algoritmeverwarring: omdat de header het ondertekeningsalgoritme vermeldt, kan een verifier die deze waarde klakkeloos vertrouwt worden verleid een token te accepteren dat is ondertekend met 'none' of geverifieerd met het verkeerde sleuteltype. RFC 8725, "JSON Web Token Best Current Practices", pakt dit direct aan: een verifier moet het verwachte algoritme zelf vastleggen in plaats van het uit het token te lezen.