Cache HTTP sem fugas: classificar respostas antes de escolher diretivas
Cache-Control não é uma receita única. Conteúdo público versionado, HTML anónimo, respostas personalizadas, dados autenticados e erros temporários precisam de políticas e chaves diferentes — verificadas no browser, CDN e origem.
- Natureza
- Guia técnico baseado em RFC 9110/9111/5861/8246 e documentação MDN
- Âmbito
- Browsers, reverse proxies, CDNs e origens HTTP
- Publicado e verificado
- 4 de agosto de 2026
- Limite
- Confirmar comportamento e defaults no fornecedor de CDN/proxy e no framework utilizado

Em resumo
RFC 9111 define quando respostas podem ser armazenadas e reutilizadas. no-store pede que não sejam armazenadas; no-cache permite armazenamento, mas exige validação antes de reutilizar; private restringe shared caches; public autoriza reutilização partilhada quando apropriado. max-age e s-maxage controlam frescura, Vary amplia a chave, e ETag/Last-Modified permitem pedidos condicionais. Extensões stale podem melhorar disponibilidade, mas não devem servir dados privados, revogados ou incompatíveis. A política correta começa por audiência, sensibilidade, variabilidade, invalidação e tolerância a staleness.
- no-cache não significa não guardar; use no-store quando o requisito é evitar armazenamento.
- private impede reutilização por shared caches, mas permite cache privada do browser se outras diretivas autorizarem.
- Vary só protege dimensões declaradas e pode explodir cardinalidade; cookies e autorização exigem desenho explícito.
- ETag é um validador, não um controlo de acesso; o servidor volta a autorizar antes de responder 304.
Armazenar, reutilizar e validar são decisões diferentes
Uma cache pode armazenar uma resposta e ainda precisar de consultar a origem antes de a reutilizar. Frescura permite reutilização sem validação durante uma janela; stale não significa automaticamente inutilizável, porque pedidos, diretivas e ligação à origem alteram o resultado.
Autorização e cache precisam de composição cuidadosa. Respostas a pedidos com Authorization têm restrições de armazenamento partilhado salvo diretivas que o permitam. Mesmo quando o objeto está em cache, a aplicação não deve assumir que a autorização anterior continua válida.
Decisão por classe de resposta
- 1 · AUDIÊNCIAPúblico, privado ou individual
Identificar quem pode receber exatamente os mesmos bytes.
- 2 · VARIAÇÃOConstruir a chave
Incluir URL, método e dimensões necessárias; evitar depender de contexto oculto.
- 3 · FRESCURADefinir janela
Relacionar TTL com mudança, revogação, custo e tolerância a stale.
- 4 · VALIDAÇÃOEmitir validators
Gerar ETag/Last-Modified coerentes e tratar pedidos condicionais.
- 5 · FALHADecidir uso de stale
Permitir apenas por classe e estado, com observabilidade e limites.
- 6 · TESTEProvar separação
Usar identidades, regiões, idiomas, dispositivos e mudanças reais.
Uma matriz explícita evita defaults contraditórios
Defina a política no nível da resposta, não numa configuração global. Garanta que a CDN não substitui headers da origem sem decisão consciente. Teste headers finais no edge, porque comportamento correto na aplicação pode ser alterado por proxy.
Política inicial por classe
| Classe | Diretiva inicial | Validação/invalidação | Teste crítico |
|---|---|---|---|
| Asset com hash | public, max-age longo, immutable | Novo URL por conteúdo | Digest/URL muda com bytes |
| HTML público | public ou controlado, TTL curto | ETag + purge/deploy | Conteúdo atual após publicação |
| API pública | public apenas se bytes equivalentes | ETag e chave documentada | Query, idioma e encoding |
| Página personalizada | private, no-cache ou no-store | Reautorizar/revalidar | User A nunca recebe User B |
| Segredo/ação | no-store | Sem reutilização | Browser, proxy e histórico |
| Erro temporário | TTL curto ou não armazenar | stale-if-error só para objeto seguro | Recuperação não preserva erro |
| Logout/revogação | Política privada e invalidação | Sessão e autorização na origem | Back/forward não expõe dados |
Testar com duas identidades e três camadas
Execute a mesma rota como anónimo, utilizador A e utilizador B através de browser, CDN e origem. Compare Age, Cache-Control, Vary, ETag, status, corpo e headers sensíveis. Mude os dados e a autorização entre pedidos.
Inclua cold, fresh, revalidated, stale, origem indisponível, purge e deploy. Observe cache hit por classe sem registar cookies, tokens ou respostas pessoais em telemetria.
- Não colocar Set-Cookie ou dados de sessão numa resposta partilhável sem análise explícita.
- Evitar Vary: Cookie indiscriminado; separar rotas ou chaves quando possível.
- Usar URLs versionados para assets e TTL curto/validação para documentos mutáveis.
- Monitorizar hit ratio por classe, respostas 304, objetos stale, purge e incidentes de separação.
Fontes consultadas
Consultadas na data de atualização indicada.
Abre numa nova janela.- 01RFC 9111 — HTTP CachingRFC Editor · SYS-RFC
- 02RFC 9110 — HTTP SemanticsRFC Editor · SYS-RFC
- 03RFC 5861 — stale-while-revalidate and stale-if-errorRFC Editor · SYS-RFC
- 04RFC 8246 — immutable response directiveRFC Editor · SYS-RFC
- 05HTTP caching guideMDN Web Docs · SYS-MDN
- 06ETag response headerMDN Web Docs · SYS-MDN
Participar
Partilhe a análise. Acrescente contexto.
Divulgue a matéria no seu canal ou deixe uma observação ligada ao tema.

Comentários
A carregar a conversa.