Comment créer un JWT signé
- Choisissez l’Algorithme. Le champ
algde En-tête (JSON) suit automatiquement la sélection. - Modifiez Payload (JSON). + iat maintenant insère l’heure actuelle, + exp dans 1 h fixe une expiration une heure plus tard ; les deux utilisent des secondes, comme l’exige la spécification JWT.
- Pour HS256, HS384 ou HS512, saisissez le Secret et réglez Le secret est sur Texte, Base64 ou Hex. Pour les autres algorithmes, collez une clé privée ou appuyez sur Générer une paire de clés.
- Copier le jeton, ou appuyez sur Ouvrir dans le décodeur pour le vérifier : l’onglet Décoder et vérifier s’ouvre avec le jeton et la clé de vérification déjà remplis.
L’exemple chargé au départ est un vrai jeton HS256 signé avec le secret base64hub-demo-secret : modifiez un claim et regardez la signature changer avec lui.
Choisir un algorithme
| Algorithme | Type de clé | Qui peut vérifier | Signature dans le jeton |
|---|---|---|---|
| HS256 | Secret partagé (HMAC-SHA256) | Quiconque détient le même secret | 43 caractères |
| RS256, PS256 | Clé privée RSA, 2048 bits ou plus | Quiconque a la clé publique | 342 caractères (RSA-2048) |
| ES256 | Clé privée EC sur P-256 | Quiconque a la clé publique | 86 caractères |
| EdDSA | Clé privée Ed25519 | Quiconque a la clé publique | 86 caractères |
HS256 est le choix le plus simple quand un seul service signe et vérifie, comme un jeton de session contrôlé par le même backend. Dès qu’une deuxième partie doit vérifier, lui confier un secret HMAC lui permet aussi de fabriquer des jetons : passez alors à un algorithme asymétrique et ne publiez que la clé publique. ES256 et EdDSA donnent des jetons bien plus courts que RSA, ce qui compte pour les cookies et les en-têtes. PS256 est du RSA avec le schéma de remplissage PSS ; ne le choisissez que si tous les vérificateurs le prennent en charge.
none figure dans la liste pour tester des analyseurs. Un jeton avec alg: none a une signature vide, et tout serveur qui l’accepte peut être trompé par n’importe qui : l’outil le signale donc par un avertissement.
Clés acceptées et générées par cet encodeur
Pour signer, il accepte une clé PEM PKCS#8 (BEGIN PRIVATE KEY), une RSA PRIVATE KEY PKCS#1, une EC PRIVATE KEY SEC1 ou un JWK privé. Pour créer des clés de test avec OpenSSL plutôt qu’avec le générateur :
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out rsa.pem
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out ec.pem
openssl genpkey -algorithm ed25519 -out ed.pem
openssl pkey -in ec.pem -pubout -out ec.pub
Générer une paire de clés crée dans le navigateur, avec WebCrypto, des clés RSA-2048, P-256, P-384, P-521 ou Ed25519 selon l’algorithme. Vous obtenez la clé privée en PEM PKCS#8, la clé publique en PEM SPKI et un JWKS dont le kid est l’empreinte RFC 7638 de la clé. Le JWKS est ce que vous serviriez depuis un jwks_uri pour que les vérificateurs le téléchargent.
Pour HS256, le secret est utilisé sous forme d’octets. Si votre serveur lit le secret dans une variable d’environnement et le décode d’abord depuis le Base64, réglez aussi Le secret est sur Base64 ici, sinon les signatures ne correspondront pas. Une valeur issue du préréglage Secret JWT HS256 du générateur de clés Base64 est en Base64URL et se décode en 32 octets.
Quels claims mettre dans le payload
Un access token utile contient généralement iss (qui l’a émis), sub (qui il concerne), aud (à quelle API il est destiné), iat et un exp court. Ajoutez jti si vous devez pouvoir révoquer des jetons un par un. Les dates sont des secondes entières depuis 1970 ; si vous les construisez en JavaScript, utilisez Math.floor(Date.now() / 1000), car Date.now() renvoie des millisecondes.
Le payload est signé, jamais chiffré. Quiconque voit le jeton peut le décoder avec un décodeur JWT : n’y mettez ni mots de passe, ni clés d’API, ni données personnelles que vous n’écririez pas dans un log.
Signer un JWT dans le code
Le format est assez simple pour être construit à la main, ce qui aide à déboguer une bibliothèque. Cette fonction Node.js produit exactement le jeton que donne jwt.encode(payload, secret, algorithm="HS256") de PyJWT pour la même entrée :
const crypto = require("crypto");
const b64url = (obj) => Buffer.from(JSON.stringify(obj)).toString("base64url");
function signHS256(payload, secret) {
const input = b64url({ alg: "HS256", typ: "JWT" }) + "." + b64url(payload);
const sig = crypto.createHmac("sha256", secret).update(input).digest("base64url");
return input + "." + sig;
}
console.log(signHS256({ sub: "user-42", iat: 1767225600, exp: 1767229200 },
"replace-me-with-32-random-bytes!"));
Elle affiche eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyLTQyIiwiaWF0IjoxNzY3MjI1NjAwLCJleHAiOjE3NjcyMjkyMDB9.F3xnXnXW8nUQy-Ay37DF626Lb5lHPKI3IFvqoEf3mTw. Saisissez le même en-tête, le même payload et le même secret sur cette page et vous obtenez la même chaîne. L’outil compacte le JSON avant de signer : l’indentation n’a donc pas d’importance, mais l’ordre des clés, si, car la signature porte sur les octets exacts. En production, utilisez une bibliothèque maintenue ; voir Base64 en Node.js pour la partie encodage.
FAQ
Quelle longueur doit avoir un secret HS256 ?
Au moins 256 bits, soit 32 octets aléatoires. La RFC 7518 exige une clé au moins aussi longue que la sortie du hachage. Un secret court du genre mot de passe peut être retrouvé par force brute hors ligne à partir d’un seul jeton : générez-en un avec le générateur de clés Base64.
Faut-il utiliser HS256 ou RS256 ?
HS256 quand le même service émet et vérifie les jetons, car les deux côtés partagent un seul secret. RS256, ES256 ou EdDSA quand d’autres parties doivent vérifier, puisqu’elles ne reçoivent que la clé publique et ne peuvent pas fabriquer de jetons elles-mêmes.
Pourquoi ma clé privée affiche-t-elle une erreur ?
Les clés protégées par mot de passe (BEGIN ENCRYPTED PRIVATE KEY) sont refusées. Retirez la phrase secrète avec openssl pkey -in key.pem -out plain.pem et collez le résultat. Le type de clé doit aussi correspondre à l’algorithme : une clé EC ne peut pas signer en RS256.
Comment ajouter un kid au jeton ?
Après Générer une paire de clés, copiez le kid de la sortie JWKS et ajoutez-le au JSON de l’en-tête, par exemple "kid": "…". Les vérificateurs s’en servent pour choisir la bonne clé dans leur jeu de clés.