Wat zijn JSON Web Token?

JSON Web Token (JWT) is een open standaard voor het maken van een zogeheten “access token” die toegang biedt tot een webapplicatie. Deze token bevat een “payload” waar de identiteit van de gebruiker staat opgeslagen.

Bij elke aanvraag zal deze “access token” worden meegezonden om zo de identiteit van de gebruiker te kunnen vaststellen. Het voordeel hiervan is dat er geen andere partij benodigd is om de identiteit vast te stellen of deze “access tokens” centraal hoeft worden bijgehouden. Dit komt doordat de “payload” wordt ondertekend met een privesleutel van de server (“Message Authentication Code: MAC”) en kan zo worden geverifieerd op de juiste inhoud.

Gesigneerde “access tokens” worden gecontroleerd op basis van de integriteit. Bij een aanpassing van de “payload” zal de integerheid van de token worden beschadigd. Hierdoor kunnen de beveiligingstoewijzing juist bij de gebruiker komen te liggen en hoeft dus niet centraal worden opgeslagen.

Hoe zien deze JWT eruit?

Een JSON Web Token bestaat uit drie onderdelen gescheiden door een punt en worden gecodeerd in een “Base64” encryptie. De onderdelen bestaan uit een:

  • Header
  • Payload
  • Signature

Een voorbeeld hoe een token eruit kan zien:

bG9sOnNlY3VyZQ.eyJzdWIiOiIxMjM.MeKKF2QT4fwpMeJ

Header

Het eerste deel van de token is de “Header” die bestaat uit twee onderdelen, het type van de token en de gebruikte encryptie. In her voorbeeld hieronder wordt er gebruik gemaakt van een “HMAC met SHA-256” encryptie.

{   
   "alg": "HS256",   
   "typ": "JWT" 
}

Payload

De tweede gedeelte van een JWT is gewoon een Javascript-object. Hieronder een voorbeeld van een geldig payload-object:

{   
   "sub": "j_doe@outlook.com",   
   "name": "John Doe",   
   "admin": true,   
   "iat": 1516239022 
}

In dit geval bevat de “payload” identificatie informatie over een bepaalde gebruiker, maar in het algemeen kan de payload ook iets anders zijn, zoals bijvoorbeeld informatie over een bankoverschrijving.

De inhoud zijn zogeheten “Claims”, dit zijn uitspraken over een entiteit (normaal de gebruiker) en aanvullende gegevens. Er zijn verschillende soorten claims die vaak zijn vast gelegd in een norm maar er kunnen ook zelf verzonnen “Claims” worden gebruikt.

Sommige van de “Claims” hebben direct te maken met de integriteit zoals:

  • iss (issuer) – Wie heeft de token uitgegeven.
  • exp (expiration time) – Hoe lang is de token geldig.
  • sub (subject) – Voor wie is deze token.
  • aud (audience) – Voor welke doelen is de token geschikt.

Er zijn geen beperkingen aan de inhoud van de payload, maar het is belangrijk om te weten dat een JWT niet is gecodeerd. Dus alle informatie die de “payload” bevat is nog steeds leesbaar voor eenieder die de token onderschept.

Signature

Het laatste deel van de token bevat de digitale ondertekening. De “Header” en “Payload” worden door een private sleutel ondertekend. In het voorbeeld hieronder wordt er gebruik gemaakt van een “HMAC met SHA256” encryptie.

HMACSHA256(
      base64UrlEncode(header) + "." + base64UrlEncode(payload), secret 
)

De handtekening wordt gebruikt om te verifiëren dat het bericht onderweg niet is gewijzigd. Tevens kan er ook worden afzender van de JWT worden geverifieerd. Hieronder een voorbeeld van een complete JWT.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c