03 - Manutenção de Cache
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 doCache-Control: no-cache. Ainda presente em clientes antigos.Expires— data absoluta de expiração. Substituído pormax-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 sertop-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íticaCache-Control: no-storepara 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.