Guide Complet de Sécurité JWT : Décodage, Vérification et Vulnérabilités Courantes
Qu'est-ce que JWT ?
JWT (JSON Web Token) est une norme ouverte (RFC 7519) pour transmettre des informations de manière sécurisée entre des parties. C'est le schéma d'authentification API le plus populaire, largement utilisé par OAuth 2.0 et OpenID Connect.
Structure JWT
Un JWT comporte trois parties séparées par . :
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
│ Header │.│ Payload │.│ Signature │
| Partie | Contenu | Encodage |
|---|---|---|
| Header | Algorithme + type | Base64URL |
| Payload | Claims | Base64URL |
| Signature | Signature | Algorithme(Header + Payload, Secret) |
⚠️ Le Header et le Payload sont uniquement encodés en Base64URL—ils ne sont pas chiffrés. N'importe qui peut les décoder et les lire.
Décoder JWT avec ToolsKu
Étapes
- Ouvrez le Décodeur JWT
- Collez la chaîne JWT
- Consultez le Header et le Payload JSON décodés
- Vérifiez l'expiration, l'émetteur et d'autres champs
Champs Courants du Payload
| Champ | Signification | Exemple |
|---|---|---|
sub |
Sujet (ID utilisateur) | "user_12345" |
iss |
Émetteur | "https://auth.example.com" |
aud |
Audience | "api.example.com" |
exp |
Expiration (secondes Unix) | 1717200000 |
iat |
Émis le | 1717196400 |
nbf |
Pas avant | 1717196400 |
jti |
ID JWT (identifiant unique) | "a1b2c3d4" |
Algorithmes de Signature JWT
| Algorithme | Type | Sécurité | Cas d'Usage |
|---|---|---|---|
| HS256 | Symétrique | Moyenne | Service unique, APIs internes |
| HS384/HS512 | Symétrique | Moyenne–élevée | Exigences de sécurité plus élevées |
| RS256 | Asymétrique | Élevée | Multi-service, OAuth |
| ES256 | Asymétrique | Élevée | Mobile, IoT |
| none | Pas de signature | ❌ Dangereux | Ne jamais utiliser |
Symétrique vs Asymétrique
HS256 (symétrique) :
Signer : HMAC-SHA256(header.payload, shared_secret)
Vérifier : Même shared_secret
Problème : Tous les services partagent un secret—une fuite affecte tout
RS256 (asymétrique) :
Signer : RSA-SHA256(header.payload, private_key)
Vérifier : RSA-SHA256(header.payload, public_key)
Avantage : La clé publique peut être distribuée ; la clé privée reste chez l'émetteur
Vulnérabilités de Sécurité Courantes
1. Attaque alg: none
Un attaquant modifie le alg du Header en none et supprime la Signature :
// Header Original
{"alg": "HS256", "typ": "JWT"}
// Modification de l'attaquant
{"alg": "none", "typ": "JWT"}
Défense : Le serveur doit établir une liste blanche des algorithmes autorisés et rejeter none.
2. Attaque par Confusion de Clés
Remplacer RS256 par HS256 et utiliser la clé publique comme secret HMAC :
L'attaquant obtient la clé publique → change alg en HS256 → signe avec la clé publique → le serveur vérifie HMAC avec la clé publique → réussit
Défense : Valider strictement que le alg du Header correspond aux attentes.
3. Fuite de Données Sensibles
Comme le Payload est uniquement encodé en Base64, ne jamais stocker dans un JWT :
- ❌ Mots de passe, numéros de carte bancaire
- ❌ Informations personnelles privées
- ✅ ID utilisateur, rôles, permissions
4. Expiration Inadéquate
// ❌ Pas d'expiration — token valide indéfiniment
{"sub": "user_123"}
// ❌ Expiration trop longue — token compromis reste valide
{"sub": "user_123", "exp": 1893456000} // année 2030
// ✅ Expiration raisonnable + flux de refresh
{"sub": "user_123", "exp": 1717200000} // 15–60 minutes
Bonnes Pratiques JWT
1. Access Token de Courte Durée + Refresh Token
Access Token : Expiration de 15–60 minutes, utilisé pour les appels API
Refresh Token : Expiration de 7–30 jours, utilisé pour obtenir de nouveaux access tokens
2. Lieu de Stockage
| Stockage | Risque XSS | Risque CSRF | Recommandé |
|---|---|---|---|
| localStorage | Élevé | Faible | ❌ |
| sessionStorage | Élevé | Faible | ❌ |
| HttpOnly Cookie | Faible | Élevé | ⚠️ Nécessite une protection CSRF |
| Variable en mémoire | Faible | Faible | ✅ Recommandé pour les SPAs |
3. Liste de Vérification
Lors de la validation du JWT sur le serveur, toujours vérifier :
- La signature est valide
-
expn'a pas expiré -
nbfest en vigueur -
issest l'émetteur attendu -
audinclut le service actuel -
algest sur la liste blanche
Débogage des Problèmes JWT
- Décoder le JWT : Utilisez le Décodeur JWT pour inspecter le Header et le Payload
- Vérifier exp : Le token a-t-il expiré ?
- Vérifier alg : L'algorithme de signature correspond-il aux attentes ?
- Vérifier iss/aud : L'émetteur et l'audience sont-ils corrects ?
- Vérifier la signature : Utilisez le Générateur JWT pour resigner avec le même secret et comparer
- Vérifier le transport : L'en-tête Authorization est-il
Bearer <token>?
Outils Connexes
- Décodeur JWT — Analyser le Header et le Payload
- Générateur JWT — Créer des JWTs personnalisés pour les tests
- Calculateur HMAC — Comprendre la signature HMAC
- Encodage/Décodage Base64 — Encodage utilisé par JWT
Résumé
JWT est une pierre angulaire de l'authentification API moderne, mais l'encodage Base64 (pas le chiffrement) crée des défis de sécurité uniques. Comprendre la structure, la signature et les vulnérabilités courantes est essentiel pour les développeurs full-stack. Le décodeur JWT de ToolsKu vous aide à déboguer l'authentification rapidement—mais rappelez-vous : décoder n'est pas vérifier ; validez toujours les signatures sur le serveur en production.