06 - Códigos de Resposta
video: https://youtu.be/... no frontmatter da nota.Códigos de Resposta HTTP (Status Codes)
Os Códigos de Resposta HTTP (Status Codes) são os sinalizadores técnicos que informam ao Cliente (User-Agent) o resultado de uma solicitação processada pelo Servidor. Padronizados no modelo de três dígitos decodificados pelas RFCs (RFC 7231, RFC 9110 e sucessoras), eles permitem que o navegador decida automaticamente como agir: exibir o conteúdo, redirecionar o usuário, solicitar autenticação ou exibir uma mensagem de erro crítica. Compreender a semântica de cada categoria de status é fundamental para arquitetos de sistemas, desenvolvedores e profissionais de Cyber Security.
1. Categorização Técnica das Famílias de Códigos
Os códigos de resposta são divididos em cinco classes, identificadas pelo primeiro dígito (1 a 5).
1xx: Respostas Informativas (Informational)
Indica que a requisição foi recebida e o processo ainda está em andamento. Introduzido no HTTP/1.1, raramente usado em servidores web modernos.
| Código | Reason Phrase | Aplicação |
|---|---|---|
| 100 | Continue | Cliente envia headers primeiro para perguntar se pode enviar body |
| 101 | Switching Protocols | Upgrade para WebSocket, HTTP/2 |
| 102 | Processing | WebDAV — processamento ainda em curso |
| 103 | Early Hints | Permite enviar hints antes da resposta final |
2xx: Sucesso (Success)
Indica que a ação solicitada pelo cliente foi recebida, compreendida e aceita com êxito pelo servidor.
| Código | Reason Phrase | Quando Usar |
|---|---|---|
| 200 | OK | Sucesso genérico (GET, POST, PUT) |
| 201 | Created | Recurso criado com sucesso (POST) |
| 202 | Accepted | Requisição aceita para processamento assíncrono |
| 204 | No Content | Sucesso sem corpo de resposta (DELETE) |
| 206 | Partial Content | Range requests (streaming, downloads resumíveis) |
3xx: Redirecionamento (Redirection)
Informa que o cliente precisa realizar uma ação adicional para completar a requisição.
| Código | Reason Phrase | Comportamento |
|---|---|---|
| 301 | Moved Permanently | Redirecionamento definitivo (SEO link juice) |
| 302 | Found | Redirecionamento temporário |
| 303 | See Other | Redirecionamento para outro URI via GET |
| 304 | Not Modified | Resposta a If-Modified-Since / If-None-Match |
| 307 | Temporary Redirect | Preserva método HTTP original |
| 308 | Permanent Redirect | Como 301, mas preserva método e body |
A distinção crítica entre 301 e 307 (preservação de método) é frequentemente mal compreendida: 301 permite que o navegador converta um POST em GET, enquanto 307 exige que o método original seja mantido.
4xx: Erros do Cliente (Client Errors)
Atribui a falha da requisição a algum erro por parte do cliente (ex: sintaxe incorreta, recurso inexistente, falta de permissão).
| Código | Reason Phrase | Causa Comum |
|---|---|---|
| 400 | Bad Request | Sintaxe HTTP inválida |
| 401 | Unauthorized | Falta de autenticação (header Authorization) |
| 403 | Forbidden | Autenticado mas sem permissão |
| 404 | Not Found | Recurso não existe |
| 405 | Method Not Allowed | Método não permitido para o recurso |
| 408 | Request Timeout | Cliente não enviou dados a tempo |
| 409 | Conflict | Estado conflitante (PUT em versão desatualizada) |
| 410 | Gone | Recurso removido permanentemente |
| 413 | Payload Too Large | Body excede limite do servidor |
| 414 | URI Too Long | URL acima do limite |
| 415 | Unsupported Media Type | Content-Type não suportado |
| 422 | Unprocessable Entity | Sintaxe correta, mas semântica inválida |
| 429 | Too Many Requests | Rate limiting excedido |
5xx: Erros do Servidor (Server Errors)
Indica que o servidor falhou ao tentar processar uma requisição aparentemente válida por motivos internos de infraestrutura ou aplicação.
| Código | Reason Phrase | Causa Comum |
|---|---|---|
| 500 | Internal Server Error | Erro genérico de backend |
| 501 | Not Implemented | Servidor não suporta o método |
| 502 | Bad Gateway | Proxy recebeu resposta inválida do upstream |
| 503 | Service Unavailable | Sobrecarga ou manutenção |
| 504 | Gateway Timeout | Upstream não respondeu a tempo |
| 505 | HTTP Version Not Supported | Versão HTTP não suportada |
| 511 | Network Authentication Required | Portal cativo (Wi-Fi público) |
2. Semântica de Comunicação e Resposta Padrão
O servidor não envia apenas o número do código, mas também uma Reason Phrase (Frase de Motivo), que é uma breve descrição em texto legível por humanos (ex: 200 OK, 404 Not Found). Embora a frase possa ser alterada pelo administrador, o número de três dígitos é o padrão técnico imutável que as máquinas utilizam para o controle de fluxo.
Estrutura Completa da Response
HTTP/1.1 200 OK
Date: Wed, 21 Oct 2024 07:28:00 GMT
Server: nginx/1.25.3
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Cache-Control: max-age=3600
Connection: keep-alive
<html>...</html>
A primeira linha contém versão HTTP, código de status e reason phrase. Em HTTP/2, o código é transportado no frame HEADERS com pseudo-header :status.
3. Códigos Customizados e Não-Oficiais
Embora não façam parte da RFC 9110, alguns códigos se popularizaram informalmente:
- 418 I'm a teapot: Brincadeira do RFC 2324 (Hyper Text Coffee Pot Control Protocol). Cloudflare e Google retornam em alguns endpoints.
- 420 Enhance Your Calm: Twitter antigo (agora usa 429).
- 451 Unavailable For Legal Reasons: Padronizado no RFC 7725, usado para censura governamental.
- 520 Unknown Error: Cloudflare, erro não-classificado de origem.
- 521 Web Server Down / 522 Connection Timed Out: Cloudflare específico.
4. Perspectiva de Cyber Security e Status Codes
Para um analista de Cyber Security, os códigos de resposta são fontes valiosas de informação e pontos de auditoria.
Vazamento de Informações via Erros (500 e 403)
Servidores mal configurados que retornam erros detalhados (ex: 500 Internal Server Error exibindo o stack-trace do código-fonte ou o banco de dados utilizado) entregam de bandeja para o atacante a arquitetura interna da organização.
- Recomendação: Implementar páginas de erro customizadas que informem apenas o erro genérico para o usuário final, mantendo os detalhes técnicos exclusivamente nos logs de auditoria privados.
Reconhecimento de Ativos via 404 e 403
Atacantes utilizam ferramentas de "fuzzing" (ex: ffuf, dirb, gobuster) para testar milhares de URLs. Uma resposta 403 Forbidden indica que o recurso existe, mas está protegido, enquanto um 404 Not Found indica a ausência total. Esta distinção é usada para "mapear" diretórios administrativos ocultos em servidores vulneráveis.
Mitigação: Retornar 404 em vez de 403 para recursos protegidos não-publicados (camuflagem), ou usar honeypots com 200 fake para confundir varredores.
Defesa Proativa contra DDoS
O código 429 Too Many Requests é a ferramenta de defesa definitiva contra robôs e ataques de força bruta. Ao retornar este código junto com filtros de Rate Limiting (Limitação de Taxa), o servidor web preserva seus recursos de CPU e Banco de Dados contra exaustão maliciosa.
Cabeçalho Retry-After informa quanto tempo o cliente deve esperar:
HTTP/1.1 429 Too Many Requests
Retry-After: 60
Content-Type: application/json
{"error": "rate_limit_exceeded"}
Detecção de Credential Stuffing
Picos de 401 Unauthorized provenientes de um mesmo IP indicam ataque de força bruta ou credential stuffing. Ferramentas SIEM (Splunk, Elastic, QRadar) correlacionam essas respostas com feeds de ameaças (TOR exit nodes, IPs maliciosos conhecidos).
5. Auditoria Técnica e Diagnóstico de Resposta
Monitorar a distribuição dos códigos de resposta permite identificar rapidamente falhas de infraestrutura:
# Inspecionando o codigo de status retornado sem carregar o corpo
curl -I https://www.meusite.com.br
# Contabilizando os erros 4xx e 5xx nos logs de acesso para identificar picos de falha
grep -c " 404 " /var/log/nginx/access.log
grep -c " 500 " /var/log/nginx/access.log
# Distribuicao completa por codigo de status (top 10)
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
# Percentual de erros 5xx em um dia
total=$(wc -l < /var/log/nginx/access.log)
errors=$(grep -c " 5[0-9][0-9] " /var/log/nginx/access.log)
echo "scale=2; $errors * 100 / $total" | bc
SLOs Típicos Baseados em Status Codes
| SLO | Meta | Status Codes |
|---|---|---|
| Disponibilidade | 99,9% | 200, 201, 204, 301, 302 |
| Erro do cliente | < 5% | 4xx |
| Erro do servidor | < 0,1% | 5xx |
| Latência p95 | < 500 ms | Time to first byte |
6. Comportamento dos Navegadores
Diferentes User-Agents tratam códigos de status de forma específica:
| Código | Comportamento Chrome | Comportamento Firefox |
|---|---|---|
| 301/308 | Atualiza URL na barra | Idem |
| 302/307 | Mantém método original (307) | Idem |
| 304 | Usa cache local | Idem |
| 401 | Solicita credenciais (Basic) | Idem |
| 403 | Exibe página de erro | Idem |
| 404 | Exibe página customizada do servidor | Idem |
| 500 | Página genérica de erro | Idem |
7. Conclusão: A Resposta da Máquina
Os Códigos de Resposta HTTP são os sinais de trânsito que organizam o fluxo de informações na Internet. Sua clareza semântica permite que navegadores e servidores cooperem para oferecer experiências rápidas e seguras. Dominar a classificação das famílias de status (1xx informativo, 2xx sucesso, 3xx redirecionamento, 4xx erro do cliente, 5xx erro do servidor), gerenciar com precisão as permissões de acesso (403 vs 404) e monitorar continuamente os picos de erros de servidor são as bases para garantir que a infraestrutura web seja não apenas funcional, mas auditável, observável e resiliente a incidentes de segurança cibernética em escala global.