Comprendre les JSON Web Tokens : les clés, avec JWK

Signer et chiffrer demandent tous deux des clés. La RFC 7517 définit comment représenter une clé en JSON, et comment en publier un jeu.

Une clé est un objet

{
  "kty": "EC",
  "crv": "P-256",
  "x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
  "y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0",
  "kid": "signing-2026-07",
  "use": "sig",
  "alg": "ES256"
}

kty est le seul membre obligatoire. Les autres comptent en pratique : kid nomme la clé, use dit si elle signe ou chiffre, alg la restreint à un seul algorithme.

Restreignez vos clés

use et key_ops ont l’air d’être de la documentation. Ils n’en sont pas. Une clé qui peut à la fois signer et chiffrer est une clé qu’un attaquant peut employer dans un protocole que vous n’aviez pas prévu. Déclarez la finalité la plus étroite et faites-la appliquer par votre bibliothèque.

Les jeux de clés, et ce qu’il faut publier

Un JWKSet est un objet doté d’un tableau keys. Publier le vôtre à une URL bien connue permet à d’autres de vérifier vos signatures sans aucun échange manuel. C’est ce que font les fournisseurs OpenID Connect.

Ne publiez que des clés publiques. Cela semble évident et c’est l’accident de loin le plus fréquent : une clé privée RSA diffère de sa contrepartie publique par quelques membres supplémentaires, d, p, q, et sérialiser le mauvais objet publie votre clé de signature à la face du monde.

Les empreintes

La RFC 7638 définit une empreinte : un condensé calculé sur les membres essentiels de la clé, dans un ordre canonique. Deux représentations de la même clé donnent la même empreinte, ce qui en fait un identifiant stable quand vous ne maîtrisez pas le kid.

La rotation sans interruption

La recette est la même partout et vaut d’être énoncée une fois :

  1. Ajoutez la nouvelle clé au jeu publié. Continuez de signer avec l’ancienne.
  2. Attendez que les consommateurs rafraîchissent leur copie. Leur durée de cache fixe ce délai, alors publiez un Cache-Control raisonnable.
  3. Commencez à signer avec la nouvelle clé. Gardez l’ancienne dans le jeu.
  4. Une fois que tous les jetons signés avec l’ancienne clé ont expiré, retirez-la.

Sauter l’étape 2 est ce qui fait qu’une rotation paraît instantanée en préproduction et casse en production.