Cookie Security
Contexte
Les cookies sont le mécanisme principal pour stocker les tokens d'authentification côté navigateur. Mal configurés, ils exposent l'application à des attaques (XSS, CSRF, vol de session).
Attributs de sécurité
| Attribut | Rôle | Valeur recommandée |
|---|---|---|
HttpOnly |
Empêche l'accès JavaScript | true |
Secure |
Envoyé uniquement en HTTPS | true |
SameSite |
Protection CSRF | Lax ou Strict |
Path |
Scope du cookie | / ou chemin spécifique |
Max-Age |
Durée de vie | Dépend du token |
Domain |
Domaine autorisé | Domaine principal |
HttpOnly
Set-Cookie: token=abc123; HttpOnly
Empêche document.cookie d'accéder au cookie. Protège contre le vol de token par XSS :
// Attaque XSS — ne fonctionne PAS avec HttpOnly
document.cookie // → ne contient pas le token
Secure
Set-Cookie: token=abc123; Secure
Le cookie n'est envoyé que sur des connexions HTTPS. Sans cet attribut, un attaquant sur le réseau peut intercepter le cookie en HTTP.
SameSite
Contrôle quand le cookie est envoyé avec les requêtes cross-origin :
| Valeur | Comportement |
|---|---|
Strict |
Jamais envoyé en cross-origin (même en cliquant un lien) |
Lax |
Envoyé pour les navigations top-level (liens) mais pas les requêtes AJAX/form POST cross-origin |
None |
Toujours envoyé (nécessite Secure) |
Lax est le meilleur compromis pour la plupart des applications.
Implémentation Spring Boot
ResponseCookie cookie = ResponseCookie.from("access_token", token)
.httpOnly(true)
.secure(true)
.sameSite("Lax")
.path("/")
.maxAge(Duration.ofMinutes(15))
.build();
response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());
Pour supprimer un cookie (logout) :
ResponseCookie cookie = ResponseCookie.from("access_token", "")
.httpOnly(true)
.secure(true)
.sameSite("Lax")
.path("/")
.maxAge(0)
.build();
Cookie vs LocalStorage
| Critère | Cookie (HttpOnly) | LocalStorage |
|---|---|---|
| Accès JavaScript | Non | Oui |
| Protection XSS | Oui | Non |
| Envoi automatique | Oui (avec chaque requête) | Non (manuel) |
| Taille max | ~4 KB | ~5-10 MB |
| CSRF | Vulnérable (sans SameSite) | Non concerné |
Pour les tokens d'authentification, le cookie HttpOnly est la solution recommandée.
Attaques et protections
XSS → vol de token
- Protection :
HttpOnlyempêche l'accès JS au cookie
CSRF → requête forgée
- Protection :
SameSite=Lax+ token CSRF pour les mutations
Man-in-the-middle → interception
- Protection :
Secureforce HTTPS
Fixation de session
- Protection : régénérer le cookie après authentification
À retenir
- toujours utiliser
HttpOnly + Secure + SameSite=Laxpour les tokens - ne jamais stocker de tokens sensibles en localStorage
maxAge=0pour supprimer un cookie (logout)- les cookies sont envoyés automatiquement — attention au CSRF