Web et encodage · 6 minutes de lecture
Décodeur JWT : ce qu'il y a à l'intérieur d'un jeton et ce qui
Un jeton Web JSON est constitué de trois segments d'url base64 séparés par des points, et un décodeur JWT inverse simplement l'encodage afin que vous puissiez les lire. Cette dernière phrase contient l’élément de sécurité le plus important de cet article : le décodage d’un jeton ne prouve rien à ce sujet. N'importe qui peut créer une charge utile, l'encoder et vous remettre un jeton bien formé. La vérification est une opération distincte qui nécessite la clé de signature.
Mis à jour
Les trois parties
- En-tête — l'algorithme de signature (`alg`) et le type de jeton (`typ`), par exemple HS256.
- Charge utile – les réclamations : à qui s'adresse le jeton, quand il a été émis et quand il expire.
- Signature — calculée sur les deux premiers segments avec la clé de l'émetteur, c'est pourquoi un décodeur l'affiche mais ne peut pas la vérifier.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 . eyJzdWIiOiIxMjMiLCJleHAiOjE3NjAwMDAwMDB9 . signature
header payload signature
Les affirmations qui expliquent la plupart des échecs
- `exp` (expiration) — la cause la plus courante d'un 401. Un jeton qui a expiré il y a deux minutes est rejeté avant que quoi que ce soit d'autre ne soit examiné.
- `nbf` (pas avant) — l'image miroir : un jeton utilisé avant sa fenêtre de validité est rejeté.
- `iat` (publié à) — utile pour déterminer l'âge d'une session et pour repérer les horloges qui ne sont pas d'accord.
- `aud` (audience) et `iss` (émetteur) — les discordances signifient ici que le jeton est valide mais a été émis pour un service différent, ce qui échoue de manière confuse.
Les revendications de temps sont des secondes UTC depuis l'époque Unix. Si un jeton semble valide mais expire beaucoup trop tôt ou trop tard, recherchez un problème d'horloge ou une charge utile transportant des millisecondes là où des secondes étaient attendues.
Pourquoi vous ne devriez jamais faire confiance aveuglément à `alg`
Deux attaques sont assez anciennes pour être célèbres et apparaissent encore dans la nature. L'algorithme `none` indique au vérificateur qu'il n'y a aucune signature ; un serveur qui lit l'en-tête au lieu d'appliquer son propre algorithme attendu l'accepte. Et dans la confusion RSA/HS, un attaquant signe avec la clé publique comme secret HMAC, trompant ainsi un serveur qui accepte les deux familles. Dans les deux cas, la défense réside dans le vérificateur, pas dans le décodeur : épinglez l'algorithme attendu côté serveur et ne le dérivez jamais du jeton lui-même.
Décoder localement, toujours
Un JWT est un identifiant : celui qui le détient peut agir en tant qu'utilisateur jusqu'à son expiration. En coller un vrai sur un site Web qui le publie sur un serveur transmet une session en direct sans aucun avantage, car le décodage est une arithmétique base64url que n'importe quel navigateur peut effectuer en microsecondes. Le décodeur YamlBox JWT analyse le jeton dans la page, affiche les revendications d'horodatage sous forme de dates UTC lisibles et continue de fonctionner avec le réseau désactivé - le seul type de décodeur qui vaut la peine d'être utilisé sur un jeton de production.
Une routine de débogage qui fonctionne
- Décodez et lisez d'abord `exp` — la moitié de tous les rapports de « jeton invalide » se terminent ici.
- Vérifiez `aud` et `iss` par rapport à ce que API attend, puis `nbf` pour le décalage d'horloge.
- Comparez les revendications décodées avec ce que votre code suppose concernant les rôles ou les étendues.
- Si les affirmations semblent correctes et échouent toujours, le problème est la vérification : mauvaise clé, secret pivoté ou incompatibilité d'algorithme.
JWT Décodeur — questions fréquemment posées
Est-ce que le décodage d'un JWT le vérifie ?
Le décodage inverse le codage base64url et ne nécessite aucune clé, il ne peut donc pas prouver l'authenticité. La vérification recalcule la signature avec la clé secrète ou publique de l'émetteur et constitue une étape distincte que seul le serveur peut effectuer.
Pourquoi mes JWT ont-ils déjà expiré ?
Vérifiez la déclaration `exp` par rapport à l'heure UTC actuelle. Les jetons sont généralement de courte durée (de quelques minutes à une heure) et un client qui en met un en cache dans une fenêtre d'actualisation est le coupable habituel. Comparez `iat` avec `exp` pour voir la durée de vie prévue par l'émetteur.
Est-il sécuritaire de coller un JWT de production dans un décodeur en ligne ?
Seulement dans celui qui décode entièrement dans votre navigateur. Un décodeur côté serveur reçoit un identifiant en direct et peut l'enregistrer. Préférez un décodeur côté client et considérez tout jeton que vous avez collé dans un site inconnu comme compromis.
Outils mentionnés dans cet article
Plus d'articles à lire
5 minutes de lecture
Base64 décoder et encoder : pour le transport, pas pour la
Base64 décode et encode dans le navigateur — la règle de taille 4/3, le remplissage, la variante base64url et le bug Unicode qui fait ressembler le texte décodé à des ordures.
5 minutes de lecture
Encodage URL : quand s'échapper et quand casser des choses
URL encode et décode correctement — caractères réservés, plus contre %20, encodeURI contre encodeURIComponent et les bogues de double encodage derrière les liens rompus.
5 minutes de lecture
Convertisseur d'horodatage : heure sans incertitude
Un convertisseur d'horodatage Unix qui fonctionne dans les deux sens : secondes par rapport aux millisecondes, UTC par rapport à l'heure locale et la limite 2038 qui brise encore les systèmes à longue durée de vie.