Wat is een JWT? Uitleg over JSON Web Tokens

Home Woordenlijst Wat is een JWT? Uitleg over JSON Web Tokens

Een JWT (JSON Web Token, vaak uitgesproken als "jot") is een compact, digitaal ondertekend token om informatie veilig tussen systemen door te geven. Een JWT bevat claims, zoals wie de gebruiker is, welke rechten die heeft en wanneer het token verloopt, en een handtekening waarmee het ontvangende systeem controleert dat het token door een vertrouwde partij is uitgegeven en niet is aangepast. JWT's zijn vastgelegd in RFC 7519 en worden veel gebruikt voor API-authenticatie, single sign-on en als ID-token bij OAuth en OpenID Connect.

Hoe ziet een JWT eruit?

Een JWT bestaat uit drie Base64URL-gecodeerde delen, gescheiden door punten: header.payload.signature.

  • Header: het type token en het ondertekeningsalgoritme, zoals HS256 of RS256.
  • Payload: de claims. Standaardclaims zijn onder meer iss (uitgever), sub (onderwerp, meestal het gebruikers-ID), aud (doelgroep), exp (vervaltijd) en iat (uitgiftetijd), aangevuld met eigen claims zoals rollen.
  • Signature: berekend over header en payload met een geheime sleutel (HMAC) of een privésleutel (RSA of ECDSA).

Hoe wordt een JWT gebruikt?

  1. De gebruiker logt in en de authenticatieserver geeft een ondertekend JWT uit.
  2. De client stuurt het token mee met elk API-verzoek, meestal in de header Authorization: Bearer <token>.
  3. De API controleert de handtekening, de vervaltijd, de uitgever en de doelgroep, en leest gebruiker en rechten uit de claims, zonder databaseopzoeking.

Omdat de API het token zelf kan controleren, passen JWT's goed bij stateless API's en microservices: elke service kan het token controleren met de publieke sleutel, die de uitgever vaak publiceert via een JWKS-endpoint zodat sleutels kunnen worden vervangen.

Valkuilen voor de beveiliging

  • Ondertekend is niet versleuteld: iedereen kan de payload decoderen en lezen. Zet er nooit wachtwoorden of gevoelige persoonsgegevens in. Voor versleutelde tokens bestaat JWE.
  • Altijd volledig valideren: controleer de handtekening met een expliciet toegestaan algoritme (nooit none), en controleer exp, iss en aud.
  • Intrekken is lastig: een JWT blijft geldig tot het verloopt. Houd access tokens kortlevend en gebruik refresh tokens, of houd voor noodgevallen een blokkadelijst bij.
  • Opslag in de browser: tokens in localStorage kunnen via XSS worden gestolen; HttpOnly-cookies zijn voor webapps vaak veiliger.

Zie onze API ontwikkeling, REST API ontwikkeling en wat is authenticatie.

Veelgestelde vragen over JWT

Wat is het verschil tussen een JWT en een sessiecookie?

Bij een sessie bewaart de server de inlogstatus en bevat de cookie alleen een sessie-ID. Een JWT bevat de informatie zelf, zodat de server niets hoeft op te slaan. Sessies zijn makkelijker in te trekken; JWT's schalen makkelijker over meerdere services.

Is een JWT veilig?

Een JWT is veilig als het met een sterke sleutel is ondertekend, volledig wordt gevalideerd, kort geldig is, alleen via HTTPS wordt verstuurd en geen gevoelige gegevens bevat. De meeste kwetsbaarheden rond JWT komen door onvolledige validatie.

Wat is het verschil tussen HS256 en RS256?

HS256 gebruikt één gedeeld geheim voor ondertekenen en controleren, waardoor elke controleur ook tokens kan maken. RS256 ondertekent met een privésleutel en controleert met een publieke sleutel. Dat is veiliger wanneer meerdere services tokens moeten controleren.

Hoe lang moet een JWT geldig zijn?

Access tokens meestal enkele minuten tot een uur. Langere sessies worden geregeld met refresh tokens, die wel kunnen worden ingetrokken.