Aller au contenu principal
CuteJSON
↑↓ Naviguer Enter Selectionner Esc Fermer

Comment fonctionnent les JWT : en-tête, charge utile, signature

Publie 4 min de lecture Par Akash Kinkar Pandey

Un JSON Web Token, RFC 7519, est une manière compacte de transporter un ensemble d'affirmations d'une partie à l'autre pour que le côté récepteur puisse avoir confiance en qui les a envoyées, ou au minimum vérifier que rien n'a changé en transit. Chaque JWT que vous verrez dans un en-tête Authorization: Bearer sont les mêmes trois morceaux joints par des points : header.payload.signature.

Les trois parties

L'en-tête et la charge utile sont chacun un objet JSON, encodé en base64url. L'en-tête nomme l'algorithme de signature et le type de token, généralement quelque chose d'aussi petit que {"alg":"HS256","typ":"JWT"}. La charge utile contient les affirmations : les données que le token transporte réellement, plus un ensemble de noms enregistrés avec des sens définis, iss (émetteur), sub (sujet), aud (audience), iat (émis le), nbf (pas avant) et exp (expiration) et jti (un identifiant de token). Aucun de cela n'est requis par la spécification au-delà de ce que l'émetteur choisit d'inclure, c'est pourquoi deux JWT de deux services différents peuvent transporter des affirmations complètement différentes.

La signature n'est pas du tout du JSON. C'est le résultat de l'exécution de l'en-tête et de la charge utile, toujours dans leur forme encodée, à travers l'algorithme nommé dans l'en-tête, HS256 (HMAC avec un secret partagé) et RS256/ES256 (RSA ou ECDSA avec une clé privée) étant ceux que vous rencontrerez le plus souvent. Décoder la signature en base64url vous donne des octets bruts sans structure supplémentaire à lire.

Encodé n'est pas chiffré

Base64url est un encodage, pas un chiffrement. N'importe qui tenant un JWT peut décoder l'en-tête et la charge utile avec rien de plus qu'un éditeur de texte, ce qui est exactement ce que fait le Décodeur JWT. Cela signifie qu'un JWT n'est jamais l'endroit approprié pour quoi que ce soit que vous ne mettriez pas dans une URL : un mot de passe, un numéro de carte de crédit, un nom complet que quelqu'un n'a pas accepté de divulguer. Si une charge utile doit rester confidentielle plutôt que simplement résistant à la falsification, cela nécessite un jeton de chiffrement Web JSON, un format différent et moins courant, pas un JWT signé avec un algorithme plus fort.

Décoder ne dit rien sur la confiance

C'est la partie pour laquelle les décodeurs sont le plus blâmés, il vaut donc la peine de l'affirmer clairement : lire les affirmations d'un JWT ne prouve rien sur la question de savoir si le token est authentique. Vérifier une signature signifie la recalculer avec le vrai secret ou la clé publique avec laquelle le token a été signé et vérifier qu'elle correspond, octet par octet. Un décodeur qui ne fait que séparer le token sur ses points et décoder deux des trois parties en base64url, ce que fait tout décodeur client pur, n'a pas accès à cette clé et ne peut pas effectuer cette vérification. Il peut vous dire ce qu'un token affirme. Il ne peut pas vous dire si vous devez le croire.

Un token bien formé, proprement décodé, peut toujours être contrefait, expiré, ou signé avec une clé qui n'a jamais été destinée à l'émetteur. exp et nbf valent la peine d'être vérifiés à chaque décodage pour exactement cette raison : un token dépassant son expiration, ou pas encore valide, est invalide que la vérification de sa signature réussisse ou non, et lire ces deux champs en tant que timestamps qu'ils représentent plutôt que des nombres bruts est la manière la plus rapide de le saisir en un coup d'œil.

À quoi ça sert

Malgré cette limitation, décoder sans vérifier a des usages réels, quotidiens : lire quels scopes un jeton d'accès a reçus lors du débogage d'une intégration d'API, vérifier si le token que votre application vient de recevoir a réellement expiré (plutôt que de deviner à partir d'un vague 401), ou inspecter ce que contient le token d'une tierce partie avant de décider si votre service a besoin de lui faire confiance en tout. Rien de tout cela ne nécessite la clé de signature, seulement le token lui-même.

Collez-en un dans le Décodeur JWT et il sépare l'en-tête, les affirmations enregistrées et la charge utile restante dans leurs propres lignes, signale immédiatement un token expiré ou pas encore valide, et affiche les octets bruts de la signature sans prétendre les avoir vérifiés contre quoi que ce soit.

Retour aux articles