O que é HTTP?
O HTTP, ou HyperText Transfer Protocol, é a forma como clientes e servidores se comunicam na web. Um cliente envia uma request descrevendo o que deseja; um servidor envia uma response descrevendo o que aconteceu. Cada carregamento de página, chamada de API, imagem e fonte trafega dessa maneira.
Trata-se de um protocolo simples, baseado em texto e stateless: cada requisição é independente e o servidor não lembra das anteriores, a menos que algo como um cookie carregue esse estado. Essa simplicidade é a razão pela qual o HTTP escalou para toda a web.
Requests
Uma requisição possui um método, um caminho (path), headers e, às vezes, um corpo (body).
POST /api/users HTTP/2
Host: example.com
Content-Type: application/json
Accept: application/json
Authorization: Bearer <token>
{ "name": "Ada" }
O método define qual tipo de ação está sendo realizada. O path identifica o recurso. Os headers carregam metadados, e o body carrega os dados para métodos como POST e PUT.
| Método | Propósito | Seguro | Idempotente |
|---|---|---|---|
| GET | Ler um recurso | Sim | Sim |
| POST | Criar ou disparar | Não | Não |
| PUT | Substituir um recurso | Não | Sim |
| PATCH | Atualizar parcialmente | Não | Não |
| DELETE | Remover um recurso | Não | Sim |
Seguro significa que a operação não altera o estado; idempotente significa que repeti-la tem o mesmo efeito que executá-la apenas uma vez. Essas propriedades são importantes para cache, retentativas (retries) e proxies.
Respostas e códigos de status
Uma resposta possui um código de status, headers e um corpo.
HTTP/2 201 Created
Content-Type: application/json
Location: /api/users/42
{ "id": 42, "name": "Ada" }
O código de status informa ao cliente o que aconteceu. Conheça os mais comuns:
- 200 OK — sucesso.
- 201 Created — um novo recurso foi criado.
- 204 No Content — sucesso, mas sem corpo na resposta.
- 301 / 302 — redirecionamentos permanentes e temporários.
- 304 Not Modified — a cópia em cache ainda é válida.
- 400 Bad Request — entrada inválida.
- 401 Unauthorized — não autenticado.
- 403 Forbidden — autenticado, mas sem permissão de acesso.
- 404 Not Found — recurso não encontrado.
- 500 Internal Server Error — falha no servidor.
Retornar o código correto não é pedantismo: clientes, caches e monitoramento dependem disso.
Headers
Headers são a camada de metadados. Headers de requisição comuns incluem Accept, Content-Type, Authorization, Cookie e User-Agent. Headers de resposta comuns incluem Content-Type, Content-Length, Cache-Control, Set-Cookie e headers de segurança como Content-Security-Policy.
// fetch.js
const res = await fetch("/api/posts", {
headers: {
Accept: "application/json",
Authorization: `Bearer ${token}`,
},
});
Headers são a forma como a negociação de conteúdo, autenticação, cache e políticas de segurança são expressas.
Cookies e sessões
O HTTP é stateless, por isso os servidores utilizam cookies para reconhecer usuários recorrentes. O servidor envia Set-Cookie, e o navegador envia esse cookie de volta em requisições subsequentes para a mesma origem.
Cookies de sessão devem ser sempre:
Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Lax; Path=/
- HttpOnly impede que o JavaScript o leia, o que mitiga ataques de XSS.
- Secure garante que ele seja enviado apenas via HTTPS.
- SameSite limita o envio entre sites diferentes, o que ajuda a prevenir CSRF.
O guia de Web Security aborda o cenário completo.
Caching
O caching é o recurso de HTTP mais valioso para a performance. Dois mecanismos trabalham juntos:
- Freshness (Frescor) com
Cache-Control, que define por quanto tempo uma resposta pode ser reutilizada. - Validation (Validação) com
ETagouLast-Modified, que permite ao cliente perguntar “isso mudou?” e receber um304 Not Modifiedquando não houve alterações.
# versioned assets: cache for a year
Cache-Control: public, max-age=31536000, immutable
# HTML: revalidate every time
Cache-Control: no-cache
Utilize fingerprints em seus assets com um hash de conteúdo e faça o cache de forma agressiva; um arquivo alterado receberá um novo nome. Sirva o HTML com um cache curto e revalide para que os deploys sejam detectados.
HTTPS e TLS
HTTPS é HTTP sobre TLS. O TLS faz três coisas:
- Criptografa o tráfego para que ele não possa ser lido durante o trânsito.
- Autentica o servidor com um certificado.
- Preserva a integridade para que os dados não possam ser alterados silenciosamente.
Obtenha um certificado (existem opções gratuitas), redirecione todo o tráfego HTTP para HTTPS e habilite o HSTS para evitar que os navegadores utilizem HTTP simples no seu domínio. Trate o HTTP como um protocolo legado.
Versões do HTTP
- HTTP/1.1 — uma requisição por vez por conexão, razão pela qual os sites costumavam concatenar arquivos.
- HTTP/2 — multiplexa várias requisições em uma única conexão e compacta headers, eliminando a maioria desses gambiarras.
- HTTP/3 — roda sobre QUIC, um transporte baseado em UDP, reduzindo a latência de conexão e lidando melhor com a perda de pacotes.
Servir HTTPS geralmente habilita HTTP/2 ou HTTP/3 automaticamente através do seu servidor ou CDN. Raramente você precisará alterar seu código.
Melhores práticas
- Use HTTPS em todos os lugares e redirecione HTTP para HTTPS com HSTS.
- Retorne códigos de status precisos e corpos de erro significativos.
- Mantenha os métodos seguros e idempotentes, conforme exigido por suas definições.
- Defina
Cache-Controle validadores deliberadamente. - Use cookies HttpOnly, Secure e SameSite para sessões.
- Configure headers de segurança como CSP e
X-Content-Type-Options. - Prefira HTTP/2 ou HTTP/3 e deixe a plataforma negociar a versão.
Erros comuns
- Retornar 200 para erros, o que quebra clientes e caches.
- Mutar dados com GET, o que é inseguro e pode ser cacheado ou sofrer prefetch.
- Desativar o cache para tudo, prejudicando a performance.
- Armazenar tokens de sessão em
localStorageem vez de um cookie. - Esquecer de redirecionar HTTP para HTTPS.
- Ignorar
Content-Typee receber erros de parse.
Próximos passos
O HTTP é a linguagem universal da web, e dominá-lo traz benefícios em qualquer área. Aprofunde-se nos fundamentos da internet, entenda o DNS, faça requisições com JavaScript usando Fetch e proteja seu tráfego com o guia de Web Security.