Les cookies HTTP sont partout. Chaque session de connexion, chaque panier d'achat et chaque outil d'analyse repose sur eux. Pourtant, la plupart des développeurs copient-collent une Set-Cookie en-tête et s'arrêtent là sans comprendre ce que font exactement les attributs — ou ce qui se passe quand ils sont mal utilisés.
Ce guide explique l'anatomie des cookies, tous les attributs significatifs, la manière de parser les chaînes de cookies, et pourquoi SameSite est votre défense contre les attaques CSRF. Si vous souhaitez commencer immédiatement, essayez le IO Tools Parseur de Cookie ou le Construire un Cookie.
Quelque chose que ressemble réellement à un cookie
Quand un serveur souhaite définir un cookie, il envoie une Set-Cookie en-tête de réponse :
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=86400
Le navigateur stocke cela et l'envoie à nouveau sur les demandes suivantes sous la forme de :
Cookie: sessionId=abc123
C'est tout le mécanisme. La complexité réside dans ces attributs.
Anatomie du cookie : décomposition de la chaîne
Une chaîne de cookie suit un format constant :
name=value; attribute1; attribute2=attributeValue; ...
Le name=value le couple apparaît en premier. Tout ce qui suit le premier point-virgule est une directive pour le navigateur — le serveur ne voit jamais ces attributs dans l' Cookie en-tête qu'il reçoit.
Les attributs de sécurité que vous devez bien comprendre
HttpOnly
HttpOnly empêche JavaScript de lire le cookie via document.cookie. C'est une défense directe contre les attaques XSS volant les tokens de session.
Set-Cookie: sessionId=abc123; HttpOnly
Tout cookie qui authentifie un utilisateur doit avoir HttpOnly. Il n'y a aucune bonne raison de ne pas le faire.
Sécurisé
Secure signifie que le navigateur envoie le cookie uniquement sur des connexions HTTPS. Sans cela, le cookie se déplace en clair sur HTTP et peut être intercepté. En production, les cookies de session doivent toujours avoir Secure. En développement local sur http://localhost, vous pouvez l'ommettre — les navigateurs font une exception pour localhost.
SameSite
SameSite gère quand le navigateur inclut un cookie dans des requêtes entre sites. C'est la principale défense contre les attaques CSRF. Trois valeurs :
Strict— le cookie n'est jamais envoyé lors des requêtes entre sites. Le plus sécurisé, mais les utilisateurs cliquant sur un lien dans un e-mail se voient déconnectés (le cookie n'est pas envoyé lors de cette navigation initiale).Lax— le cookie est envoyé lors des navigations au niveau supérieur (requêtes GET) depuis des sites externes, mais pas lors des requêtes entre sites embarquées ou des requêtes POST entre sites. C'est la valeur par défaut des cookies sans attribut expliciteSameSite.None— le cookie est envoyé sur toutes les requêtes entre sites. Nécessaire pour les cookies de tiers (flux OAuth, widgets embarqués). Doit être associé àSecure.
# Third-party / cross-site cookie (e.g., OAuth callback)
Set-Cookie: token=xyz; SameSite=None; Secure
Si vous envoyez SameSite=None sans Secure, les navigateurs modernes rejettent le cookie entièrement. Pour la plupart des cookies de session, utilisez SameSite=Lax — cela équilibre la sécurité avec une expérience d'authentification utilisable.
Portée : domaine et chemin
Domaine
Le Domain l'attribut spécifie les noms d'hôte qui reçoivent le cookie.
Set-Cookie: user=alice; Domain=example.com
Avec Domain=example.com, le cookie est envoyé à example.com et à toutes les sous-domaines (api.example.com, app.example.com). Sans attribut Domain , le cookie est envoyé uniquement à l'origine exacte qui l'a défini — pas aux sous-domaines.
Mauvaise croyance courante : définir Domain=example.com ne pas restreint le cookie à juste example.com. Il étend la portée pour inclure les sous-domaines. Omettez l'attribut si vous voulez un cookie sur un seul hôte.
Chemin
Path limite les chemins URL qui déclenchent l'envoi du cookie.
Set-Cookie: adminToken=xyz; Path=/admin
Ce cookie ne suit que les demandes vers /admin et les chemins situés sous ce chemin. Une demande vers / ou /api ne le contiendrait pas. La valeur par défaut est /, c'est-à-dire tous les chemins.
Max-Age vs Expires
Les deux contrôlent la date d'expiration d'un cookie. Privilégiez Max-Age.
Expiresprend une date absolue au format HTTP date. Cela est relatif au chronomètre du client, que vous ne pouvez pas contrôler.Max-Ageprend un nombre de secondes à partir du moment présent :Max-Age=86400pour 24 heures. Relatif à l'intention du serveur, pas au chronomètre du client.
Quand les deux sont présents, Max-Age a priorité. Un cookie sans attribut n'est pas un cookie de session — il disparaît quand le navigateur se ferme.
Référence des attributs du cookie
| Attribut | Ce que cela fait | Défaut | Recommandation |
|---|---|---|---|
HttpOnly | Empêche l'accès au cookie via JavaScript | Non défini | Toujours défini pour les cookies d'authentification |
Secure | Transmission uniquement sur HTTPS | Non défini | Toujours défini en production |
SameSite | Contrôle l'envoi entre sites | Lax (navigateurs modernes) | Lax pour les sessions ; None + Secure pour les cookies de tiers |
Domain | Définit la portée d'hôte | Hôte actuel uniquement | Omettre sauf si une accès entre sous-domaines est nécessaire |
Path | Définit la portée de chemin | / | Laisser comme / sauf si vous souhaitez isoler les tokens d'administration |
Max-Age | Nombre de secondes avant l'expiration | Cookie de session | Privilégier par rapport à Expires |
Expires | Date absolue d'expiration | Cookie de session | Utiliser Max-Age à la place |
Mise en place des cookies dans le code
Node.js (Express)
app.post('/login', (req, res) => {
// ... verify credentials ...
res.cookie('sessionId', token, {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
maxAge: 86400 * 1000, // milliseconds in Express
path: '/',
});
res.json({ ok: true });
});
Python (FastAPI)
from fastapi import FastAPI, Response
app = FastAPI()
@app.post("/login")
def login(response: Response):
# ... verify credentials ...
response.set_cookie(
key="sessionId",
value=token,
httponly=True,
secure=True,
samesite="lax",
max_age=86400,
path="/",
)
return {"ok": True}
Analyse manuelle des en-têtes de cookie
Le Cookie l'en-tête que le serveur reçoit contient uniquement name=value paires, séparées par ; :
Cookie: sessionId=abc123; theme=dark; lang=en
Pour les analyser manuellement : diviser par ; (point-virgule + espace), puis diviser chaque paire par le premier = seulement. Des cas particuliers à connaître :
- Les valeurs peuvent contenir
=(des chaînes base64 couramment utilisées) — diviser toujours par le premier=seulement - Les noms de cookie sont sensibles à la casse
- L'espace autour du séparateur peut varier — supprimer défensivement les espaces de chaque côté
Au lieu d'écrire vous-même la logique de division, utilisez le IO Tools Parseur de Cookie pour décoder toute Cookie en-tête et inspecter chaque valeur, ou le IO Tools Constructeur de Cookie pour construire une en-tête de cookie valide avec les attributs corrects. Set-Cookie Les cookies et les attaques CSRF
L'attaque de requête entre sites exploite le fait que les navigateurs incluent automatiquement les cookies dans les requêtes vers un domaine, même lorsqu'elles sont initiées par un site différent. Une page malveillante à
peut soumettre un formulaire à evil.com , et si l'utilisateur est connecté, le navigateur envoie son cookie de session avec la requête falsifiée. bank.com/transferdéfait la plupart des vecteurs CSRF car les requêtes entre sites — le modèle d'attaque typique — n'incluent pas le cookie.
SameSite=Lax est encore plus rigoureux mais peut affecter l'expérience d'utilisation. SameSite=Strict Les tokens CSRF restent valables comme défense en profondeur, surtout pour des opérations critiques et lorsque
est requise pour un contexte de tiers. Ces deux défenses s'entraident. SameSite=None Les cookies HTTP : comment les construire et les parser correctement 2
Vous aimerez peut-être aussi
Installez nos extensions
Ajoutez des outils IO à votre navigateur préféré pour un accès instantané et une recherche plus rapide
恵 Le Tableau de Bord Est Arrivé !
Tableau de Bord est une façon amusante de suivre vos jeux, toutes les données sont stockées dans votre navigateur. D'autres fonctionnalités arrivent bientôt !
Outils essentiels
Tout voir Nouveautés
Tout voirMise à jour: Notre dernier outil was added on Mai 22, 2026
