Structure du jeton JWT expliquée : Header, Payload et Signature
Structure du jeton JWT expliquée
Chaque JSON Web Token (JWT) est une chaßne compacte et sûre pour les URL qui transporte des revendications entre deux parties. Comprendre sa structure interne est essentiel pour tout développeur travaillant avec la sécurité basée sur les jetons.
Les trois parties d'un JWT
Un JWT se compose de trois parties séparées par des points (.) :
header.payload.signature
Exemple :
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Chaque partie est un JSON encodĂ© en base64url. Un JWT est signĂ©, pas chiffrĂ© â n'importe qui peut le dĂ©coder et lire son contenu.
Partie 1 : Le Header
Le header contient les mĂ©tadonnĂ©es du jeton â l'algorithme de signature et le type de jeton.
| Champ | Description | Exemples de valeurs |
|-------|-------------|----------------|
| alg | Algorithme de signature (obligatoire) | HS256, RS256, ES256 |
| typ | Type de jeton (facultatif) | JWT |
| kid | Identifiant de clé (facultatif) | "key-1" |
{
"alg": "HS256",
"typ": "JWT"
}
Le champ alg indique au vĂ©rificateur quel algorithme a créé la signature. Une discordance d'algorithme â ou l'acceptation de alg: "none" â est une vulnĂ©rabilitĂ© de sĂ©curitĂ© JWT courante.
Partie 2 : Le Payload
Le payload contient des revendications sur l'utilisateur et des métadonnées. Les revendications se répartissent en trois catégories :
Revendications enregistrées
| Revendication | Nom complet | But |
|-------|-----------|---------|
| iss | Ămetteur | Qui a Ă©mis le jeton |
| sub | Sujet | Identifie l'utilisateur |
| aud | Audience | Destinataire prévu |
| exp | Expiration | Horodatage d'expiration du jeton |
| nbf | Pas avant | Jeton non valide avant cette heure |
| iat | Ămis Ă | Horodatage de crĂ©ation du jeton |
| jti | ID JWT | Identifiant unique du jeton |
Exemple de payload décodé
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022,
"exp": 1516242622,
"iss": "https://auth.example.com"
}
Les revendications publiques sont définies dans le registre IANA ou utilisent des URI résistantes aux collisions. Les revendications privées sont des revendications personnalisées convenues entre l'émetteur et le consommateur.
Partie 3 : La Signature
La signature est créée en combinant le header encodé, le payload encodé et une clé secrÚte à l'aide de l'algorithme du header. Elle remplit deux objectifs :
- IntĂ©gritĂ© â confirme que le jeton n'a pas Ă©tĂ© modifiĂ© aprĂšs la signature.
- Authentification â prouve que le jeton a Ă©tĂ© signĂ© par la partie attendue.
Création de la signature HS256
HMACSHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
secret
)
Création de la signature RS256
RSASHA256(
base64urlEncode(header) + "." + base64urlEncode(payload),
privateKey
)
Base64url vs Base64 standard
| Aspect | Base64 standard | Base64url |
|--------|-----------------|-----------|
| CaractĂšre 62 | + | - |
| CaractĂšre 63 | / | _ |
| Remplissage | = | Omis |
Cet encodage garantit que les JWT sont sĂ»rs pour les headers HTTP, les paramĂštres de requĂȘte et les chemins d'URL, sans encodage en pourcentage.
Processus complet de création d'un JWT
- Créez le JSON du header et encodez-le en base64url.
- Créez le JSON du payload et encodez-le en base64url.
- Concaténez avec un séparateur
.. - Signez avec l'algorithme et la clé secrÚte choisis.
- Encodez la signature en base64url.
- Concaténez les trois parties avec des séparateurs
..
Considérations de sécurité
- Ne stockez jamais de secrets dans le payload. Le payload est encodé, pas chiffré.
- Validez toujours la signature. Sans vérification, n'importe qui peut falsifier des jetons.
- Vérifiez le header
alg. Rejetezalg: "none"et les tentatives de rétrogradation d'algorithme. - Définissez des durées d'expiration courtes. Utilisez des revendications
expen minutes ou en heures, pas en mois.
Décodez un jeton JWT en ligne
Utilisez l'outil de décodage JWT pour examiner n'importe quel jeton. Collez-le et voyez instantanément le header, le payload et l'algorithme de signature décodés. Tout le traitement s'effectue dans votre navigateur.