Qu'est-ce qu'un jeton JWT ? Pratiques de sécurité et meilleures pratiques
Rudra Chauhan, Senior Systems Architect
Qu'est-ce qu'un jeton JWT ? Pratiques de sécurité et meilleures pratiques
Les jetons Web JSON (JWT) spécifiés dans RFC 7519 sont une méthode standard ouverte et industrielle pour représenter des revendications de manière sécurisée entre deux parties. Les JWT sont largement utilisés pour l'authentification sans état dans les API REST, les microservices et les applications de page unique (SPAs).
Cependant, une mise en œuvre incorrecte de la vérification des JWT peut introduire des vulnérabilités d'authentification critique.
Anatomie d'un jeton JWT
Une chaîne de jeton JWT est composée de trois parties encodées en base64url séparées par des points (.) :
EN-TÊTE . REVENDICATIONS . SIGNATURE
Exemple :
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1. En-tête
Contient le type de jeton et l'algorithme de signature :
json{ "alg": "HS256", "typ": "JWT" }
2. Revendications (Revendications)
Contient des déclarations sur une entité (généralement l'utilisateur) et des métadonnées supplémentaires :
sub(Sujet) : ID de l'utilisateuriat(Émis à) : Heure de créationexp(Expiration) : Heure d'expirationiss(Émetteur) : URL de l'identifiant de l'émetteur
3. Signature
Créée en prenant l'en-tête encodé, les revendications encodées, une clé secrète et en signant avec l'algorithme spécifié.
Structure des revendications JWT
json{ "iss": "https://example.com", "sub": "1234567890", "iat": 1643723900, "exp": 1643723900, "aud": "https://example.com/api/v1", "jti": "1234567890", "name": "John Doe", "email": "john.doe@example.com", "roles": ["admin", "modérateur"] }
Génération de la signature JWT
bashecho -n '{"alg":"HS256","typ":"JWT"}' | base64 echo -n '{"iss":"https://example.com","sub":"1234567890","iat":1643723900,"exp":1643723900,"aud":"https://example.com/api/v1","jti":"1234567890","name":"John Doe","email":"john.doe@example.com","roles":["admin","modérateur"]}' | base64 clé_secrète="votre_clé_secrète_ici" signature=$(echo -n "$(base64 -d <<< "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9")$(base64 -d <<< "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ")" | openssl dgst -sha256 -hmac "$clé_secrète" -binary | base64 -w 0)
2. Signature symétrique (HS256) vs signature asymétrique (RS256)
| Caractéristique | HMAC SHA-256 (HS256) | RSA SHA-256 (RS256) |
|---|---|---|
| Type de clé | Clé secrète partagée (symétrique) | Paire de clés publique/privée (asymétrique) |
| Signature | Effectuée avec la clé secrète | Effectuée avec la clé privée |
| Vérification | Effectuée avec la clé secrète | Effectuée avec la clé publique |
| Meilleur pour | Back-ends monolithiques où un seul serveur émet et vérifie | Microservices / API distribuées / OAuth2 |
3. Vulnérabilités JWT courantes à éviter
1. La vulnérabilité "alg: none"
Certaines bibliothèques mal écrites acceptent des jetons où alg est défini sur none, ce qui permet de contourner la validation de la signature. Imposez toujours explicitement les algorithmes autorisés dans le middleware du serveur.
2. Attaque de confusion d'algorithme (HS256 vs RS256)
Si un serveur attend RS256 (asymétrique) mais reçoit HS256, un attaquant peut signer le jeton en utilisant la clé publique du serveur comme clé secrète. Vérifiez l'algorithme du jeton avant l'évaluation de la signature.
3. Manque de vérification d'expiration (exp)
Les jetons sans expiration vivent éternellement. Imposez toujours une durée de vie courte (par exemple, 15 minutes) pour les jetons d'accès et utilisez la rotation de jetons de refresh.
4. Outils de développement sur Teksolvr
Inspectez et déboguez les jetons de manière sécurisée avec les outils Teksolvr :
- Décodez les en-têtes et les revendications avec notre Décodeur de JWT.
- Testez les règles de validation regex avec le Testeur de regex.
- Générez des secrets aléatoires avec le Générateur de mots de passe et de clés.
5. Exemples d'utilisation
- Authentification : Utilisez les JWT pour l'authentification sans état dans les API REST, les microservices et les applications de page unique (SPAs).
- Autorisation : Utilisez les JWT pour stocker les rôles et les permissions de l'utilisateur, permettant un contrôle d'accès fin.
6. Pratiques de sécurité
- Utilisez HTTPS pour prévenir l'interception et la modification des jetons.
- Imposez des jetons d'accès et des jetons de refresh à durée de vie courte.
- Utilisez un générateur de nombres aléatoires sécurisé pour générer les clés secrètes.
- Implémentez la liste noire des jetons pour prévenir la réutilisation des jetons.
- Rotez régulièrement les clés secrètes et les jetons de refresh.
7. Références
- RFC 7519 : Jetons Web JSON (JWT)
- RFC 7515 : Signature Web JSON (JWS)
- RFC 7516 : Chiffrement Web JSON (JWE)
8. Crédits d'image
Nom du diagramme
9. Liste de vérification de dépannage
- Vérifiez la signature et l'algorithme du jeton.
- Vérifiez l'expiration et la rotation des jetons de refresh.
- Assurez-vous d'un générateur de nombres aléatoires sécurisé pour la génération des clés secrètes.
- Implémentez la liste noire des jetons pour prévenir la réutilisation des jetons.
10. FAQ
- Q : Qu'est-ce qu'un jeton JWT ? A : Un jeton JWT est un objet JSON qui contient des revendications, une signature et un en-tête.
- Q : Quelle est la différence entre la signature symétrique et la signature asymétrique ? A : La signature symétrique utilise une clé secrète partagée, tandis que la signature asymétrique utilise une paire de clés publique/privée.
- Q : Comment prévenir la vulnérabilité "alg: none" ? A : Imposez toujours explicitement les algorithmes autorisés dans le middleware du serveur.
11. Conclusion
Les Jetons Web JSON (JWT) sont une méthode largement utilisée pour représenter des revendications de manière sécurisée entre deux parties. Cependant, une mise en œuvre incorrecte de la vérification des JWT peut introduire des vulnérabilités d'authentification critique. En suivant les pratiques de sécurité et les meilleures pratiques, telles que l'utilisation de HTTPS, l'imposition de jetons d'accès et de jetons de refresh à durée de vie courte et l'implémentation de la liste noire des jetons, vous pouvez assurer un usage sécurisé et fiable des jetons JWT dans vos applications.