Saltar para o conteúdo principal
Sistemas digitais13 min de leitura

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.

Atualizado
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
Operadores separam contentores públicos, caixas privadas, tokens de validação e uma reserva controlada
Cache segura começa por classificar a resposta e a chave de reutilização; velocidade vem depois da separação correta.Imagem gerada por IA sob direção editorial da Velqory.

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. 1 · AUDIÊNCIA
    Público, privado ou individual

    Identificar quem pode receber exatamente os mesmos bytes.

  2. 2 · VARIAÇÃO
    Construir a chave

    Incluir URL, método e dimensões necessárias; evitar depender de contexto oculto.

  3. 3 · FRESCURA
    Definir janela

    Relacionar TTL com mudança, revogação, custo e tolerância a stale.

  4. 4 · VALIDAÇÃO
    Emitir validators

    Gerar ETag/Last-Modified coerentes e tratar pedidos condicionais.

  5. 5 · FALHA
    Decidir uso de stale

    Permitir apenas por classe e estado, com observabilidade e limites.

  6. 6 · TESTE
    Provar 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

ClasseDiretiva inicialValidação/invalidaçãoTeste crítico
Asset com hashpublic, max-age longo, immutableNovo URL por conteúdoDigest/URL muda com bytes
HTML públicopublic ou controlado, TTL curtoETag + purge/deployConteúdo atual após publicação
API públicapublic apenas se bytes equivalentesETag e chave documentadaQuery, idioma e encoding
Página personalizadaprivate, no-cache ou no-storeReautorizar/revalidarUser A nunca recebe User B
Segredo/açãono-storeSem reutilizaçãoBrowser, proxy e histórico
Erro temporárioTTL curto ou não armazenarstale-if-error só para objeto seguroRecuperação não preserva erro
Logout/revogaçãoPolítica privada e invalidaçãoSessão e autorização na origemBack/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.

Consultadas na data de atualização indicada.

  1. 01RFC 9111 — HTTP CachingRFC Editor · SYS-RFC
  2. 02RFC 9110 — HTTP SemanticsRFC Editor · SYS-RFC
  3. 03RFC 5861 — stale-while-revalidate and stale-if-errorRFC Editor · SYS-RFC
  4. 04RFC 8246 — immutable response directiveRFC Editor · SYS-RFC
  5. 05HTTP caching guideMDN Web Docs · SYS-MDN
  6. 06ETag response headerMDN Web Docs · SYS-MDN