À propos de cet outil
Ce décodeur JWT lit la structure d'un JSON Web Token et affiche son en-tête et son contenu (payload) en clair, les revendications standard (émetteur, sujet, expiration…) avec leurs dates, et l'état de validité du token. Il peut aussi vérifier la signature avec votre clé secrète (HS256, HS384, HS512) ou votre clé publique au format PEM ou JWK (RS256, PS256, ES256…). Tout se passe dans votre navigateur : le token n'est jamais transmis.
Comment utiliser cet outil
- Collez votre JWT complet dans le champ de saisie, ou chargez l'exemple pour voir le fonctionnement.
- L'en-tête (header) et le contenu (payload) sont décodés et affichés en JSON lisible.
- Repérez les pastilles : algorithme, type, et état d'expiration (expiré, valide pour encore…).
- Consultez le tableau des revendications reconnues (iss, sub, aud, exp, nbf, iat, jti) avec les dates converties.
- Pour vérifier l'authenticité, saisissez la clé secrète ou la clé publique : l'outil indique si la signature est valide.
Anatomie d'un JWT : trois parties séparées par des points
Un JSON Web Token (JWT, prononcé « jot ») est une chaîne compacte qui transporte des informations signées, par exemple l'identité d'un utilisateur après sa connexion. Il se compose de trois parties encodées en Base64URL (un Base64 sans « + », « / » ni « = ») et séparées par des points : en-tête.contenu.signature.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Décodé, l'en-tête vaut {"alg":"HS256","typ":"JWT"} (algorithme de signature et type) et le contenu {"sub":"1234567890","name":"John Doe","iat":1516239022} (identifiant du sujet, nom, date d'émission le 18 janvier 2018). La signature est un HMAC-SHA-256 de « en-tête.contenu » calculé avec la clé secrète your-256-bit-secret : collez ce jeton dans l'outil avec cette clé pour la vérifier.
- L'en-tête (header) précise l'algorithme de signature (
alg) et souvent l'identifiant de la clé (kid). - Le contenu (payload) porte les « revendications » (claims), c'est-à-dire les informations transportées.
- La signature prouve que l'en-tête et le contenu n'ont pas été modifiés depuis leur émission et qu'ils proviennent du détenteur de la clé.
Les revendications standard (claims)
La norme RFC 7519 définit sept revendications « enregistrées », toutes facultatives mais très utilisées :
| Clé | Nom | Signification |
|---|---|---|
iss | Émetteur (issuer) | Qui a créé et signé le jeton. |
sub | Sujet (subject) | L'entité concernée, en général un identifiant d'utilisateur. |
aud | Audience | Pour qui le jeton est destiné (service ou API). |
exp | Expiration | Date à partir de laquelle le jeton ne doit plus être accepté. |
nbf | Pas avant (not before) | Date avant laquelle le jeton ne doit pas encore être accepté. |
iat | Émis à (issued at) | Date de création du jeton. |
jti | Identifiant du jeton | Identifiant unique, utile pour détecter un rejeu ou révoquer un jeton. |
Les dates exp, nbf et iat sont des « dates numériques » : le nombre de secondes écoulées depuis le 1er janvier 1970 en UTC, c'est-à-dire un timestamp Unix en secondes. L'outil les convertit en dates lisibles ; vous pouvez aussi les vérifier avec le convertisseur de timestamp. Les serveurs tolèrent généralement quelques dizaines de secondes de décalage d'horloge (leeway) avant de refuser un jeton à peine expiré ou pas encore valide.
Les algorithmes de signature : secret partagé ou clé publique
| Famille | Principe | Clé de vérification | Quand la choisir |
|---|---|---|---|
| HS256, HS384, HS512 | HMAC avec SHA-2 | Le même secret sert à signer et à vérifier. | Un seul service émet et vérifie ses propres jetons. |
| RS256, RS384, RS512 | RSA (PKCS#1 v1.5) | Une clé publique vérifie ; seule la clé privée signe. | Un fournisseur d'identité signe, de nombreux services vérifient. |
| PS256, PS384, PS512 | RSA-PSS | Clé publique. | Même usage que RS, avec un schéma de signature plus récent. |
| ES256, ES384, ES512 | ECDSA (courbes P-256, P-384, P-521) | Clé publique. | Signatures et clés plus courtes qu'en RSA. |
none | Aucune signature | Aucune. | Presque jamais : un jeton sans signature n'authentifie rien. |
Avec un algorithme à clé publique, l'émetteur publie ses clés publiques sous forme d'un ensemble de clés au format JWK (RFC 7517), à une adresse bien connue. Les services identifient la bonne clé grâce à la valeur kid de l'en-tête. L'outil accepte une clé publique au format PEM ou JWK et un secret saisi en texte pour les algorithmes HS.
Pour un secret HMAC, l'OWASP recommande au minimum la taille de la sortie du hachage (256 bits pour HS256, 384 pour HS384, 512 pour HS512), tirée d'un générateur aléatoire cryptographique, jamais un mot de passe mémorisable. Pour en fabriquer un, voyez le générateur de mots de passe.
Un JWT est signé, pas chiffré
C'est l'idée reçue la plus dangereuse : le contenu d'un JWT signé est lisible par toute personne qui détient le jeton. L'encodage Base64URL n'est pas un chiffrement : la preuve, l'outil le décode sans aucune clé. La signature garantit seulement l'intégrité et l'origine du contenu, pas sa confidentialité.
- N'y mettez pas de mot de passe, de données de santé, de numéro de carte ni de renseignement personnel inutile. Préférez un identifiant opaque, et laissez le serveur retrouver les détails.
- Pour un contenu qui doit rester confidentiel, la norme prévoit une variante chiffrée, le JWE (RFC 7516). La pratique recommandée est de signer d'abord, puis de chiffrer le jeton signé.
- Ne collez pas de jetons de production d'un compte sensible dans un site tiers. Cet outil travaille entièrement dans votre navigateur, mais la prudence reste de mise : utilisez de préférence des jetons de test ou déjà expirés.
Les vulnérabilités classiques et la liste de contrôle du serveur
Les attaques sur les JWT visent presque toujours une validation incomplète côté serveur. Les recommandations de la RFC 8725 et de l'OWASP se résument ainsi :
- Imposez la liste des algorithmes acceptés. Ne faites jamais confiance à l'en-tête du jeton pour choisir l'algorithme de vérification. Chaque clé ne doit servir qu'avec un algorithme.
- Refusez
alg: none. Un jeton « non sécurisé » peut être fabriqué par n'importe qui avec le contenu de son choix. L'outil le signale par un avertissement. - Évitez la confusion d'algorithmes. Dans l'attaque classique, un jeton déclare HS256 alors que le serveur attend RS256 : si la bibliothèque utilise la clé publique RSA, connue de tous, comme secret HMAC, l'attaquant peut signer un jeton valide. Fixer l'algorithme attendu l'empêche.
- Vérifiez les revendications : la signature n'est pas suffisante. Contrôlez
expetnbf(avec une tolérance faible), l'émetteurisset l'audienceaud, afin qu'un jeton valide pour un service ne soit pas accepté par un autre. - Utilisez des secrets robustes pour les algorithmes HMAC : un secret faible peut être retrouvé par force brute hors ligne à partir d'un seul jeton.
- Prévoyez la révocation. Un JWT valide le reste jusqu'à son expiration. Retenez des durées de vie courtes, et si une liste de révocation est nécessaire, indexez-la sur l'identifiant
jtiet l'émetteur plutôt que sur le jeton lui-même.
Enfin, un jeton est envoyé au serveur dans l'en-tête Authorization: Bearer <jeton>. Où le conserver côté navigateur (cookie HttpOnly ou stockage JavaScript) est un choix de sécurité à part entière : un stockage lisible par JavaScript expose le jeton à une faille XSS, un cookie impose de se protéger contre le CSRF. Pour préparer le contenu d'un jeton de test, le formateur JSON valide la syntaxe du contenu.
Questions fréquentes
Comment lire le contenu d'un token JWT ?
Collez le token complet (les trois parties séparées par des points) : l'outil décode l'en-tête et le contenu, encodés en Base64URL, et les affiche en JSON lisible. Le contenu d'un JWT n'est pas chiffré : n'importe qui détenant le token peut le lire.
Cet outil vérifie-t-il la signature du token ?
Oui, dès que vous fournissez la clé : clé secrète pour HS256, HS384 et HS512, clé publique PEM (BEGIN PUBLIC KEY) ou JWK pour RS256, PS256 et ES256 (et leurs variantes 384 et 512). Sans clé, le contenu est décodé mais son authenticité n'est pas garantie. Dans une application, la vérification doit toujours être faite côté serveur.
Pourquoi mon token est-il marqué comme expiré ?
La revendication exp contient la date d'expiration en secondes depuis le 1er janvier 1970 (UTC). Si cette date est dans le passé, le serveur doit refuser le token. L'outil la convertit en date lisible et affiche l'écart par rapport à maintenant.
Qu'est-ce que l'algorithme « none » ?
Un JWT « alg: none » n'est pas signé : n'importe qui peut en fabriquer un avec le contenu de son choix. Un serveur ne doit jamais l'accepter. L'outil le signale par une pastille d'avertissement.
Un JWT décodé est-il sensible ?
Oui. Le contenu peut révéler des informations sur l'utilisateur, et tant que le token n'a pas expiré il donne accès à un compte. Le décodage et la vérification se font entièrement dans votre navigateur, mais évitez de partager un token de production avec un tiers.