Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

03 - Manutenção de Cache

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

A Manutenção de Cache no Cliente Web é o mecanismo técnico mais poderoso para a otimização de performance e economia de banda na Internet. Trata-se da capacidade de um navegador (ou qualquer User-Agent) de armazenar cópias locais de recursos recuperados anteriormente (imagens, scripts, HTML, estilos) para reutilizá-los em visitas futuras. O gerenciamento inteligente deste cache, regido por cabeçalhos de controle rigorosos, define a diferença entre uma experiência web ágil e uma navegação lenta e dispendiosa.


1. Tipos de Armazenamento de Cache no Navegador

O navegador utiliza diferentes camadas de persistência dependendo da volatilidade e do propósito do recurso.

Camada Persistência Velocidade Caso de Uso Típico
Memory Cache Volátil (sessão) Microssegundos Recursos da aba atual: HTML, CSS, JS recém-carregados
Disk Cache Persiste em disco Milissegundos Imagens, fontes, vídeos — sobrevive a reinicializações
Service Worker Cache Programável Variável Progressive Web Apps, modo offline controlado
HTTP/2 Push Cache Por conexão Imediato Recursos enviados antecipadamente pelo servidor antes do pedido
AppCache (deprecated) Persistente Milissegundos Substituído por Service Workers desde 2019

2. Lógica de Controle: Cabeçalhos HTTP de Cache

O servidor instrui o cliente sobre como gerenciar o cache através de metadados específicos na resposta HTTP.

Cabeçalhos de Frescor (Freshness)

Cabeçalho Valor Exemplo Significado
Cache-Control: max-age=3600 3600 segundos Recurso é válido por 1 hora sem revalidação
Cache-Control: public Indicador Pode ser cacheado por CDNs e proxies intermediários
Cache-Control: private Indicador Cache apenas no navegador do usuário (não em CDN)
Cache-Control: no-store Proibitivo Nenhum armazenamento permitido — dados bancários/sensíveis
Cache-Control: no-cache Restritivo Pode cachear, mas obriga revalidação antes do uso
Cache-Control: must-revalidate Restritivo Recurso stale (vencido) não pode ser usado sem revalidar
Expires: Wed, 21 Oct 2025 07:28:00 GMT Data absoluta Substituído por max-age, mas ainda válido como fallback

Cabeçalhos Legados (HTTP/1.0)

  • Pragma: no-cache — equivalente HTTP/1.0 do Cache-Control: no-cache. Ainda presente em clientes antigos.
  • Expires — data absoluta de expiração. Substituído por max-age (relativo) por ser mais robusto a descompassos de relógio.

3. Revalidação Condicional: ETag e Last-Modified

Quando o cache expira (max-age atingido), o navegador tenta economizar banda através de Requisições Condicionais.

Last-Modified (Validador Fraco)

  • O navegador envia um cabeçalho If-Modified-Since: Wed, 21 Oct 2024 07:28:00 GMT.
  • Se o arquivo não mudou no servidor desde essa data, o servidor responde apenas com 304 Not Modified (sem enviar o corpo do arquivo novamente).
  • Granularidade: 1 segundo — arquivos modificados várias vezes no mesmo segundo são indistinguíveis.
  • Tipo: Weak validator (RFC 7232).

ETag (Validador Forte)

  • Um hash único (identificador digital) gerado para o conteúdo do arquivo (ex: ETag: "abc123def456").
  • O navegador envia If-None-Match: "abc123def456".
  • Se o hash for o mesmo, o servidor confirma que a versão local em cache é idêntica à do servidor.
  • Granularidade: byte a byte.
  • Tipo: Strong validator (RFC 7232).

Comparativo

Critério Last-Modified ETag
Granularidade 1 segundo Byte
Custo de cálculo Baixo (stat) Médio (hash)
Precisão Baixa Alta
Suporte Universal Universal
RFC 7232 7232

4. Estratégias de Cache Recomendadas por Tipo de Recurso

Tipo de Recurso Estratégia Configuração Típica
HTML dinâmico no-cache + ETag Sempre revalida, mas economiza bytes
CSS/JS versionados max-age=31536000, immutable Cache 1 ano, nome de arquivo com hash
Imagens estáticas max-age=86400 Cache 1 dia
Fontes max-age=31536000 Cache 1 ano
API JSON no-store ou no-cache Dados sensíveis nunca cacheados
Manifest PWA no-cache Sempre buscar versão mais recente
Favicon max-age=604800 Cache 1 semana

Padrão Cache-Busting com Hash em Nome de Arquivo

Em ambientes de CI/CD, utiliza-se hashing no nome do arquivo (ex: style.a3b9c2.css) para forçar o navegador a baixar uma nova versão sempre que o conteúdo mudar, ignorando o cache do arquivo antigo. Quando o hash muda, o navegador trata como um novo recurso — permitindo max-age=31536000, immutable para cache agressivo sem risco de servir conteúdo obsoleto.


5. Vantagens Técnicas do Cache

Benefício Quantificação Típica
Redução de banda 60-80% em sites estáticos
Redução de latência percebida 70-95% em visitas repetidas
Redução de carga no servidor 50-90% menos requisições
Economia em CDNs Diminui custo de transferência
Resiliência offline Service Workers permitem uso sem rede

6. Perspectiva de Segurança e Manutenção de Cache

A gestão de cache no lado do cliente é um vetor de ataque frequentemente explorado.

Vazamento de Informações por Timing (Cache Timing Attacks)

Atacantes podem medir o tempo que um recurso leva para carregar para inferir se o usuário já visitou um determinado site sensível. Se o carregamento for instantâneo, o recurso estava no cache, confirmando a visita prévia do usuário àquele site (vazamento de histórico de navegação).

  • Defesa: Navegadores modernos utilizam Cache Partitioning (Chrome desde v86, 2020), onde o cache de um site (banco.com) é separado do cache de outro site (malware.com), impedindo que um site saiba o que o outro armazenou. A chave do cache passa a ser top-level-origin + current-origin.

Envenenamento de Cache Local

Se um atacante consegue interceptar o tráfego de um site via Wi-Fi não criptografado (porta 80 HTTP), ele pode injetar um script malicioso com um TTL de cache de vários anos (Cache-Control: max-age=31536000). Mesmo que o usuário mude para uma rede segura depois, o script do atacante continuará sendo executado a partir do cache local do navegador.

  • Defesa: Cabeçalho Strict-Transport-Security (HSTS) força HTTPS mesmo em primeira visita. Política Cache-Control: no-store para conteúdo sensível.

Ataques via Service Worker

Um Service Worker malicioso registrado no navegador pode interceptar todas as requisições futuras do domínio e servir conteúdo adulterado do cache. Por isso, Service Workers só podem ser registrados via HTTPS e têm escopo estrito por origem.


7. Auditoria Técnica de Eficiência de Cache

Administradores utilizam auditorias para garantir que a banda não esteja sendo desperdiçada:

# Inspecionando se o cache esta sendo utilizado em uma resposta (HIT vs MISS)
curl -v -o /dev/null -s https://site.com/ 2>&1 | grep -i "cache\|age\|etag"

# Verificando o tempo de idade do objeto no cache da CDN
curl -sI https://cdn.site.com/imagem.jpg | grep -i "age\|cache-control"

# Forcando revalidacao ignorando cache local (debug)
curl -H "Cache-Control: no-cache" -H "Pragma: no-cache" https://site.com/

# Analisando hit ratio de um servidor Nginx com proxy_cache
sudo tail -f /var/log/nginx/access.log | grep -oP 'cache-status: \K\w+' | sort | uniq -c

# Limpando cache de Proxy Reverso Nginx (quando disponivel)
curl -X PURGE -H "X-Purge-Secret: minha-chave" https://cdn.site.com/imagem.jpg

Ferramentas de Auditoria de Cache

Ferramenta Função
Lighthouse (Google) Audita cache strategy e recomenda melhorias
WebPageTest Análise detalhada de HIT/MISS em cascata
Chrome DevTools → Network Visualiza from cache, from service worker
redbot.org Valida cabeçalhos HTTP de cache
curl Testes manuais de revalidação condicional

8. Service Workers e Cache API

A Cache API (parte das PWA specs) permite controle programático fino sobre o cache:

// Exemplo classico de Service Worker (sw.js)
const CACHE_NAME = 'app-v2.3.1';
const ASSETS = ['/index.html', '/style.css', '/app.js', '/logo.png'];

self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open(CACHE_NAME).then((cache) => cache.addAll(ASSETS))
  );
});

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.match(event.request).then((cached) => {
      return cached || fetch(event.request);
    })
  );
});

self.addEventListener('activate', (event) => {
  event.waitUntil(
    caches.keys().then((keys) => Promise.all(
      keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k))
    ))
  );
});

Estratégias comuns: Cache First, Network First, Stale While Revalidate, Network Only, Cache Only.


9. Conclusão

A Manutenção de Cache é o coração da estabilidade e performance da web moderna. Sem ela, os backbones de Internet do mundo seriam saturados por requisições redundantes de ícones e arquivos estáticos idênticos. Compreender as políticas de Cache-Control, dominar a mecânica de revalidação baseada em ETag e Last-Modified, aplicar estratégias de cache-busting por hash de arquivo, e proteger a privacidade dos usuários contra timing attacks via cache partitioning são competências fundamentais para qualquer engenheiro web que precise projetar aplicações escaláveis, rápidas e seguras. Um cache bem gerido é simultaneamente uma arma de performance e de redução de custo — mas requer configuração precisa para não virar vetor de vazamento de dados sensíveis.