Anatomie d'un JWT
Après des années à implémenter l'authentification JWT dans des applications, je peux affirmer que comprendre leur structure est fondamental. Un JWT se compose de trois parties séparées par des points : le header (algorithme de signature), le payload (données/claims), et la signature (vérification d'intégrité). Chaque partie est encodée en Base64URL : pas chiffrée, juste encodée.
Structure détaillée
Header (JOSE)
Contient le type de token (JWT) et l'algorithme de signature (HS256, RS256, etc.). Le header informe le récepteur comment vérifier la signature.
Payload (Claims)
Les données transportées. Claims réservés (iss, exp, sub, aud) et claims personnalisés. Attention : visible par tous, ne jamais inclure de secrets.
Signature
Hash du header + payload avec une clé secrète. Garantit que le token n'a pas été modifié. Sans la clé, impossible de générer une signature valide.
Claims standard (réservés)
- iss (issuer) : Identifie qui a émis le token (votre serveur d'authentification)
- sub (subject) : Le sujet du token, généralement l'ID utilisateur
- aud (audience) : Les destinataires prévus du token
- exp (expiration) : Timestamp Unix après lequel le token est invalide
- iat (issued at) : Timestamp de création du token
- nbf (not before) : Token invalide avant cette date
- jti (JWT ID) : Identifiant unique pour prévenir la réutilisation
Bonnes pratiques de sécurité
- Utiliser des durées d'expiration courtes (15 min à 1 heure) avec refresh tokens
- Ne JAMAIS stocker de données sensibles dans le payload : il est lisible par tous
- Toujours vérifier la signature côté serveur avant de faire confiance aux claims
- Préférer RS256 (asymétrique) à HS256 pour les systèmes distribués
- Implémenter une blacklist pour l'invalidation anticipée si nécessaire
- Stocker les JWT en httpOnly cookies plutôt que localStorage contre XSS