Décodez les JWT localement avec le décodeur JWT – claims d'en-tête et de payload dans votre navigateur, rien n'est envoyé.
Pourquoi les JWT cassent et où chercher
L'authentification par JWT échoue d'un petit nombre de façons récurrentes : jetons expirés, dérive d'horloge, émetteur ou audience incompatibles, confusion d'algorithme et erreurs de vérification de signature.
Presque toutes laissent une trace lisible. Un JWT n'est pas opaque – son en-tête et son payload sont du JSON encodé en Base64URL que n'importe qui peut décoder. Les claims vous disent ce que le jeton prétend sur lui-même ; l'erreur de votre serveur vous dit ce qu'il a rejeté.
Ce guide parcourt le flux de débogage, du jeton lui-même à la configuration de la bibliothèque, et montre comment le faire sans fuiter le jeton vers un site quelconque.
Anatomie d'un JWT : trois segments, une signature
Un JWT est composé de trois segments séparés par des points : en-tête.payload.signature.
L'en-tête déclare l'algorithme (alg) et le type de jeton (typ). Le payload contient les claims – des déclarations sur le sujet et le jeton lui-même. Les deux sont du JSON brut, encodé en Base64URL, lisible par n'importe qui.
La signature est produite avec l'algorithme de l'en-tête et une clé détenue par l'émetteur. Elle permet au vérificateur de confirmer que le jeton n'a pas été modifié et qu'il a été signé par la partie attendue.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c# header = {"alg":"HS256","typ":"JWT"}# payload = {"sub":"1234567890","name":"John Doe","iat":1516239022}# signature = HMAC-SHA256(header.payload, secret)Les claims standard et leur signification
| Claim | Signification | Quand s'en préoccuper |
|---|---|---|
| exp | Heure d'expiration (secondes Unix) | 401 « jeton expiré » – l'échec le plus courant |
| iat | Heure d'émission | Comparaison avec l'horloge du serveur ; fraîcheur |
| nbf | Non valide avant cette heure | Jetons rejetés immédiatement après émission |
| iss | Identifiant de l'émetteur | Émetteur incompatible – jeton d'une autre autorité |
| aud | Audience prévue | Jeton émis pour un autre service |
| sub | Identifiant du sujet | Quel utilisateur le jeton représente |
| jti | Identifiant unique du jeton | Détection de rejeu et listes de révocation |
Un flux de débogage sûr
- Copiez le JWT complet depuis le journal, l'en-tête ou la requête en échec – points inclus.
- Décodez-le localement avec le décodeur JWT – ne collez jamais les jetons de production dans un service en ligne non vérifié.
- Lisez les claims du payload : exp, iat, nbf, iss, aud, sub.
- Convertissez exp en heure lisible et comparez-la à l'heure actuelle du serveur, pas à celle de votre ordinateur portable.
- Vérifiez iss et aud par rapport à ce que votre API est configurée pour accepter.
- Si les claims semblent corrects, l'échec vient de la vérification : algorithme, clé ou gestion de l'horloge dans la bibliothèque.
- Masquez le jeton avant de partager des journaux avec qui que ce soit, même en interne.
Motifs d'échec courants et correctifs
Jeton expiré
L'exp du jeton est dans le passé. Le client doit se ré-authentifier ou s'actualiser. Si les jetons expirent trop vite, les utilisateurs voient des connexions constantes – vérifiez le réglage de durée de vie de l'émetteur.
Dérive d'horloge
Un jeton rejeté comme expiré ou pas encore valide peu après son émission indique généralement un décalage entre l'horloge du serveur et celle de l'émetteur. Corrigez NTP sur les serveurs et n'utilisez une petite tolérance (30-60 secondes) que si le protocole l'exige.
Mauvais émetteur ou audience
Les claims décodés indiquent un iss/aud, votre vérificateur en attend un autre. Fréquent après un changement d'environnement (dev vs prod) ou un partage de jetons entre services. Alignez la configuration des deux côtés.
Échec de vérification de signature
La signature ne correspond pas. Causes : mauvaise clé, rotation de clé en cours, algorithme incompatible ou jeton modifié pendant le transport. Vérifiez que le vérificateur utilise la clé publique actuelle de l'émetteur.
Confusion d'algorithme (en-tête alg)
Si votre vérificateur se fie à l'en-tête alg, un attaquant peut basculer RS256 vers HS256 et signer avec la clé publique. Les vérificateurs doivent épingler l'algorithme attendu et rejeter « none ». Les bibliothèques configurées en auto-sélection constituent une classe de vulnérabilité connue.
Décoder n'est pas vérifier
Décoder lit les claims – n'importe quel outil peut le faire, sans clé. Vérifier prouve l'authenticité du jeton : signature, exp, nbf, iss, aud et algorithme, contrôlés par le serveur avec la bonne clé.
Le débogage commence généralement par le décodage pour comprendre le jeton, puis passe à la vérification pour comprendre pourquoi le serveur l'a rejeté.
Méfiez-vous des services de décodage qui prétendent vérifier les signatures : une vraie vérification exige la clé secrète ou publique, qu'un service distant ne devrait jamais vous demander de fournir. Un outil côté client est la valeur sûre.
Outils de débogage au-delà du décodeur
- Un décodeur JWT côté client pour lire les claims sans envoyer le jeton
- Le convertisseur d'horodatage pour transformer les secondes Unix de exp/iat en dates lisibles
- Un décodeur Base64/Base64URL pour inspecter les segments individuellement
- La bibliothèque JWT de votre langage avec vérification de signature activée et algorithme épinglé
- Des journaux de requêtes structurés qui masquent les en-têtes Authorization par défaut
FAQ
Q.Est-il sûr de décoder un JWT en ligne ?
A.Uniquement si l'outil est côté client et n'envoie jamais le jeton. Le décodeur de ce site s'exécute entièrement dans votre navigateur. Traitez les jetons de production comme sensibles – ce sont des identifiants de type bearer dans de nombreux systèmes.
Q.Pourquoi mon jeton expire-t-il immédiatement après sa création ?
A.Comparez iat/nbf avec l'horloge du serveur. Si nbf est dans le futur ou si l'horloge du serveur est en avance, un jeton frais semble expiré ou pas encore valide. Corrigez NTP et n'utilisez une tolérance que si nécessaire.
Q.Ai-je besoin du secret pour décoder un JWT ?
A.Non. L'en-tête et le payload sont lisibles sans aucune clé. Vous n'avez besoin du secret que pour vérifier la signature, et vous ne devriez jamais le partager avec un service distant.
Q.Pourquoi mon jeton indique-t-il alg : none ?
A.Cet en-tête signifie que le jeton n'est pas signé – n'importe qui peut forger des claims. Votre serveur doit rejeter none. Si vous le voyez, vérifiez immédiatement la configuration de votre bibliothèque ; la confusion d'algorithme est une vulnérabilité JWT bien connue.
Q.Un jeton s'est retrouvé dans nos journaux. Est-ce un problème ?
A.Oui, considérez-le comme compromis. Les jetons peuvent être rejoués jusqu'à leur expiration. Masquez-le ou faites-le tourner, arrêtez de journaliser les en-têtes Authorization et ajoutez un contrôle CI qui échoue sur les motifs de jeton dans la sortie de test.
Q.exp est en secondes ; iat est en secondes – pourquoi ma comparaison échoue-t-elle ?
A.Les deux sont en secondes Unix, mais méfiez-vous des millisecondes : si un côté multiplie par 1000 et l'autre non, les valeurs diffèrent d'un facteur 1000. Utilisez le convertisseur d'horodatage pour inspecter les valeurs brutes avant de déboguer autre chose.
Q.Pourquoi mon JWT s'affiche-t-il comme « malformed » ?
A.Une erreur « jwt malformed » signifie généralement que le jeton n'a pas les trois segments attendus séparés par des points, ou qu'un segment n'est pas un base64url valide. Causes courantes : un jeton copié avec un payload tronqué, des espaces ou des sauts de ligne autour du jeton, un point supplémentaire dans une valeur de claim, ou un identifiant de session opaque au lieu d'un vrai JWT. Collez le jeton brut dans le décodeur JWT et vérifiez chaque segment ; corrigez l'encodage à la source plutôt que de modifier le jeton manuellement.
Références
- RFC 7519 – JSON Web Token (JWT) : https://www.rfc-editor.org/rfc/rfc7519
- RFC 7515 – JSON Web Signature (JWS) : https://www.rfc-editor.org/rfc/rfc7515
- RFC 7517 – JSON Web Key (JWK) : https://www.rfc-editor.org/rfc/rfc7517
- Aide-mémoire OWASP JWT : https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html
Décodez les JWT en toute sécurité
Lisez les claims d'en-tête et de payload localement dans votre navigateur. Sans envoi, sans compte.
Lisez les claims, puis corrigez la configuration
Le débogage JWT consiste surtout à lire les claims : exp, iat, nbf, iss et aud expliquent la grande majorité des 401. Les problèmes de signature relèvent de la configuration – épinglage d'algorithme et gestion des clés.
Décodez les jetons localement avec le décodeur JWT, convertissez les horodatages avec le convertisseur d'horodatage et gardez les jetons hors des journaux et des sites tiers.