HSTS (HTTP Strict Transport Security) é um cabeçalho de segurança que instrui os navegadores a sempre conectar via HTTPS — mesmo que o usuário digite http:// ou clique em um link HTTP. Uma vez que o navegador recebe um cabeçalho HSTS, ele automaticamente atualiza todas as futuras requisições para HTTPS naquele domínio, prevenindo ataques de downgrade e conexões inseguras.
Por que o HSTS importa
Sem HSTS, a primeira requisição ao seu site pode ser HTTP (antes do redirecionamento 301 atuar). Durante essa breve janela, um atacante na rede pode:
- Remover o HTTPS — interceptar o redirecionamento e manter o usuário em HTTP (ataque SSL stripping)
- Roubar cookies — se cookies forem enviados na requisição HTTP inicial
- Injetar conteúdo — modificar a resposta de redirecionamento
O HSTS elimina essa janela. Após a primeira visita HTTPS, o navegador nunca mais tenta HTTP.
Como habilitar o HSTS
Nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
Adicione dentro do bloco server HTTPS (porta 443), não no bloco de redirecionamento HTTP.
Apache
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
Requer mod_headers (sudo a2enmod headers).
Cloudflare
Dashboard → SSL/TLS → Edge Certificates → HTTP Strict Transport Security (HSTS) → Habilitar.
Parâmetros do HSTS
| Parâmetro | Exemplo | Significado |
|---|---|---|
max-age | 63072000 (2 anos) | Por quanto tempo (em segundos) o navegador lembra de usar HTTPS |
includeSubDomains | — | Aplica HSTS a todos os subdomínios também |
preload | — | Sinaliza intenção de participar da lista de preload HSTS |
Escolhendo max-age
| Fase | max-age | Propósito |
|---|---|---|
| Teste | 300 (5 minutos) | Verificar se HTTPS funciona antes de se comprometer |
| Confiante | 604800 (1 semana) | Baixo risco se precisar reverter |
| Produção | 31536000 (1 ano) | Recomendação padrão |
| Longo prazo | 63072000 (2 anos) | Necessário para a lista de preload |
Comece pequeno, aumente gradualmente. Se o HTTPS quebrar enquanto um max-age longo estiver em cache, os visitantes não conseguirão acessar seu site de forma alguma — o navegador se recusa a conectar via HTTP.
HSTS preload
A lista de preload HSTS é uma lista de domínios codificada nos navegadores para sempre usar HTTPS, mesmo na primeira visita (antes de qualquer cabeçalho HSTS ser recebido).
Requisitos para preload
- Servir um certificado HTTPS válido
- Redirecionar HTTP para HTTPS no mesmo host
- Cabeçalho HSTS com
max-age>= 63072000 (2 anos) - Incluir a diretiva
includeSubDomains - Incluir a diretiva
preload
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
Enviar para preload
Acesse hstspreload.org, insira seu domínio e envie. Após revisão (semanas a meses), seu domínio é adicionado às listas integradas dos navegadores.
Avisos sobre preload
- É difícil de desfazer. A remoção da lista de preload leva meses e requer um ciclo de release do navegador. Durante esse tempo, seu domínio só pode ser acessado via HTTPS.
includeSubDomainsé obrigatório — todo subdomínio deve suportar HTTPS. Sestaging.example.comnão tem certificado, ele se torna inacessível.- Só faça preload se tiver certeza de que todos os subdomínios atuais e futuros suportarão HTTPS.
Erros comuns
Configurar HSTS na resposta HTTP
O HSTS deve ser enviado apenas via HTTPS. Se seu redirecionamento HTTP também envia o cabeçalho HSTS, os navegadores o ignoram (a especificação exige HTTPS). Configure o cabeçalho apenas no bloco da porta 443.
Esquecer dos subdomínios
includeSubDomains aplica HSTS a todos os subdomínios. Se internal.example.com não tem HTTPS, ele se torna inacessível. Audite todos os subdomínios antes de habilitar.
Configurar max-age muito alto muito cedo
Se o HTTPS quebrar (certificado expirado, erro de configuração), os visitantes não podem recorrer ao HTTP. O navegador se recusa a conectar. Comece com 5 minutos, verifique se tudo funciona, depois aumente para 1 ano.
Como verificar se o HSTS está ativo
curl -sI https://yourdomain.com | grep -i strict-transport
# Esperado: strict-transport-security: max-age=63072000; includeSubDomains
No Chrome DevTools: aba Network → clique na requisição → Headers → procure por Strict-Transport-Security.
Perguntas frequentes
O HSTS substitui os redirecionamentos HTTP→HTTPS?
Não. HSTS e redirecionamentos servem propósitos diferentes. O redirecionamento captura a primeira requisição HTTP. O HSTS instrui o navegador a nunca mais fazer requisições HTTP (após a primeira visita HTTPS). Você precisa de ambos.
O HSTS pode causar problemas?
Sim, se o HTTPS quebrar. Com um max-age longo, os navegadores se recusam a conectar via HTTP como fallback. É por isso que você deve começar com um max-age curto e só aumentar quando o HTTPS estiver estável.
Preciso de HSTS se estou no Cloudflare?
O Cloudflare gerencia a conexão visitante→Cloudflare, mas o HSTS na sua origem protege a cadeia completa. Habilite o HSTS pelo dashboard do Cloudflare para o edge, e na sua origem se usar o modo Full (Strict).
Qual a diferença entre HSTS e a diretiva CSP upgrade-insecure-requests?
upgrade-insecure-requests instrui o navegador a carregar sub-recursos (imagens, scripts) via HTTPS em vez de HTTP — corrigindo conteúdo misto. O HSTS instrui o navegador a sempre usar HTTPS para todo o domínio. Eles resolvem problemas diferentes e podem ser usados juntos.