Pular para o conteúdo
Menu

Cookies demais podem derrubar o seu site com um erro 400

Um cookie por item parece inofensivo. Numa plataforma de comunidade, ele chegou a 83 cookies para um único visitante, enviados junto com cada imagem e script, a caminho do limite em que o servidor responde 400 Bad Request.

O que o navegador enviava, em cada pedido

Cookie: item_5012=…; item_5013=…; item_88=…83 cookies · cerca de 4,5 KB← em cada imagem, estilo e scriptcerca de 55 pedidos × 4,5 KB ≈ 250 KB enviados por visitao limite do servidor (padrão do nginx)cabeçalho acima de 8 KB → 400 Bad Request

O que encontramos

Numa plataforma de comunidade, um recurso criava um cookie para cada item com que o visitante interagia. Cada nova interação somava mais um. O visitante mais ativo que conferimos carregava cerca de 83 cookies, uns 4,5 KB, e o número só crescia.

Ninguém tinha percebido, porque nada estava quebrado ainda. O problema é exatamente esse: esse tipo de defeito atinge primeiro os visitantes mais engajados, e piora quanto mais eles usam o site.

Por que isso importa

  • Os cookies vão junto com todos os pedidos ao seu domínio, e não só com a página. Numa página inicial com uns 55 pedidos, 4,5 KB de cookies significam cerca de 250 KB enviados por visita, justo no lado mais lento da conexão do celular.
  • O navegador guarda um número limitado de cookies por domínio e apaga os mais antigos sem avisar. Um recurso que depende desses cookies começa a esquecer o que o visitante fez.
  • O servidor limita o tamanho dos cabeçalhos do pedido. Com a configuração padrão do nginx, uma linha de cabeçalho acima de 8 KB é recusada com 400 Bad Request. Nesse ritmo, os visitantes mais ativos chegariam primeiro a esse limite e veriam uma página de erro no lugar do site.

Como conferir o seu site

  • Abra o site no Chrome, aperte F12, vá em Application, depois Cookies, e conte os cookies do seu domínio depois de usar o site por alguns minutos.
  • Procure nomes que terminam com um número ou identificador, como item_5012. Esse padrão significa um cookie por coisa.
  • Na aba Network, abra qualquer pedido e veja o tamanho do cabeçalho Cookie.

Como corrigimos

Trocamos os cookies por item por um único cookie de visitante, e levamos a memória do que cada visitante fez para o banco de dados, onde ela em parte já existia.

Parar de criar cookies novos não bastava, porque os visitantes ativos já tinham dezenas de cookies antigos, válidos por um ano. A cada visita, o site agora passa até 40 cookies antigos para o banco de dados e só depois os apaga, para que ninguém perca o histórico nem consiga repetir a mesma ação duas vezes.

Um detalhe decidiu se a correção funcionava: o código tratava "este cookie existe" como "o visitante já fez isso". Com um único cookie, esse teste marcaria tudo como já feito para qualquer pessoa que tivesse clicado uma vez. A verificação tinha que mudar junto com o cookie.

A regra

Nunca crie um cookie por item. Guarde um cookie que identifica o visitante e mantenha a lista de itens no servidor.

Quer que a gente confira isso no seu site?

Entrar em contato