Aller au contenu

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();

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 : HttpOnly empê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 : Secure force HTTPS

Fixation de session

  • Protection : régénérer le cookie après authentification

À retenir

  • toujours utiliser HttpOnly + Secure + SameSite=Lax pour les tokens
  • ne jamais stocker de tokens sensibles en localStorage
  • maxAge=0 pour supprimer un cookie (logout)
  • les cookies sont envoyés automatiquement — attention au CSRF

Voir aussi