Présentation des cookies SameSite

Browser Support

  • Chrome: 51.
  • Edge: 16.
  • Firefox: 60.
  • Safari: 13.

Chaque cookie contient une paire clé/valeur ainsi qu'un certain nombre d'attributs qui contrôlent quand et où ce cookie est utilisé.

L'introduction de l'attribut SameSite (défini dans la RFC6265bis) vous permet de déclarer si votre cookie est limité à un contexte propriétaire ou de même site. Il est utile de comprendre exactement ce que signifie "site" ici. Le site est la combinaison du suffixe de domaine et de la partie du domaine qui le précède. Par exemple, le domaine www.web.dev fait partie du site web.dev.

Terme clé : si l'utilisateur se trouve sur www.web.dev et demande une image à partir de static.web.dev, il s'agit d'une requête same-site.

La liste des suffixes publics définit les pages considérées comme faisant partie du même site. Il ne dépend pas uniquement des domaines de premier niveau tels que .com, mais peut également inclure des services tels que github.io. Cela permet à your-project.github.io et my-project.github.io d'être comptabilisés comme des sites distincts.

Terme clé : si l'utilisateur se trouve sur your-project.github.io et demande une image à partir de my-project.github.io, il s'agit d'une requête intersite.

Utiliser l'attribut SameSite pour déclarer l'utilisation des cookies

L'attribut SameSite d'un cookie propose trois façons différentes de contrôler ce comportement. Vous pouvez choisir de ne pas spécifier l'attribut, ou utiliser Strict ou Lax pour limiter le cookie aux requêtes du même site.

Si vous définissez SameSite sur Strict, votre cookie ne peut être envoyé que dans un contexte first party, c'est-à-dire si le site du cookie correspond au site affiché dans la barre d'adresse du navigateur. Ainsi, si le cookie promo_shown est défini comme suit :

Set-Cookie: promo_shown=1; SameSite=Strict

Lorsque l'utilisateur est sur votre site, le cookie est envoyé avec la requête comme prévu. Toutefois, si l'utilisateur suit un lien vers votre site depuis un autre site, le cookie n'est pas envoyé lors de cette requête initiale. Cette option est utile pour les cookies liés à des fonctionnalités qui se trouvent toujours derrière une navigation initiale, comme la modification d'un mot de passe ou un achat, mais elle est trop restrictive pour un cookie tel que promo_shown. Si votre lecteur suit le lien vers le site, il souhaite que le cookie soit envoyé afin que sa préférence puisse être appliquée.

SameSite=Lax permet au navigateur d'envoyer le cookie avec ces navigations de premier niveau. Par exemple, si un autre site fait référence au contenu de votre site, en l'occurrence en utilisant votre photo de chat et en fournissant un lien vers votre article comme suit :

<p>Look at this amazing cat!</p>
<img src="https://blog.example/blog/img/amazing-cat.png" />
<p>Read the <a href="https://blog.example/blog/cat.html">article</a>.</p>

Avec un cookie défini sur Lax comme suit :

Set-Cookie: promo_shown=1; SameSite=Lax

Lorsque le navigateur demande amazing-cat.png pour le blog de l'autre personne, votre site n'envoie pas le cookie. Toutefois, lorsque le lecteur suit le lien vers cat.html sur votre site, cette requête inclut le cookie.

Nous vous recommandons d'utiliser SameSite de cette manière, en définissant les cookies qui affectent l'affichage du site Web sur Lax et les cookies liés aux actions de l'utilisateur sur Strict.

Vous pouvez également définir SameSite sur None pour indiquer que vous souhaitez que le cookie soit envoyé dans tous les contextes. Si vous fournissez un service utilisé par d'autres sites, comme des widgets, du contenu intégré, des programmes d'affiliation, de la publicité ou une connexion sur plusieurs sites, utilisez None pour que votre intention soit claire.

Trois cookies étiquetés &quot;None&quot;, &quot;Lax&quot; ou &quot;Strict&quot; selon leur contexte
Marquez explicitement le contexte d'un cookie comme None, Lax ou Strict.

Modifications du comportement par défaut sans SameSite

Browser Support

  • Chrome: 80.
  • Edge: 86.
  • Firefox: behind a flag.
  • Safari: not supported.

L'attribut SameSite est largement accepté, mais il n'a pas été largement adopté. Auparavant, la définition de cookies sans SameSite entraînait par défaut leur envoi dans tous les contextes, ce qui exposait les utilisateurs à des attaques CSRF et à des fuites d'informations involontaires. Pour encourager les développeurs à indiquer leur intention et offrir aux utilisateurs une expérience plus sécurisée, la proposition de l'IETF, Incrementally Better Cookies, présente deux modifications clés :

  • Les cookies sans attribut SameSite sont traités comme SameSite=Lax.
  • Les cookies avec SameSite=None doivent également spécifier Secure, ce qui signifie qu'ils nécessitent un contexte sécurisé.

Ces deux modifications sont rétrocompatibles avec les navigateurs qui ont correctement implémenté la version précédente de l'attribut SameSite, ainsi qu'avec les navigateurs qui ne sont pas compatibles avec les versions antérieures de SameSite. Ils sont destinés à réduire la dépendance des développeurs vis-à-vis du comportement par défaut des navigateurs en rendant explicites le comportement des cookies et l'utilisation prévue. Les clients qui ne reconnaissent pas SameSite=None doivent l'ignorer.

SameSite=Lax par défaut

Si vous envoyez un cookie sans spécifier son attribut SameSite, le navigateur traite ce cookie comme s'il était défini sur SameSite=Lax. Nous vous recommandons tout de même de définir explicitement SameSite=Lax pour que l'expérience utilisateur soit plus cohérente d'un navigateur à l'autre.

SameSite=None doit être sécurisé

Lorsque vous créez des cookies intersites à l'aide de SameSite=None, vous devez également les définir sur Secure pour que le navigateur les accepte :

Set-Cookie: widget_session=abc123; SameSite=None; Secure

Vous pouvez tester ce comportement à partir de Chrome 76 en activant about://flags/#cookies-without-same-site-must-be-secure, et à partir de Firefox 69 en définissant network.cookie.sameSite.noneRequiresSecure dans about:config.

Nous vous recommandons également de mettre à jour les cookies existants vers Secure dès que possible. Si vous utilisez des services qui fournissent du contenu tiers sur votre site, assurez-vous que votre fournisseur de services met à jour ses cookies, et mettez à jour les extraits ou les dépendances de votre site pour vous assurer qu'il utilise le nouveau comportement.

Pour en savoir plus sur la mise à jour de vos cookies afin de gérer correctement ces modifications de SameSite=None et les différences de comportement des navigateurs, consultez l'article suivant : Recettes de cookies SameSite.

Nous remercions chaleureusement Lily Chen, Malte Ubl, Mike West, Rob Dodson, Tom Steiner et Vivek Sekhar pour leurs contributions et leurs commentaires.