JWT : le jeton auto-porteur
Signature ≠ chiffrement ; révocation et compromis.
Objectifs
À la fin de cette leçon, vous saurez :
- décoder la structure header.payload.signature d'un JWT ;
- comprendre ce qu'une signature prouve — et ne prouve pas ;
- choisir entre sessions et JWT selon le cas.
🔗 Pour vous rafraîchir la mémoire : encodage, hachage, chiffrement · en-têtes HTTP et JSON
Trois parties, un point chacune
eyJhbGciOiJIUzI1NiJ9 . eyJzdWIiOiIxIn0 . SflKxwRJSM...
└── header ──┘ └─ payload ─┘ └ signature ─┘
{alg:HS256} {sub:"1"} HMAC(header+payload, clé)
Chaque partie est du Base64URL de JSON : décodable par tous. Le payload n'est PAS chiffré — testez sur jwt.io avec n'importe quel jeton.
Ce que la signature garantit (et l'inverse)
GARANTI : le payload n'a pas été modifié depuis l'émission
(toute altération invalide la signature)
NON GARANTI : la confidentialité — tout le monde LIT le payload
Le serveur vérifie en recalculant la signature avec SA clé secrète : pas besoin de base pour authentifier le jeton. C'est là sa force et sa faiblesse :
| Sessions serveur | JWT | |
|---|---|---|
| Vérification | lookup en base | calcul local |
| Révocation immédiate | ✅ DELETE | ❌ jusqu'à expiration |
| Multi-serveurs sans état partagé | ❌ besoin de la base | ✅ |
| Données dans le jeton | non (opaque) | oui (lisibles !) |
Le cycle de vie typique
login → access token (15 min) + refresh token (7 jours)
requêtes : Authorization: Bearer <access>
access expiré → refresh → nouvel access
logout côté client = jeter les jetons (le serveur ne sait pas !)
L'access court limite les dégâts d'un vol ; le refresh long maintient le confort. Pour une vraie révocation, il faut malgré tout garder une liste noire... c'est-à-dire réintroduire l'état serveur. Rien n'est gratuit.
Quand choisir quoi
Application web classique, un domaine → sessions serveur (Devmind)
API publique consommée par des tiers → JWT ou OAuth2
Microservices qui se font confiance → JWT signé transmis
Exercice
- Décodez à la main (Base64URL) le payload d'un JWT fabriqué sur jwt.io.
- Peut-on « hacker » un JWT en changeant sub=1 en sub=2 ? Que manque-t-il ?
- Pourquoi Devmind a-t-il choisi les sessions plutôt que des JWT ?
Résumé
- JWT signé ≠ chiffré : lisible par tous, infalsifiable seulement.
- Sans état = sans révocation ; chaque modèle paie son prix.
- Sessions pour les apps web propriétaires ; JWT pour l'interopérabilité.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 2. Modifier le payload invalide la signature. Il faudrait la recalculer avec la clé secrète du serveur — précisément ce qu'il vous manque. La sécurité repose entièrement sur le secret bien gardé.
Question 3. Une application web monolithe avec un seul backend n'a pas besoin de vérification sans état ; elle a besoin de logout immédiat, de suspension de compte effective et de cookies HttpOnly — trois points où les sessions gagnent.