JWT

2 tools

Fondamentaux de la sécurité Web

La sécurité Web est la pratique consistant à protéger les applications Web et les API contre les accès non autorisés, les violations de données et les attaques.

Les JSON Web Tokens (JWT) sont le mécanisme d'authentification sans état dominant dans le développement Web moderne.

JSON Web Tokens (JWT)

Un JWT est un moyen compact et sécurisé pour les URL de représenter des revendications entre deux parties. Il se compose de trois parties encodées en Base64url séparées par des points.

Les trois parties d'un JWT

Header

Contient les métadonnées du token : l'algorithme de signature (alg) et le type de token (typ).

Encodé
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Décodé
{
  "alg": "HS256",
  "typ": "JWT"
}
Payload

Contient les revendications : déclarations sur l'utilisateur. Les données du payload ne sont PAS chiffrées, seulement signées.

Encodé
eyJzdWIiOiJ1c2VyXzEyMyIsInJvbGUiOiJhZG1pbiIsImV4cCI6MTcxNzIwMDAwMH0
Décodé
{
  "sub": "user_123",
  "role": "admin",
  "exp": 1717200000
}
Signature

Une signature cryptographique sur l'en-tête et le payload encodés. La vérification garantit que le token n'a pas été altéré.

Encodé
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Décodé
HMACSHA256(
  base64url(header) + "." +
  base64url(payload),
  secret
)

Revendications JWT standard

La spécification JWT définit des noms de revendications standard pour garantir l'interopérabilité :

RevendicationNomDescription
issIssuerIdentifie le principal qui a émis le token
subSubjectIdentifie le principal qui est le sujet du token (ex. : ID utilisateur)
audAudienceIdentifie les destinataires pour lesquels le token est destiné
expExpirationTimestamp Unix après lequel le token ne doit plus être accepté
nbfNot BeforeTimestamp Unix avant lequel le token ne doit pas être accepté
iatIssued AtTimestamp Unix auquel le token a été émis
jtiJWT IDIdentifiant unique du token, utilisé pour prévenir les attaques par rejeu

Algorithmes de signature

L'algorithme de signature est déclaré dans l'en-tête JWT. Le bon choix est crucial pour la sécurité :

HS256 / HS384 / HS512Symétrique (HMAC)

Utilise une clé secrète partagée pour la signature et la vérification.

Utiliser quand : Services internes où toutes les parties sont contrôlées.
RS256 / RS384 / RS512Asymétrique (RSA)

Utilise une clé privée pour signer et une clé publique pour vérifier. La clé privée ne quitte jamais le serveur d'authentification.

Utiliser quand : Architectures de microservices, vérification de tokens tiers, OAuth2 et OpenID Connect.
ES256 / ES384 / ES512Asymétrique (ECDSA)

Comme RSA mais avec des clés plus petites et une signature plus rapide.

Utiliser quand : Applications mobiles et IoT où la performance est importante.
"alg": "none"Non signé — DANGEREUX

Aucune signature. Un token avec alg:none n'a aucune garantie d'intégrité.

Utiliser quand : Ne jamais utiliser en production.

Flux d'authentification

Flux par mot de passe (direct)
  1. 1.L'utilisateur envoie son nom d'utilisateur et mot de passe au point de terminaison de connexion
  2. 2.Le serveur valide les identifiants contre la base de données utilisateurs
  3. 3.Le serveur signe un JWT avec les revendications utilisateur et l'expiration
  4. 4.Le client stocke le JWT (localStorage, cookie ou mémoire)
  5. 5.Le client envoie le JWT dans l'en-tête Authorization: Bearer pour les requêtes suivantes
Code d'autorisation + PKCE (OAuth2)
  1. 1.Le client redirige l'utilisateur vers le serveur d'autorisation avec le défi de code
  2. 2.L'utilisateur s'authentifie et autorise l'application cliente
  3. 3.Le serveur d'authentification redirige avec un code d'autorisation à usage unique
  4. 4.Le client échange le code + vérificateur contre des tokens d'accès et de rafraîchissement
  5. 5.Le client utilise le token d'accès pour les appels API ; le token de rafraîchissement pour le renouvellement

Vulnérabilités JWT courantes

Les JWT sont sécurisés lorsqu'ils sont correctement implémentés. Voici les erreurs d'implémentation les plus courantes :

Confusion d'algorithme (alg:none)Critique

Certaines bibliothèques acceptent les tokens avec alg:none. Un attaquant peut modifier le payload et définir alg sur none pour forger n'importe quel JWT.

Confusion HS256/RS256Critique

Si une bibliothèque est censée vérifier RS256 mais accepte HS256, un attaquant peut signer un token en utilisant la clé publique comme secret HMAC.

Validation d'expiration manquanteÉlevé

Un JWT sans revendication exp permet une utilisation indéfinie des tokens. Toujours définir des durées d'expiration courtes.

Données sensibles dans le payloadÉlevé

Les payloads JWT sont encodés en Base64, pas chiffrés. Ne jamais stocker de mots de passe ou autres secrets dans les revendications JWT.

Clés secrètes faibles (HS256)Moyen

Les JWT signés HMAC avec des secrets courts ou prévisibles peuvent être forcés hors ligne.

Vérification de signature manquanteMoyen

Accepter des JWT sans vérifier la signature fait entièrement confiance au payload. Toujours vérifier la signature avant de faire confiance à une revendication.

Questions fréquentes

Les JWT sont-ils chiffrés ?

Les JWT standard (JWS) sont signés mais PAS chiffrés. Le payload est encodé en Base64url, facilement décodable.

Combien de temps un JWT doit-il être valide ?

Les tokens d'accès doivent être de courte durée : 5 à 60 minutes est typique. Utilisez des tokens de rafraîchissement pour obtenir de nouveaux tokens d'accès.

Où stocker les JWT dans le navigateur ?

Les cookies HttpOnly sont l'option la plus sécurisée — inaccessibles au JavaScript, empêchant le vol par XSS.

Puis-je révoquer un JWT avant son expiration ?

Pas sans état côté serveur. Solutions : délais d'expiration courts, liste de blocage de tokens (Redis).

Quelle est la différence entre JWT et les cookies de session ?

Les cookies de session stockent un ID de session aléatoire ; le serveur recherche les données de session. Les JWT sont autonomes — le serveur valide la signature sans requête de base de données.

Quelles revendications inclure dans un JWT ?

Le minimum : sub (ID utilisateur), exp (expiration) et iat (émis le). Gardez les payloads petits.

RS256 est-il meilleur que HS256 ?

RS256 (asymétrique) est préférable pour la plupart des systèmes de production car seul le serveur d'authentification a besoin de la clé privée.

Qu'est-ce que PKCE et pourquoi est-ce important ?

PKCE est une extension du flux de code d'autorisation OAuth2 qui empêche les attaques d'interception de code. Obligatoire pour les clients publics (SPA, applications mobiles).