Décodeur JWT
Collez un JSON Web Token et lisez ce qu’il dit : qui l’a émis, pour qui il est fait, ce qu’il autorise et quand il cesse de fonctionner. Le jeton ne quitte jamais cette page.
Le token est décodé dans cette page pendant que vous le tapez ou le collez : il n’est ni envoyé chez nous, ni enregistré, ni ajouté à l’adresse. Un Bearer au début et les sauts de ligne sont ignorés.
Traitez un vrai token de production comme un mot de passe : tant qu’il n’a pas expiré, celui qui le détient peut agir en votre nom. Évitez donc de le coller dans un site web que vous ne contrôlez pas.
Trois morceaux de texte reliés par des points
Une fois que vous êtes connecté à un site web, le serveur doit vous reconnaître à la requête suivante. Une méthode courante consiste à remettre à votre navigateur un petit mot signé qui dit « voici l’utilisateur 48213, autorisé à lire les commandes, jusqu’à 15 h 15 ». Ce mot est un JSON Web Token, ou JWT.
Un JWT ressemble à une longue chaîne aléatoire, mais il a toujours la même forme, header.payload.signature.
- L’en-tête (header) est un petit objet JSON qui nomme l’algorithme de signature (
alg) et souvent la clé utilisée (kid). - La charge utile (payload) est un objet JSON de claims, des affirmations comme
sub(qui),aud(pour quel service) etexp(jusqu’à quand). - La signature est un sceau calculé à partir des deux premiers morceaux et d’une clé.
L’en-tête et la charge utile sont écrits en Base64URL, une façon d’épeler des octets avec des lettres, des chiffres, - et _ pour qu’ils survivent à un passage dans une adresse ou un en-tête HTTP. C’est aussi pourquoi presque tous les jetons commencent par eyJ, ce que devient {" dans cet encodage.
Encodé ne veut pas dire chiffré
Le Base64URL est une écriture. Il ne verrouille rien et le retransformer en texte ne demande aucune clé, ce qui est tout ce que fait cette page. Un JWT signé ne cache donc absolument rien. Si la charge utile contient une adresse e-mail, un rôle ou un identifiant interne, quiconque met la main sur le jeton peut le lire, que ce soit une extension de navigateur, un journal de proxy ou une capture d’écran.
Ce que la signature vous apporte, c’est l’intégrité. Changez un seul caractère de la charge utile et le sceau ne correspond plus, donc le serveur refuse le jeton. On peut toujours le lire. On ne peut simplement pas le réécrire.
Un jeton à cinq parties est un objet différent, un JWE et son contenu est réellement chiffré. Cet outil montre son en-tête, explique les cinq parties et s’arrête là. Il ne demande jamais de clé.
Ce que cette page lit et ce qu’elle signale
Le décodeur retire un Bearer en tête, les espaces et les sauts de ligne, découpe le jeton et affiche l’en-tête et la charge utile en JSON mis en forme. Il passe ensuite les claims en revue un par un. Les trois dates, exp, nbf (not before, pas avant) et iat (issued at, émis à), sont des nombres de secondes depuis le 1er janvier 1970. Vous les voyez dans votre fuseau horaire et en UTC, avec un décompte en direct comme « valide encore 12 minutes ».
| Constat | Pourquoi c’est important |
|---|---|
| Expiré, ou pas encore valide | Comparé à l’horloge de votre appareil. Un serveur correct refuse le jeton. |
Pas de claim exp | Le jeton fonctionne indéfiniment, sauf si le serveur tient une liste de jetons révoqués. |
| Durée de vie de plus de 30 jours | Un jeton volé reste utile aussi longtemps. |
alg vaut none | Le jeton n’est pas signé. N’importe qui peut en fabriquer un. |
| Dates en millisecondes | Une valeur 1 000 fois trop grande signifie que le jeton n’expire jamais pour un récepteur strict. |
| Données personnelles, ou champ nommé comme un secret | Tous ceux qui détiennent le jeton peuvent le lire. |
jku, x5u ou jwk dans l’en-tête | Le jeton désigne sa propre clé et un faussaire peut en faire autant. |
Vous obtenez aussi un mot sur l’algorithme. HS256 utilise un seul secret partagé pour signer et pour vérifier. RS256, ES256 et EdDSA utilisent une paire de clés : une clé privée signe et une clé publique vérifie, de sorte que les services qui ne font que vérifier les jetons ne peuvent pas en créer.
Ce que le décodage ne peut pas vous dire
Cette page ne vérifie pas la signature. Cela exigerait le secret ou la clé publique de l’émetteur et une page qui vous demande votre secret de signature est une page à fermer. Résultat : un jeton falsifié et un jeton authentique se ressemblent ici. Lisez le résultat comme « voici ce que le jeton affirme », jamais comme « ce jeton est valide ».
Pour la même raison, « non expiré » signifie seulement que exp est postérieur à l’horloge de votre appareil. Le serveur peut avoir révoqué le jeton il y a une heure.
Si vous écrivez le côté récepteur, les vérifications qui comptent se font dans votre code. N’acceptez que les algorithmes attendus, vérifiez la signature avec une clé en laquelle vous avez déjà confiance, puis comparez iss, aud et exp avec ce que vous attendez. Utilisez une bibliothèque maintenue et ne vous fiez jamais à l’alg que demande le jeton.
Un jeton actif est un identifiant d’accès
Jusqu’à son expiration, un jeton porteur (bearer) fonctionne pour quiconque le présente. Collez un jeton de production dans un site web et vous l’avez remis à ce site, sauf si le décodage se fait dans votre navigateur. Ici, c’est le cas. Aucune requête ne transporte le jeton, il n’est pas écrit dans la barre d’adresse et il n’est pas enregistré dans le stockage du navigateur. Vous n’avez pas à nous croire sur parole : regardez l’onglet Réseau des outils de développement, ou chargez la page et passez hors ligne avant de coller.
Malgré tout, l’habitude la plus sûre est de déboguer avec des jetons d’un compte de test ou des jetons expirés. Si un vrai jeton se retrouve dans une conversation, un billet ou un journal public, déconnectez-vous partout ou demandez à l’émetteur de le révoquer.
Questions fréquentes
Est-ce sûr de coller un JWT dans un décodeur en ligne ?
Seulement si le décodeur fonctionne dans votre navigateur et n’envoie rien. Celui-ci découpe et décode le jeton localement, ne fait aucune requête avec lui et ne stocke rien. Pour les jetons de production, un jeton expiré ou issu d’un compte de test reste le meilleur choix.
Peut-on décoder un JWT sans la clé secrète ?
Oui. L’en-tête et la charge utile sont du texte Base64URL que n’importe qui peut retransformer en JSON. Il ne faut le secret ou la clé que pour vérifier la signature, ou pour créer un jeton qu’un serveur acceptera.
Que signifient exp, iat et nbf dans un JWT ?
exp est le moment où le jeton cesse d’être accepté, iat le moment où il a été émis et nbf le moment où il commence à être accepté. Les trois sont des nombres de secondes depuis le 1er janvier 1970 (UTC), pas des millisecondes.
Pourquoi mon jeton commence-t-il par eyJ ?
L’en-tête est un objet JSON, il commence donc par {" et ces caractères donnent toujours eyJ en Base64. La charge utile commence de la même façon pour la même raison.
Quelle est la différence entre HS256 et RS256 ?
HS256 signe et vérifie avec un seul secret partagé, donc tout service capable de vérifier un jeton pourrait aussi en forger un. RS256 signe avec une clé privée et vérifie avec une clé publique. De nombreux services peuvent alors vérifier les jetons alors que seul l’émetteur peut les créer.
Pourquoi un jeton avec alg none est-il dangereux ?
Il ne porte aucune signature, donc n’importe qui peut modifier son contenu. Un serveur qui l’accepte laisse les gens choisir leur propre identifiant d’utilisateur ou leur rôle. Les récepteurs doivent lister les algorithmes qu’ils acceptent et refuser tout le reste.