no-cache não desliga o cache: um mapa prático de Cache-Control para sites e APIs

no-cache parece uma ordem direta: não guarde isto. Só que o HTTP escolheu um nome capaz de pregar peça até em quem trabalha com web há anos. A diretiva permite armazenar a resposta; o que ela proíbe é reutilizá-la sem antes consultar o servidor.

Essa diferença separa uma resposta rápida com 304 Not Modified de um download completo, mas também separa uma configuração segura de um vazamento de conteúdo personalizado por uma CDN. Cache não é apenas performance. É uma decisão sobre validade, compartilhamento e privacidade.

Antes das diretivas: qual cache está guardando a resposta?

O navegador mantém um cache privado ligado àquele usuário. Entre ele e a aplicação podem existir caches compartilhados: proxy corporativo, reverse proxy, CDN ou uma camada gerenciada na borda. A mesma resposta pode atravessar mais de uma dessas camadas.

Por isso, dizer apenas “pode cachear” não basta. Uma página pública pode ser compartilhada entre visitantes. Um painel autenticado não pode aparecer para outra pessoa, embora ainda possa se beneficiar do cache privado do próprio navegador.

no-cache: pode guardar, mas precisa revalidar

Com Cache-Control: no-cache, o cache pode armazenar a resposta. Antes de usá-la novamente, porém, deve perguntar ao servidor se ela continua válida. É aí que entram validadores como ETag e Last-Modified.

Se o navegador envia If-None-Match com a ETag conhecida e o conteúdo não mudou, o servidor responde 304, sem reenviar o corpo. Ainda existe uma viagem pela rede, mas não existe o custo de transferir e processar a resposta inteira.

É uma escolha comum para HTML e recursos que mudam mantendo a mesma URL. O cliente recebe a versão atual sem abrir mão da revalidação eficiente.

no-store: não armazene esta resposta

Cache-Control: no-store é a diretiva que impede caches privados e compartilhados de armazenar a resposta. Ela faz sentido quando guardar o conteúdo é inadequado, como em dados extremamente sensíveis ou respostas descartáveis.

Não é uma borracha retroativa. Enviar no-store hoje não garante a remoção de uma cópia antiga que já tenha sido armazenada para a mesma URL. Também não substitui HTTPS nem controles de autorização.

Usá-la em toda página por reflexo cobra um preço. Além de eliminar revalidação e reutilização, no-store pode reduzir os benefícios do back/forward cache do navegador. A opção mais restritiva não é automaticamente a mais correta.

private: o navegador pode, a CDN não

Cache-Control: private impede que caches compartilhados guardem a resposta, mas permite armazenamento no cache privado. Para HTML ou APIs personalizados depois do login, essa separação é decisiva.

Uma combinação prática é Cache-Control: private, no-cache: o navegador pode guardar a resposta daquele usuário, mas precisa revalidá-la; proxies e CDNs não podem compartilhá-la. Se a aplicação varia conteúdo por cookie, a chave do cache e o cabeçalho Vary também precisam fazer parte da revisão.

max-age, s-maxage e arquivos imutáveis

max-age define por quantos segundos uma resposta permanece fresca. Enquanto estiver nesse período, o cache pode reutilizá-la sem consultar a origem. s-maxage faz papel semelhante especificamente para caches compartilhados e pode substituir max-age nessas camadas.

Arquivos estáticos com hash no nome são o cenário mais seguro para cache longo. Se app.8f3a2.js nunca muda de conteúdo, ele pode receber public, max-age=31536000, immutable. Uma nova versão gera outra URL, e não uma disputa para invalidar a antiga.

Já um arquivo chamado apenas app.js, sobrescrito a cada deploy, não tem a mesma garantia. Cache longo e URL mutável formam a receita clássica para o usuário continuar executando código antigo.

Receitas iniciais, não respostas universais

  • HTML público que muda: no-cache com ETag ou Last-Modified.
  • Asset versionado: public, max-age=31536000, immutable.
  • Página ou API personalizada: começar por private, no-cache e validar a chave de variação.
  • Resposta que não deve ser armazenada: no-store, sem tratá-lo como substituto de segurança.
  • Conteúdo público na CDN: avaliar s-maxage e uma estratégia explícita de purge ou versionamento.

Como diagnosticar sem adivinhar

Abra a aba Network, faça duas requisições e observe Cache-Control, Age, ETag, Last-Modified e o status da segunda resposta. Um 304 mostra revalidação; uma resposta marcada como disk cache ou memory cache indica reutilização local; um cabeçalho Age costuma denunciar passagem por cache compartilhado.

Depois repita o teste autenticado e anônimo. Confira se cookies, autorização e parâmetros realmente criam variantes separadas. O cache que acelera uma página pública não deve receber permissão para misturar usuários.

O mapa mental mais útil é simples: no-cache controla reutilização sem validação; no-store controla armazenamento; private controla compartilhamento; e max-age controla frescor. O nome engana, mas os papéis não precisam continuar confusos.

Fontes