Comprendre les JSON Web Tokens : vérifier correctement

Vérifier la signature vous dit que le jeton n’a pas été altéré. Cela ne vous dit rien sur l’opportunité d’agir dessus.

L’ordre compte

  1. Décidez l’algorithme vous-même, d’après votre configuration, et rejetez le jeton si son en-tête n’est pas d’accord.
  2. Sélectionnez la clé, par kid s’il est présent, dans votre propre jeu de clés.
  3. Vérifiez la signature, en ne lisant alg que dans l’en-tête protégé.
  4. Ensuite, et seulement ensuite, regardez les revendications.

Lire les revendications avant de vérifier est la façon dont un jeton forgé arrive à influencer votre choix de clé.

Les revendications à contrôler

  • exp : les jetons expirés sont refusés. Tolérez un petit décalage d’horloge, en secondes, pas en minutes.
  • nbf : pas encore valable est tout autant un refus.
  • iss : vient-il de l’émetteur attendu ? Un attaquant muni d’un jeton valable venu d’un autre émetteur ne doit aller nulle part.
  • aud : est-il pour vous ? Un jeton frappé pour un autre service n’est pas à vous d’accepter, même s’il se vérifie.

iss et aud sont les deux le plus souvent sautés, et ce sont les deux qui font qu’un jeton est le vôtre plutôt que simplement valable.

Ce qu’un JWT ne peut pas vous dire

S’il a été révoqué. Un jeton autoporteur est valable jusqu’à son expiration, point final. S’il vous faut la révocation, il vous faut un état de votre côté : une liste de refus indexée sur jti, ou des durées de vie courtes et un mécanisme de rafraîchissement.

Choisir une durée de vie de quinze minutes plutôt que de bâtir la révocation est une décision légitime. Croire qu’une signature rend la révocation inutile ne l’est pas.