JWT et sessions — bonnes pratiques de sécurité
Utiliser les JWT sans les pièges classiques : durée de vie, stockage, rotation des refresh tokens, validation stricte et révocation.
- #tls
- #mfa
- #least-privilege
Rappel
Un JWT = en-tête.charge.signature encodés en base64url. Il est signé, pas chiffré : n'y mettez aucune donnée sensible.
Validation stricte côté serveur
- Algorithme imposé (
RS256/EdDSA/HS256selon le cas) ; refuseralg: noneet toute confusion RS/HS. - Vérifier
exp,nbf,iss,aud. - Tolérance d'horloge limitée (≤ 60 s).
Durées de vie
| Jeton | Durée | Stockage |
|---|---|---|
| Access token | 5 à 15 min | cookie HttpOnly; Secure; SameSite=Lax ou mémoire |
| Refresh token | jours/semaines | cookie HttpOnly au chemin restreint (/auth) |
Évitez localStorage : tout XSS permet de voler le jeton.
Rotation des refresh tokens
- Chaque utilisation d'un refresh token en émet un nouveau et invalide l'ancien.
- Stockez les refresh tokens hachés en base avec une famille.
- Détection de réutilisation : si un refresh token déjà utilisé est présenté, révoquez toute la famille (vol probable) et forcez la reconnexion.
Révocation
Un JWT d'accès reste valide jusqu'à exp. Pour une révocation immédiate (désactivation de compte, changement de mot de passe) : durée courte + vérification d'un compteur de version de session ou liste de révocation en cache.
CSRF
Les cookies partent automatiquement : protégez les mutations par SameSite et un en-tête personnalisé ou un jeton CSRF.
Checklist
- Secrets de signature ≥ 256 bits, stockés hors du code, rotation planifiée (
kid). - Déconnexion = révocation serveur du refresh token.
- Journalisation des événements d'authentification (succès, échecs, réutilisation détectée).
- MFA pour les comptes à privilèges.