Explicação sobre cookies SameSite

Browser Support

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

Cada cookie contém um par de chave-valor e vários atributos que controlam quando e onde ele é usado.

A introdução do atributo SameSite (definido na RFC6265bis) permite declarar se o cookie está restrito a um contexto primário ou do mesmo site. É útil entender exatamente o que "site" significa aqui. O site é a combinação do sufixo de domínio e da parte do domínio que vem logo antes dele. Por exemplo, o domínio www.web.dev faz parte do site web.dev.

Termo-chave: se o usuário estiver em www.web.dev e solicitar uma imagem de static.web.dev, essa será uma solicitação same-site.

A lista de sufixos públicos define quais páginas são consideradas como parte do mesmo site. Ele não depende apenas de domínios de nível superior, como .com, mas também pode incluir serviços como github.io. Isso permite que your-project.github.io e my-project.github.io sejam contados como sites separados.

Termo-chave: se o usuário estiver em your-project.github.io e solicitar uma imagem de my-project.github.io, essa será uma solicitação entre sites.

Usar o atributo SameSite para declarar o uso de cookies

O atributo SameSite em um cookie oferece três maneiras diferentes de controlar esse comportamento. Você pode optar por não especificar o atributo ou usar Strict ou Lax para limitar o cookie a solicitações do mesmo site.

Se você definir SameSite como Strict, o cookie só poderá ser enviado em um contexto próprio, ou seja, se o site do cookie corresponder ao site mostrado na barra de endereço do navegador. Portanto, se o cookie promo_shown estiver definido da seguinte maneira:

Set-Cookie: promo_shown=1; SameSite=Strict

Quando o usuário está no seu site, o cookie é enviado com a solicitação, como esperado. No entanto, se o usuário seguir um link para seu site de outro, o cookie não será enviado nessa solicitação inicial. Isso é bom para cookies relacionados a recursos que estão sempre por trás de uma navegação inicial, como mudar uma senha ou fazer uma compra, mas é muito restritivo para um cookie como promo_shown. Se o leitor seguir o link para o site, ele vai querer que o cookie seja enviado para que a preferência seja aplicada.

SameSite=Lax permite que o navegador envie o cookie com essas navegações de nível superior. Por exemplo, se outro site fizer referência ao conteúdo do seu site, neste caso, usando a foto do gato e fornecendo um link para seu artigo da seguinte maneira:

<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>

Com um cookie definido como Lax da seguinte forma:

Set-Cookie: promo_shown=1; SameSite=Lax

Quando o navegador solicita amazing-cat.png para o blog da outra pessoa, seu site não envia o cookie. No entanto, quando o leitor segue o link para cat.html no seu site, essa solicitação inclui o cookie.

Recomendamos usar SameSite dessa forma, definindo cookies que afetam a exibição do site como Lax e cookies relacionados às ações do usuário como Strict.

Também é possível definir SameSite como None para indicar que você quer que o cookie seja enviado em todos os contextos. Se você oferece um serviço que outros sites consomem, como widgets, conteúdo incorporado, programas de afiliados, publicidade ou login em vários sites, use None para garantir que sua intenção seja clara.

Três cookies rotulados como None, Lax ou Strict, dependendo do contexto
Marque explicitamente o contexto de um cookie como None, Lax ou Strict.

Mudanças no comportamento padrão sem o SameSite

Browser Support

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

O atributo SameSite é amplamente aceito, mas não foi amplamente adotado. No passado, a configuração de cookies sem SameSite era enviada por padrão em todos os contextos, o que deixava os usuários vulneráveis a CSRF e vazamento não intencional de informações. Para incentivar os desenvolvedores a declarar a intenção e oferecer aos usuários uma experiência mais segura, a proposta da IETF, Incrementally Better Cookies, apresenta duas mudanças principais:

  • Cookies sem um atributo SameSite são tratados como SameSite=Lax.
  • Os cookies com SameSite=None também precisam especificar Secure, o que significa que eles exigem um contexto seguro.

As duas mudanças são compatíveis com versões anteriores de navegadores que implementaram corretamente a versão anterior do atributo SameSite, bem como navegadores que não são compatíveis com versões anteriores de SameSite. Eles têm como objetivo reduzir a dependência dos desenvolvedores do comportamento padrão dos navegadores, tornando o comportamento e o uso pretendido dos cookies explícitos. Os clientes que não reconhecem SameSite=None precisam ignorá-lo.

SameSite=Lax por padrão

Se você enviar um cookie sem especificar o atributo SameSite, o navegador vai tratar esse cookie como se ele estivesse definido como SameSite=Lax. Ainda recomendamos definir explicitamente SameSite=Lax para tornar a experiência do usuário mais consistente em todos os navegadores.

SameSite=None precisa ser seguro

Ao criar cookies entre sites usando SameSite=None, você também precisa defini-los como Secure para que o navegador os aceite:

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

Para testar esse comportamento no Chrome 76, ative about://flags/#cookies-without-same-site-must-be-secure. No Firefox 69, defina network.cookie.sameSite.noneRequiresSecure em about:config.

Também recomendamos atualizar os cookies atuais para Secure assim que possível. Se você depende de serviços que fornecem conteúdo de terceiros no seu site, verifique se o provedor de serviços atualiza os cookies e atualize todos os snippets ou dependências no seu site para garantir que ele use o novo comportamento.

Para mais detalhes sobre como atualizar seus cookies para lidar com essas mudanças no SameSite=None e as diferenças no comportamento do navegador, consulte o artigo Receitas de cookies SameSite.

Agradecemos as contribuições e o feedback de Lily Chen, Malte Ubl, Mike West, Rob Dodson, Tom Steiner e Vivek Sekhar.