Secure, HttpOnly et SameSite : corriger les attributs des cookies
En bref : les cookies de session et de connexion doivent avoir Secure (envoyés uniquement en HTTPS), HttpOnly (illisibles par JavaScript, ce qui limite les dégâts d’une faille XSS) et SameSite=Lax ou Strict (non envoyés sur la plupart des requêtes intersites, ce qui aide contre le CSRF). Définissez-les là où le cookie est créé, ou ajoutez-les au niveau du serveur web en solution de repli.
Le code et la configuration restent en anglais.
Voyez ce que votre site envoie
curl -sI https://yourdomain.com | grep -i '^set-cookie'Sessions PHP
session.cookie_secure = 1
session.cookie_httponly = 1
session.cookie_samesite = "Lax"setcookie('name', $value, [
'expires' => time() + 3600,
'path' => '/',
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
]);WordPress
Les cookies de connexion de WordPress sont déjà HttpOnly. Assurez-vous que l’administration est uniquement en HTTPS pour qu’ils soient aussi Secure :
define( 'FORCE_SSL_ADMIN', true );Les cookies créés par les extensions dépendent de chaque extension. S’il manque des attributs à l’un d’eux, cherchez une mise à jour ou utilisez la solution de repli côté serveur ci-dessous.
nginx (en reverse proxy)
proxy_cookie_flags ~ secure httponly samesite=lax;Apache
Header edit Set-Cookie "^((?!.*;\s*Secure).*)$" "$1; Secure"
Header edit Set-Cookie "^((?!.*;\s*HttpOnly).*)$" "$1; HttpOnly"
Header edit Set-Cookie "^((?!.*;\s*SameSite).*)$" "$1; SameSite=Lax"Si les cookies viennent d’un backend derrière un proxy (par exemple PHP-FPM derrière ProxyPass) et que rien ne change, utilisez plutôt Header always edit.
Ne rien casser
- Les cookies que votre propre JavaScript doit lire (certains bandeaux de consentement, tests A/B) ne peuvent pas être HttpOnly.
SameSite=Noneest nécessaire pour les cookies utilisés dans des iframes tierces, et il exigeSecure.SameSite=Strictpeut déconnecter les utilisateurs qui arrivent depuis un lien dans un e-mail.Laxest le choix par défaut le plus sûr.
Questions fréquentes
Les cookies d’analyse ont-ils besoin de ces attributs ?
Secure, oui, sur un site HTTPS. HttpOnly seulement si aucun script n’a besoin de les lire, ce qui est rarement le cas pour l’analyse d’audience.
SameSite=Lax suffit-il contre le CSRF ?
Il bloque la plupart des envois de formulaires intersites, mais les formulaires qui modifient des données doivent quand même utiliser des jetons CSRF.
Pourquoi un scanner signale-t-il encore un attribut manquant après ma correction ?
Souvent, un cache de pages ou un CDN sert l’ancienne réponse, ou une extension crée son propre cookie. Videz le cache et revérifiez les lignes Set-Cookie.