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 comoSameSite=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.
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.
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.
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:
- Informe um problema no
Repositório de exemplos do
SameSite
no GitHub (link em inglês). - Faça uma pergunta no "samesite" tag no StackOverflow.
- Em caso de problemas com o comportamento do Chromium, informe um bug no Issue Tracker do Chromium.
- Acompanhe o progresso do Chrome no
Página de atualizações do
SameSite
.