Receitas de cookies SameSite

Google Chrome, Firefox, Edge, e outros estão mudando o comportamento padrão de acordo com o IETF proposta, Cookies cada vez melhores para que:

  • Cookies sem um atributo SameSite são tratados como SameSite=Lax. o que significa que o comportamento padrão é restringir cookies a somente.
  • Os cookies para uso entre sites precisam especificar SameSite=None; Secure para permitir a inclusão em contexto de terceiros.

Se você ainda não tiver feito isso, atualize os atributos da sua cookies de terceiros para que não sejam bloqueados no futuro.

Compatibilidade com navegadores

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

Origem

Casos de uso de cookies entre sites ou de terceiros

Há vários casos de uso e padrões comuns em que os cookies precisam ser enviados em um contexto de terceiros. Se você fornecer ou depender de um deles, casos, certifique-se de que você ou o provedor estejam atualizando seus cookies para manter o serviço funcionando corretamente.

Conteúdo em uma <iframe>

O conteúdo de outro site exibido em uma <iframe> está em um site de terceiros. contexto. Os casos de uso padrão incluem:

  • Conteúdo incorporado compartilhado de outros sites, como vídeos, mapas, exemplos de código, e postagens em redes sociais.
  • Widgets de serviços externos, como pagamentos, agendas, agendamentos e recursos de reserva.
  • Widgets, como botões de redes sociais ou serviços antifraude, que criam elementos menos óbvios <iframes>:

Os cookies podem ser usados aqui para, entre outras coisas, manter o estado da sessão, armazenar preferências gerais, ativar estatísticas ou personalizar conteúdo para usuários com contas existentes.

Diagrama de uma janela do navegador em que o URL do conteúdo incorporado não corresponde ao URL da página.
Se o conteúdo incorporado não vier do mesmo site que o nível superior contexto de navegação, é o conteúdo de terceiros.

Como a Web é um elemento combinável inerente, <iframes> também são usados para incorporar conteúdo assistido em um contexto de nível superior ou próprio. Todos os cookies do site exibidos nos usos de iframe são considerados cookies de terceiros. Se você estiver criar sites que você deseja que outros sites incorporem e precisam de cookies para torná-los funcionar, você também precisa garantir que eles estejam marcados para uso entre sites ou que você pode voltar tranquilamente sem eles.

"Perigoso" solicitações em sites

"Perigoso" pode parecer preocupante aqui, mas se refere a qualquer solicitação que possa ser tem a intenção de mudar o estado. Na Web, isso consiste principalmente em solicitações POST. Cookies marcadas como SameSite=Lax são enviadas em navegações de nível superior seguras, como clicar em um para ir a um site diferente. No entanto, algo como um envio <form> para um site diferente usando POST não inclua cookies.

Diagrama de uma solicitação passando de uma página para outra.
Se a solicitação recebida usa um argumento "seguro" a página envia cookies.

Esse padrão é usado para sites que podem redirecionar o usuário para um site serviço para executar alguma operação antes de retornar, por exemplo, redirecionar para um provedor de identidade terceirizado. Antes de o usuário sair do site, um cookie é contendo um token de uso único com a expectativa de que esse token possa ser verificou a solicitação de retorno para reduzir Falsificação de solicitações entre sites (CSRF, na sigla em inglês) ataques. Se essa solicitação de retorno vier por POST, será necessário marcar o cookies como SameSite=None; Secure.

Recursos remotos

Qualquer recurso remoto em uma página, como tags <img> ou <script>, pode depender do envio de cookies com uma solicitação. Casos de uso comuns incluem pixels de rastreamento e personalização de conteúdo.

Isso também se aplica a solicitações enviadas do seu JavaScript usando fetch ou XMLHttpRequest. Se fetch() for chamado com o credentials: 'include' opção, é provável que essas solicitações incluam cookies. Para XMLHttpRequest, os cookies esperados geralmente são indicados por uma Valor: withCredentials para true. Esses cookies devem ser marcados corretamente para serem incluídos em solicitações entre sites.

Conteúdo em uma WebView

Um WebView em um app específico da plataforma é alimentado por um navegador. Os desenvolvedores precisam testar se as restrições ou os problemas que afetam os aplicativos também se aplicam a WebViews dos seus apps.

O Android também permite que apps específicos da plataforma definam cookies diretamente usando o API CookieManager. Assim como os cookies definidos com cabeçalhos ou JavaScript, considere incluir SameSite=None; Secure se eles forem destinados ao uso entre sites.

Como implementar o SameSite hoje mesmo

Marque os cookies que são necessários apenas em um contexto próprio como SameSite=Lax. ou SameSite=Strict, dependendo das suas necessidades. Se você não marcar esses cookies e depender do comportamento padrão do navegador para processá-las, eles podem se comportar de forma inconsistente entre os navegadores e possivelmente acionar avisos do console para cada cookie.

Set-Cookie: first_party_var=value; SameSite=Lax

Marque todos os cookies necessários em um contexto de terceiros como SameSite=None; Secure: Os dois atributos são obrigatórios. Se você apenas especificar None sem Secure, o cookie vai ser rejeitado. Considerar as diferenças em implementações de navegador, talvez seja necessário usar um dos estratégias descritas em Gerenciar clientes incompatíveis.

Set-Cookie: third_party_var=value; SameSite=None; Secure

Processar clientes incompatíveis

Como essas mudanças para incluir None e atualizar o comportamento padrão ainda estão relativamente novos, diferentes navegadores lidam com elas de formas diferentes. Você pode indicar Acesse a página de atualizações em chromium.org para obter uma lista de problemas conhecidos, mas esta lista pode não estar completa.

Uma solução possível é definir cada cookie no estilo novo e no antigo:

Set-cookie: 3pcookie=value; SameSite=None; Secure
Set-cookie: 3pcookie-legacy=value; Secure

Os navegadores que implementam o comportamento mais recente definem o cookie com o SameSite. . Os navegadores que não implementam o novo comportamento ignoram esse valor e o definem o cookie 3pcookie-legacy. Ao processar cookies incluídos, seu site deve verifique a presença do novo estilo de cookie e, em seguida, use o cookie legado se não conseguir encontrar um novo.

O exemplo a seguir mostra como fazer isso no Node.js, usando a framework Express (em inglês) e os Middleware cookie-parser:

const express = require('express');
const cp = require('cookie-parser');
const app = express();
app.use(cp());

app.get('/set', (req, res) => {
  // Set the new style cookie
  res.cookie('3pcookie', 'value', { sameSite: 'none', secure: true });
  // And set the same value in the legacy cookie
  res.cookie('3pcookie-legacy', 'value', { secure: true });
  res.end();
});

app.get('/', (req, res) => {
  let cookieVal = null;

  if (req.cookies['3pcookie']) {
    // check the new style cookie first
    cookieVal = req.cookies['3pcookie'];
  } else if (req.cookies['3pcookie-legacy']) {
    // otherwise fall back to the legacy cookie
    cookieVal = req.cookies['3pcookie-legacy'];
  }

  res.end();
});

app.listen(process.env.PORT);

Essa abordagem exige um trabalho extra para configurar cookies redundantes e tornar no momento da configuração e da leitura do cookie. No entanto, ela deve cobrem todos os navegadores, independentemente de seu comportamento, e mantêm cookies de terceiros funcionando corretamente.

Como alternativa, é possível detectar o cliente usando a string do user agent quando um O cabeçalho Set-Cookie é enviado. Consulte a lista de clientes incompatíveis, e usar uma biblioteca de detecção de user agent adequada para sua plataforma, exemplo, a biblioteca ua-parser-js no Node.js. Essa abordagem exige apenas que você faça uma alteração, mas o user agent a interceptação pode não abranger todos os usuários afetados.

Suporte a SameSite=None em linguagens, bibliotecas e frameworks

A maioria das linguagens e bibliotecas é compatível com o atributo SameSite para cookies. No entanto, como a adição de SameSite=None ainda é relativamente recente, pode ser necessário contornar algum comportamento padrão por enquanto. Esses comportamentos estão documentados na Repositório de exemplos do SameSite no GitHub (link em inglês).

Receber ajuda

Os cookies são usados em toda a Web, e isso é raro para qualquer equipe de desenvolvimento conhecimento completo de onde o site os define e usa, especialmente em casos de uso entre sites. Quando você encontra um problema, ele pode ser a primeira vez qualquer pessoa já a encontrou, então não hesite em entrar em contato: