JWT-tokenstructuur uitgelegd: Header, Payload en Signature
JWT-tokenstructuur uitgelegd
Elke JSON Web Token (JWT) is een compacte, URL-veilige tekenreeks die claims tussen twee partijen overdraagt. Het begrijpen van de interne structuur is essentieel voor elke ontwikkelaar die met tokengebaseerde beveiliging werkt.
De drie delen van een JWT
Een JWT bestaat uit drie delen die van elkaar worden gescheiden door punten (.):
header.payload.signature
Voorbeeld:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Elk deel is met base64url gecodeerde JSON. Een JWT wordt ondertekend, niet versleuteld — iedereen kan de inhoud decoderen en lezen.
Deel 1: De header
De header bevat metadata over het token — het ondertekeningsalgoritme en het tokentype.
| Veld | Beschrijving | Voorbeeldwaarden |
|-------|-------------|----------------|
| alg | Ondertekeningsalgoritme (vereist) | HS256, RS256, ES256 |
| typ | Tokentype (optioneel) | JWT |
| kid | Sleutel-ID (optioneel) | "key-1" |
{
"alg": "HS256",
"typ": "JWT"
}
Het veld alg vertelt de verificateur welk algoritme de handtekening heeft gemaakt. Een mismatch van algoritmen — of het accepteren van alg: "none" — is een veelvoorkomende JWT-beveiligingskwetsbaarheid.
Deel 2: De payload
De payload bevat claims over de gebruiker en metadata. Claims vallen in drie categorieën:
Geregistreerde claims
| Claim | Volledige naam | Doel |
|-------|-----------|---------|
| iss | Issuer (uitgever) | Wie het token heeft uitgegeven |
| sub | Subject (onderwerp) | Identificeert de gebruiker |
| aud | Audience (doelgroep) | Bedoelde ontvanger |
| exp | Expiration (verloop) | Tijdstempel van het verlopen van het token |
| nbf | Not Before (niet vóór) | Token is vóór dit tijdstip niet geldig |
| iat | Issued At (uitgegeven op) | Tijdstempel van het aanmaken van het token |
| jti | JWT ID | Unieke tokenidentificatie |
Voorbeeld van een gedecodeerde payload
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622,
"iss": "https://auth.example.com"
}
Publieke claims zijn gedefinieerd in het IANA-register of gebruiken botsingsresistente URI's. Private claims zijn aangepaste claims waarover de uitgever en de consument afspraken hebben gemaakt.
Deel 3: De signature
De signature wordt gemaakt door de gecodeerde header, de gecodeerde payload en een geheime sleutel te combineren met behulp van het algoritme uit de header. Deze dient twee doelen:
- Integriteit — bevestigt dat het token niet is gewijzigd na ondertekening.
- Authenticatie — bewijst dat het token is ondertekend door de verwachte partij.
Aanmaken van een HS256-signature
HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
Aanmaken van een RS256-signature
RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Base64url versus standaard Base64
| Aspect | Standaard Base64 | Base64url |
|--------|-----------------|-----------|
| Teken 62 | + | - |
| Teken 63 | / | _ |
| Opvulling | = | Weggelaten |
Deze codering zorgt ervoor dat JWTs veilig zijn voor HTTP-headers, queryparameters en URL-paden zonder procent-codering.
Het volledige JWT-aanmaakproces
- Maak de header-JSON en codeer deze met base64url.
- Maak de payload-JSON en codeer deze met base64url.
- Voeg ze samen met een
.als scheidingsteken. - Onderteken met het gekozen algoritme en geheim.
- Codeer de signature met base64url.
- Voeg alle drie de delen samen met
.als scheidingstekens.
Beveiligingsoverwegingen
- Bewaar nooit geheimen in de payload. De payload is gecodeerd, niet versleuteld.
- Valideer altijd de signature. Zonder verificatie kan iedereen tokens vervalsen.
- Controleer de
alg-header. Wijsalg: "none"en pogingen tot algoritme-downgrade af. - Stel korte verlooptijden in. Gebruik
exp-claims in minuten of uren, niet in maanden.
Een JWT-token online decoderen
Gebruik de JWT-decoder-tool om elk token te onderzoeken. Plak het en zie onmiddellijk de gedecodeerde header, payload en het ondertekeningsalgoritme. Alle verwerking vindt plaats in uw browser.