Comment vérifier un JWT ?

Emmanuel Gautier Emmanuel Gautier ·
JWT

Comprendre les JWT (JSON Web Tokens) et savoir valider efficacement leur authenticité est essentiel. Le JWT est un outil polyvalent pour sécuriser les applications web et les API, il est donc primordial pour les développeurs de posséder les connaissances et compétences nécessaires à leur bonne vérification.

Dans cet article, nous explorons les fondamentaux des JWT, leur importance, et l’approche systématique que les développeurs devraient adopter pour les vérifier.

Pour résumer, voici les étapes pour vérifier un JWT, mais nous vous encourageons à lire l’article complet pour comprendre l’importance de chaque étape :

  1. Installez une bibliothèque JWT existante pour bénéficier de solutions de sécurité robustes et éprouvées
  2. Si vous utilisez le protocole OAuth2 et que vous le pouvez, privilégiez l’utilisation du endpoint d’introspection
  3. Configurez la bibliothèque avec l’algorithme de signature utilisé, l’emplacement du secret ou de la clé publique selon l’algorithme
  4. Si la bibliothèque utilisée n’effectue pas ces vérifications, vérifiez que le jeton contient l’émetteur (iss) et l’audience (aud) attendus

Comprendre le JWT

Le JSON Web Token, ou JWT, est une méthode de transmission de claims entre différentes entités. Ces claims prennent souvent la forme d’objets JSON et sont fréquemment utilisés pour faciliter l’authentification et l’autorisation des utilisateurs dans des environnements web. Le JWT se compose de trois éléments principaux :

Capture d'écran JWT.io

  1. Header : le header comprend au moins deux éléments, précisant le type de jeton (JWT) et l’algorithme de signature utilisé (par ex. HMAC ou RSA / ECDSA).
  2. Payload : le payload contient les claims, qui regroupent des déclarations concernant une entité (généralement l’utilisateur) et des données supplémentaires.
  3. Signature : la signature est générée par une combinaison du header encodé, du payload encodé, d’une clé secrète (pour les algorithmes basés sur HMAC), ou d’une clé publique (pour les algorithmes basés sur RSA/ECDSA), et de l’algorithme spécifié dans le header.

Importance de la vérification des JWT

Valider les JWT est une tâche indispensable pour les développeurs, pour les raisons clés suivantes :

  1. Authentification : les JWT servent de mécanisme pour confirmer l’identité des utilisateurs, empêchant ainsi les accès non autorisés.
  2. Autorisation : les JWT peuvent encapsuler des scopes d’autorisation applicatifs (scp), permettant aux développeurs de déterminer et d’appliquer des actions spécifiques.
  3. Intégrité des données : la signature numérique présente dans les JWT garantit que les données transmises restent inaltérées pendant le transit.

Vérification des jetons OAuth 2 (et OpenID Connect)

Dans le contexte d’OAuth2 ou des protocoles qui en découlent, comme OpenID Connect, une solution de validation des jetons consiste à utiliser le endpoint d’introspection. Le endpoint d’introspection constitue un mécanisme dédié à la validation des jetons JWT et offre un moyen efficace de vérifier la validité du jeton et d’obtenir les informations essentielles le concernant.

Cette approche décharge le processus de vérification du jeton de la Relying Party, permettant une gestion centralisée et une surveillance en temps réel des jetons côté serveur d’autorisation. Le principal avantage de centraliser le processus de vérification est qu’il rend l’invalidation du jeton quasi immédiate comparé à une approche décentralisée.

Voici un exemple d’utilisation du endpoint d’introspection :

POST /introspect HTTP/1.1
Host: server.example.com
Authorization : Basic <basic-header>
token=<access-token>

Le paramètre token dans le corps de la requête contient le jeton d’accès à introspecter.

La réponse du endpoint d’introspection inclut généralement le statut de validité du jeton, son scope, l’ID client, et d’autres informations pertinentes. La réponse peut ressembler à ceci :

{
"active": true,
"scope": "read write",
"client_id": "client_id",
"username": "user_id",
"token_type": "Bearer",
"exp": 1635200000,
"iat": 1635196400,
"nbf": 1635196400,
"sub": "user_id",
"aud": "https://api.example.com"
}

Si le jeton est valide, le champ active sera à true, indiquant que le jeton est actuellement actif et peut être utilisé pour accéder aux ressources protégées. Si le jeton est invalide, le champ active sera à false, signalant que le jeton ne doit pas être accepté, comme ceci :

{
"active": false
}

Avertissement SPoF

Il est important de noter que si le endpoint d’introspection peut être puissant pour la vérification des JWT, il introduit également un point unique de défaillance potentiel (SPoF) dans votre système. Dépendre uniquement du endpoint d’introspection signifie que s’il devient indisponible ou rencontre des problèmes, cela peut perturber tout votre processus d’authentification.

Il est donc conseillé de l’utiliser avec discernement, uniquement lorsqu’il y a un besoin réel de vérification de jeton en temps réel. Dans certains cas, une combinaison de l’introspection et d’autres méthodes de vérification, comme la validation de la signature JWT, peut offrir une approche plus robuste et tolérante aux pannes pour la vérification des JWT, réduisant ainsi le risque.

SPoF avec la vérification JWT basée sur le endpoint d'introspection

Prenez toujours en compte les exigences et contraintes spécifiques de votre système lorsque vous décidez d’adopter le endpoint d’introspection pour la vérification des JWT.

Vérification du JWT

Premièrement, il est fortement recommandé d’utiliser des bibliothèques de vérification JWT établies dans votre langage plutôt que de concevoir vos propres mécanismes de vérification basiques, afin de bénéficier de solutions de sécurité robustes et éprouvées. Consultez quelle bibliothèque existe pour votre langage pour la vérification JWT.

Lors de l’utilisation de ces bibliothèques, il est essentiel de configurer l’algorithme de signature attendu. Ne pas configurer l’algorithme attendu et utiliser celui présent dans le JWT peut conduire à une manipulation d’algorithme avec des vulnérabilités connues comme l’utilisation de l’algorithme None.

De plus, vous devrez configurer l’URL du secret ou de la clé publique, selon l’algorithme employé (secret pour HMAC et clé publique avec kid pour RSA et ECDSA).

Ces bibliothèques gèrent généralement la vérification des claims JWT essentiels, notamment :

  • Émetteur (iss)
  • Date d’expiration (exp)
  • Non valable avant (nbf).

De plus, votre service peut nécessiter la vérification de claims supplémentaires afin de limiter l’usage du jeton à des audiences ou scopes spécifiques, avec les claims suivants :

Si la bibliothèque prend en charge la vérification de l’émetteur et de l’audience, configurez-les avec vos valeurs attendues. En revanche, si la bibliothèque ne dispose pas de cette vérification, vous devrez vérifier manuellement ces claims avec une égalité stricte pour vous assurer qu’ils correspondent à vos valeurs attendues.

Documentation