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
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