Compreensão dos cookies

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 na máquina dos usuários. Essa informação é transmitida entre o navegador e o site.

Cada cookie é um par de chave-valor com uma série de atributos que controlam quando e onde o cookie é usado. Esses atributos são usados para definir 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 por meio da interface JavaScript.

Os cookies são um dos métodos disponíveis para adicionar o estado persistente aos sites. Ao longo dos anos, os recursos cresceram e evoluíram, mas deixaram a plataforma com alguns problemas legados problemáticos. Para resolver isso, os navegadores (incluindo o Chrome, o Firefox e o Edge) estão mudando o comportamento para aplicar mais padrões que preservam a privacidade.

Cookies em ação

Suponha que você tenha um blog no qual deseja exibir uma promoção "Novidades" para seus usuários. Os usuários podem dispensar a promoção e, depois, não a verão novamente por um tempo. É possível armazenar essa preferência em um cookie, configurá-la para expirar em um mês (2.600.000 segundos) e enviá-la apenas por HTTPS. Esse cabeçalho ficaria assim:

Set-Cookie: promo_shown=1; Max-Age=2600000; Secure
Três cookies sendo enviados de um servidor para um navegador em uma resposta
Os servidores definem cookies usando o cabeçalho Set-Cookie.

Quando o leitor visualiza uma página que atende a esses requisitos (se está usando uma conexão segura e o cookie tem menos de um mês), o navegador envia este cabeçalho na solicitação:

Cookie: promo_shown=1
Três cookies sendo enviados de um navegador para um servidor em uma solicitação.
O navegador envia os cookies de volta no cabeçalho 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 seu navegador:

→ document.cookie = "promo_shown=1; Max-Age=2600000; Secure"
← "promo_shown=1; Max-Age=2600000; Secure"

A leitura de document.cookie produzirá todos os cookies acessíveis no contexto atual, com cada cookie separado por ponto e vírgula:

→ document.cookie;
← "promo_shown=1; color_theme=peachpuff; sidebar_loc=left"
JavaScript acessando cookies no navegador
O JavaScript pode acessar cookies usando document.cookie.

Se você testar isso em uma seleção de sites populares, vai perceber que a maioria deles define muito mais do que apenas três cookies. Na maioria dos casos, esses cookies são enviados em cada solicitação para esse domínio, o que tem várias implicações. Para seus usuários, a largura de banda de upload geralmente é mais restrita do que o download. Portanto, a sobrecarga em todas as solicitações de saída está adicionando um atraso no tempo para o primeiro byte. Seja conservador com relação ao número e ao tamanho dos cookies que você define. Use o atributo Max-Age para garantir que os cookies não fiquem pendentes 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 vendo antes, provavelmente notou que havia cookies presentes para vários domínios, não apenas o que você estava visitando no momento. Os cookies que correspondem ao domínio do site atual, ou seja, ao que é exibido 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 está relacionado 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.

Três cookies sendo enviados a um navegador a partir de diferentes solicitações na mesma página
Os cookies podem vir de vários domínios diferentes em uma página.

Continuando com o exemplo acima, digamos que uma das suas postagens do blog tenha uma foto de um gato especialmente incrível nela e esteja hospedada em /blog/img/amazing-cat.png. Como é uma imagem incrível, outra pessoa a usa diretamente no site dela. Se um visitante tiver acessado seu blog e tiver o cookie promo_shown, quando ele visualizar 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 dessa outra pessoa. Ele apenas adiciona sobrecarga à solicitação.

Caso esse seja um efeito não intencional, por que você faria isso? É esse mecanismo que permite aos sites manter o estado quando estão sendo usados em um contexto de terceiros. Por exemplo, se você incorporar um vídeo do YouTube ao seu site, os visitantes verão uma opção "Assistir mais tarde" no player. Se o visitante já tiver feito login no YouTube, essa sessão será disponibilizada no player incorporado por um cookie de terceiros. Isso significa que o botão "Assistir mais tarde" salvará o vídeo de uma só vez, em vez de solicitar que ele faça login ou tenha que navegá-lo para fora da sua página e voltar para o YouTube.

O mesmo cookie sendo enviado em três contextos diferentes
Um cookie em um contexto de terceiros é enviado ao visitar páginas diferentes.

Uma das propriedades culturais da Web é que ela tende a ser aberta por padrão. Isso faz parte do que tornou possível para tantas pessoas criarem conteúdo e apps próprios. No entanto, isso também trouxe várias preocupações com segurança e 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 a uma determinada origem, independentemente de quem a inicie. Por exemplo, se você visitar evil.example, ele poderá acionar solicitações para your-blog.example, e seu navegador anexará os cookies associados. Se seu blog não tiver cuidado com a forma como valida essas solicitações, o evil.example poderá acionar ações como excluir postagens ou adicionar o próprio conteúdo.

Os usuários também estão cada vez mais conscientes de como os cookies podem ser usados para rastrear as atividades deles em vários sites. No entanto, até agora, não havia uma maneira de declarar explicitamente sua intent com o cookie. Seu cookie promo_shown só pode ser enviado em um contexto próprio, enquanto um cookie de sessão de um widget que tem a intenção de ser incorporado em outros sites é intencionalmente lá para fornecer o estado de login em um contexto de terceiros.

Defina o atributo SameSite adequado para declarar explicitamente sua intent com um cookie.

Para identificar seus cookies primários e definir atributos adequados, confira Receitas de cookies primários.