Aller au contenu

Décoder un JWT

Consultez l'en-tête, les claims et l'expiration d'un JSON Web Token. Un jeton est un identifiant valide : rien n'est donc envoyé nulle part ni conservé, jamais.

  • Jamais conservé
  • Pas de file d'attente, pas d'attente
  • Sans inscription, sans filigrane

Votre jeton ne quitte jamais cette page. Il est décodé ici même, sans aucune requête vers un serveur — ce qui compte, car un JWT est généralement un identifiant d'accès valide. Coupez votre Wi-Fi une fois la page chargée : le décodage fonctionne toujours, rien n'est envoyé.

Le préfixe « Bearer » ne pose pas de problème — il est ignoré.

Comment ça marche

1

Collez le jeton

Avec ou sans le préfixe « Bearer ». Il reste dans cette page ; aucune requête n'est effectuée.

2

Lisez les trois parties

En-tête, payload et signature, chacun décodé et formaté. Les horodatages deviennent de vraies dates, et le temps restant vous est indiqué.

3

Vérifiez les alertes

Jetons expirés, expiration absente, algorithme « none » et autres problèmes sont signalés, avec leur signification.

Ce qui est vérifié, et ce qui est seulement lu

Tout ce que fait cette page, à part deux comparaisons de dates, est de la transcription. L'en-tête et le payload sont décodés depuis le Base64URL et affichés ; la signature est recopiée sans jamais être touchée, car il n'y a ici aucune clé et aucune opération cryptographique n'est exécutée. Les deux seuls jugements que la page émet sont des calculs faits avec l'horloge de votre propre appareil — la claim d'expiration comparée à maintenant, et la claim « pas avant » comparée à maintenant. Aucune tolérance n'est prévue pour le décalage d'horloge, alors qu'un serveur qui vérifie le même jeton accorde normalement une minute ou deux. Un ordinateur portable qui avance de cinq minutes vous montrera un jeton valide comme expiré, alors que le jeton est parfaitement correct.

Deux détails d'analyse déterminent ce que vous voyez réellement. Les claims de date ne sont lues que si elles arrivent sous forme de nombres JSON : un jeton dont l'expiration est écrite sous forme de chaîne « 1699999999 » est traité comme n'ayant aucune expiration, et reçoit l'alerte indiquant qu'il n'expire jamais de lui-même — l'inverse de la réalité. Et le payload est analysé avec l'analyseur JSON du navigateur plutôt qu'avec celui, qui préserve tous les chiffres, de nos outils JSON : une claim numérique de 64 bits, comme un identifiant d'utilisateur de type snowflake dans le sujet, s'affiche donc avec ses derniers chiffres arrondis. C'est précisément pour cette raison que les identifiants d'un JWT sont généralement des chaînes ; quand ce n'est pas le cas, lisez-les dans le payload brut plutôt que dans le tableau des claims.

Un jeton à cinq sections est refusé comme JWE chiffré, et ce jugement repose uniquement sur le nombre de sections, sans lire l'en-tête — juste en pratique, mais c'est un raccourci qu'il vaut mieux connaître. Tout ce qui n'a pas trois sections est refusé d'emblée, de même qu'un payload qui se décode en tableau JSON ou en simple chaîne au lieu d'un objet. Des alertes sont émises pour l'algorithme « none » et pour la famille HS, où la clé de signature est un secret partagé plutôt qu'une clé publique. Les jetons signés en RS, ES ou PS ne déclenchent rien : le silence de cette page signifie donc l'absence d'une forme connue comme dangereuse, pas une approbation.

Si vous cherchez autre chose

Rien n'est conservé ici, et c'est la seule raison pour laquelle cette page peut raisonnablement exister — mais ce n'est toujours pas l'habitude à prendre. Une promesse de confidentialité ne se vérifie pas en la lisant : déconnectez-vous une fois la page chargée et constatez que le décodeur continue de fonctionner, ce qu'un outil adossé à un serveur est précisément incapable de faire. Et si un jeton que vous avez collé quelque part sans pouvoir l'auditer est encore valide, renouvelez-le plutôt que de vous interroger. Le renouveler prend une minute. L'alternative, c'est un long débat avec vous-même au sujet d'un identifiant qui ouvre toujours la porte. Pour lire un jeton sur une machine plutôt que dans un onglet, le payload tient en une ligne de shell : extrayez le deuxième champ séparé par des points, passez-le dans base64 -d, puis dans jq.

Quand la question est de savoir si un jeton est authentique plutôt que ce qu'il dit, cette page est par construction le mauvais outil, comme tout autre décodeur en ligne. La vérification se fait là où se trouve déjà la clé — la bibliothèque JWT de votre langage, sur votre serveur, en vérifiant par rapport au JWKS publié par l'émetteur. Cela tient en quelques lignes, c'est la seule réponse qui ait un sens, et tout site qui propose de le faire à votre place vous demande le seul secret que vous ne devriez jamais confier à un site web.

Questions fréquentes

Mon jeton est-il envoyé quelque part ?

Non — et pour cette page, c'est tout l'enjeu plutôt qu'une simple fonctionnalité. Un JWT est généralement un identifiant actif : quiconque le détient peut agir en votre nom jusqu'à son expiration. Le coller dans un décodeur en ligne qui l'envoie à un serveur, c'est remettre une clé qui fonctionne, et aucune promesse de non-journalisation ne peut l'annuler. Ce décodeur est du simple JavaScript dans la page que vous consultez. Rien n'est conservé, rien n'est journalisé, aucune requête n'est effectuée. Une fois la page chargée, coupez votre Wi-Fi : elle fonctionne exactement de la même façon. C'est le moyen le plus simple de vérifier vous-même la promesse de confidentialité, plutôt que de nous croire sur parole.

L'outil vérifie-t-il la signature ?

Non, et aucun décodeur en ligne ne peut honnêtement le faire sans votre clé de signature. Décoder et vérifier sont deux opérations complètement différentes. Décoder consiste simplement à défaire le Base64 du jeton — n'importe qui peut le faire sur n'importe quel jeton, et cela ne prouve absolument rien quant à son authenticité. Vérifier, c'est recalculer la signature avec le secret ou la clé publique qui l'a signé, et cette clé ne doit jamais être collée dans un site web. Ce que vous voyez ici, c'est ce que le jeton AFFIRME. Savoir si ces affirmations sont dignes de confiance est une question à laquelle seul votre serveur, qui détient la clé, peut répondre.

Quelqu'un peut-il lire un JWT que je lui envoie ?

Oui — intégralement, et beaucoup de gens l'ignorent. Un JWT est signé, pas chiffré. L'en-tête et le payload sont en Base64, un encodage sans aucun secret : quiconque intercepte le jeton peut lire chacune de ses claims. La signature l'empêche de MODIFIER le jeton ; elle ne fait rien pour l'empêcher de le LIRE. Ne mettez jamais rien de confidentiel dans le payload d'un JWT : pas de mots de passe, pas de numéros de carte, aucune donnée personnelle que vous n'écririez pas sur une carte postale.

Que signifie l'alerte sur l'algorithme « none » ?

Que le jeton se déclare non signé, et c'est l'un des constats les plus graves que cette page puisse signaler. `alg: none` est un contournement d'authentification documenté : un attaquant prend un vrai jeton, modifie le payload pour se déclarer administrateur, règle l'algorithme sur « none », supprime la signature, et une bibliothèque qui fait confiance à l'en-tête l'accepte. Toutes les bibliothèques JWT sérieuses bloquent désormais cela par défaut, mais des implémentations qui font confiance à `alg` existent encore. Un jeton qui arrive avec `alg: none` doit être traité comme une attaque jusqu'à preuve du contraire.

Comment lire l'expiration ?

C'est fait pour vous. `exp`, `iat` et `nbf` sont des horodatages Unix — des secondes depuis 1970 — illisibles sous forme de nombres bruts. Chacun s'affiche comme une vraie date dans votre fuseau horaire, avec le temps écoulé ou restant, et un jeton expiré est signalé clairement au lieu de vous laisser le déduire. Un jeton sans aucun `exp` est également signalé : un JWT qui n'expire jamais ne peut pas être révoqué par expiration, et reste valide aussi longtemps que la clé de signature.

Mon jeton a cinq parties, pas trois

C'est alors un JWE — chiffré et pas seulement signé — et son contenu ne peut réellement pas être lu sans la clé de déchiffrement. La page reconnaît cette forme et vous le dit, au lieu de vous afficher du charabia. Cinq parties signifient que le payload est un vrai texte chiffré ; il n'y a rien à décoder.

Quelles sont les claims standard ?

Les claims enregistrées sont : `iss` l'émetteur, `sub` le sujet (généralement un identifiant d'utilisateur), `aud` le destinataire, `exp` la date d'expiration, `nbf` la date avant laquelle le jeton n'est pas valide, `iat` la date d'émission, et `jti` un identifiant unique du jeton. Tout le reste est propre à celui qui a conçu le système. Chaque claim enregistrée est accompagnée de sa signification dans le résultat : inutile de retenir quelle abréviation de trois lettres correspond à quoi.

Bon à savoir : Cet outil décode ; il ne vérifie pas. La signature d'un JWT prouve que le jeton n'a pas été modifié, et la vérifier nécessite le secret ou la clé publique de l'émetteur — que vous ne devez jamais coller dans une page web. Considérez tout ce qui s'affiche ici comme déclaré, non prouvé, et vérifiez sur votre serveur.

Intégrez cet outil à votre site

Gratuit pour tout blog, page de cours ou article d'aide. Collez un seul extrait de code et vos visiteurs pourront l'utiliser directement sur votre page.