Les pubs vous déplaisent ? Aller Sans pub Auj.

Les cookies HTTP Comment construire et parser correctement

Publié le
HTTP Cookies : Comment construire et analyser correctement 1
ANNONCE · Supprimer ?

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 explicite SameSite .
  • 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.

  • Expires prend une date absolue au format HTTP date. Cela est relatif au chronomètre du client, que vous ne pouvez pas contrôler.
  • Max-Age prend un nombre de secondes à partir du moment présent : Max-Age=86400 pour 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

AttributCe que cela faitDéfautRecommandation
HttpOnlyEmpêche l'accès au cookie via JavaScriptNon définiToujours défini pour les cookies d'authentification
SecureTransmission uniquement sur HTTPSNon définiToujours défini en production
SameSiteContrôle l'envoi entre sitesLax (navigateurs modernes)Lax pour les sessions ; None + Secure pour les cookies de tiers
DomainDéfinit la portée d'hôteHôte actuel uniquementOmettre sauf si une accès entre sous-domaines est nécessaire
PathDéfinit la portée de chemin/Laisser comme / sauf si vous souhaitez isoler les tokens d'administration
Max-AgeNombre de secondes avant l'expirationCookie de sessionPrivilégier par rapport à Expires
ExpiresDate absolue d'expirationCookie de sessionUtiliser 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

Envie d'une expérience sans pub ? Passez à la version sans pub

Installez nos extensions

Ajoutez des outils IO à votre navigateur préféré pour un accès instantané et une recherche plus rapide

Sur Extension Chrome Sur Extension de bord Sur Extension Firefox Sur Extension de l'opéra

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 !

ANNONCE · Supprimer ?
ANNONCE · Supprimer ?
ANNONCE · Supprimer ?

Coin des nouvelles avec points forts techniques

Impliquez-vous

Aidez-nous à continuer à fournir des outils gratuits et précieux

Offre-moi un café
ANNONCE · Supprimer ?