Sobes.tech
Junior

Wat is JWT (JSON Web Token)?

sobes.tech AI

Antwoord van AI

JSON Web Token (JWT) is een compacte, veilige manier om gegevens tussen partijen over te dragen in JSON-formaat.

Werking principes:

  • Het token bestaat uit drie delen, gescheiden door punten (.): header.payload.signature.

  • Header (Koptekst): Bevat metadata over het token, zoals het type token (JWT) en de gebruikte ondertekeningsalgoritme (bijvoorbeeld HS256, RS256).

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Payload (Lading): Bevat "claims" - beweringen of informatie die we willen overdragen. Er zijn verschillende types:

    • Geregistreerde claims: Gereserveerde, maar optionele claims zoals iss (uitgever), exp (verlooptijd), sub (onderwerp).
    • Publieke claims: Voor algemeen gebruik, moeten geregistreerd zijn in de IANA JSON Web Token Registry of URI's bevatten met een beschermde naamruimte tegen conflicten.
    • Privé claims: Arbitrary beweringen overeengekomen tussen partijen.
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • Handtekening (Signature): Gemaakt door de gecodeerde header en payload te combineren met een geheim en het algoritme dat in de header is gespecificeerd. Dit garandeert de integriteit van het token; als iemand de header of payload wijzigt, wordt de handtekening ongeldig.

    # Voorbeeld van het maken van een handtekening met HS256
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Header)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Payload)
    secret = 'your_secret_key'
    
    # Handtekening = HMACSHA256(Base64Url(Header) + "." + Base64Url(Payload), secret)
    signature = hmac.new(
        secret.encode('utf-8'),
        (header_str + '.' + payload_str).encode('utf-8'),
        hashlib.sha256
    ).digest()
    
    # Codering van de handtekening in Base64Url
    import base64
    signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii')
    
    # Eindtoken: header_str + '.' + payload_str + '.' + signature_b64url
    

Toepassingen:

  • Authenticatie: De server geeft het token uit aan de gebruiker na succesvolle authenticatie. De gebruiker stuurt dit token bij elke aanvraag. De server controleert de geldigheid van het token en verleent toegang tot bronnen.
  • Gegevensuitwisseling: Veilige overdracht van kleine hoeveelheden gegevens tussen verschillende services.

Voordelen:

  • Compact: Minder gegevens om te verzenden in vergelijking met XML.
  • Zelfvoorzienend: Het token bevat al de benodigde informatie over de gebruiker, wat de noodzaak vermindert om bij elke aanvraag de database te raadplegen.
  • Stateloos: De server hoeft geen sessie-informatie op te slaan.
  • Cryptografische handtekening: Zorgt voor de integriteit van de gegevens.

Nadelen:

  • Het token kan niet worden ingetrokken: Eenmaal uitgegeven, blijft het token geldig tot het verloopt, tenzij een mechanisme voor zwarte lijsten wordt geïmplementeerd.
  • Opslag van het geheim: De geheime sleutel moet veilig worden opgeslagen.
  • Grootte: Met toenemende gegevens in payload neemt de grootte van het token ook toe.