Um cookie é um bloco de dados armazenado no navegador que é usado para manter o estado e outras informações de que um site precisa para executar seus recursos.
Um cookie é um pequeno arquivo que os sites armazenam no computador do usuário. As informações armazenadas nele viajam entre o navegador e o site.
Cada cookie é um par de chave-valor com vários atributos que controlam quando e onde esse cookie é usado. Esses atributos são usados para definir coisas como datas de validade ou indicar que o cookie só deve ser enviado por HTTPS. É possível definir um cookie em um cabeçalho HTTP ou pela interface JavaScript.
Os cookies são um dos métodos disponíveis para adicionar estado persistente a sites. Ao longo dos anos, os recursos deles cresceram e evoluíram, mas deixaram a plataforma com alguns problemas legados. Para resolver isso, os navegadores (incluindo Chrome, Firefox e Edge) estão mudando o comportamento para aplicar padrões que preservam a privacidade.
Cookies em ação
Digamos que você tenha um blog em que queira mostrar uma promoção de "Novidades" aos usuários. Os usuários podem dispensar a promoção e não a verão novamente por um tempo. É possível armazenar essa preferência em um cookie, definir a validade dele em um mês (2.600.000 segundos) e enviá-lo apenas por HTTPS. Esse cabeçalho seria assim:
Set-Cookie: promo_shown=1; Max-Age=2600000; Secure
Set-Cookie.
Quando o leitor acessa uma página que atende a esses requisitos (está em uma conexão segura e o cookie tem menos de um mês), o navegador envia esse cabeçalho na solicitação:
Cookie: promo_shown=1
Cookie.
Também é possível adicionar e ler os cookies disponíveis para esse site em JavaScript usando document.cookie. Fazer uma atribuição a document.cookie vai criar ou substituir um cookie com essa chave. Por exemplo, tente o seguinte no console JavaScript do navegador:
→ document.cookie = "promo_shown=1; Max-Age=2600000; Secure"
← "promo_shown=1; Max-Age=2600000; Secure"
A leitura de document.cookie vai gerar todos os cookies acessíveis no contexto atual, com cada cookie separado por um ponto e vírgula:
→ document.cookie;
← "promo_shown=1; color_theme=peachpuff; sidebar_loc=left"
document.cookie.
Se você tentar isso em uma seleção de sites populares, vai notar que a maioria deles define muito mais do que apenas três cookies. Na maioria dos casos, esses cookies são enviados em todas as solicitações para esse domínio, o que tem várias implicações. A largura de banda de upload geralmente é mais restrita do que o download para os usuários. Portanto, essa sobrecarga em todas as solicitações de saída adiciona um atraso no tempo até o primeiro byte. Seja conservador no número e no tamanho dos cookies definidos. Use o atributo Max-Age para garantir que os cookies não permaneçam por mais tempo do que o necessário.
O que são cookies primários e de terceiros?
Se você voltar à mesma seleção de sites que estava acessando antes, provavelmente notou que havia cookies presentes em vários domínios, não apenas naquele que você estava visitando. Os cookies que correspondem ao domínio do site atual, ou seja, o que é mostrado na barra de endereço do navegador, são chamados de cookies primários. Da mesma forma, os cookies de domínios diferentes do site atual são chamados de cookies de terceiros. Esse não é um rótulo absoluto, mas é relativo ao contexto do usuário. O mesmo cookie pode ser primário ou de terceiros, dependendo do site em que o usuário está no momento.
Continuando o exemplo anterior, digamos que uma das postagens do seu blog tenha uma foto de um gato incrível e esteja hospedada em /blog/img/amazing-cat.png. Como é uma imagem incrível, outra pessoa a usa diretamente no site. Se um visitante acessou seu blog e tem o cookie promo_shown, quando ele acessar amazing-cat.png no site da outra pessoa, esse cookie será enviado na solicitação da imagem. Isso não é particularmente útil para ninguém, já que promo_shown não é usado para nada no site da outra pessoa, apenas adiciona sobrecarga à solicitação.
Se esse é um efeito não intencional, por que você faria isso? É esse mecanismo que permite que os sites mantenham o estado quando estão sendo usados em um contexto de terceiros. Por exemplo, se você incorporar um vídeo do YouTube no seu site, os visitantes vão ver uma opção "Assistir mais tarde" no player. Se o visitante já estiver conectado ao YouTube, essa sessão será disponibilizada no player incorporado por um cookie de terceiros. Isso significa que o botão "Assistir mais tarde" vai salvar o vídeo de uma só vez, em vez de pedir que ele faça login ou tenha que sair da sua página e voltar para o YouTube.
Uma das propriedades culturais da Web é que ela tende a ser aberta por padrão. Isso faz parte do que tornou possível que tantas pessoas criassem conteúdo e apps próprios. No entanto, isso também trouxe vários problemas de segurança e questões de privacidade. Os ataques de falsificação de solicitações entre sites (CSRF, na sigla em inglês) dependem do fato de que os cookies são anexados a qualquer solicitação de uma determinada origem, não importa quem inicie a solicitação. Por exemplo, se você acessar evil.example, ele poderá acionar solicitações para your-blog.example, e seu navegador vai anexar os cookies associados. Se o blog não tiver cuidado com a validação dessas solicitações, evil.example poderá acionar ações como excluir postagens ou adicionar conteúdo próprio.
Os usuários também estão se tornando mais conscientes de como os cookies podem ser usados para rastrear a atividade deles em vários sites. No entanto, até agora não havia uma maneira de declarar explicitamente sua intenção com o cookie. O cookie promo_shown só deve ser enviado em um contexto primário, enquanto um cookie de sessão para um widget destinado a ser incorporado em outros sites está intencionalmente presente para fornecer o estado conectado em um contexto de terceiros.
É possível declarar explicitamente sua intenção com um cookie definindo o atributo SameSite apropriado.
Para identificar seus cookies primários e definir os atributos adequados, consulte Receitas de cookies primários.