O HTTP parece uma lista enorme de coisas para aprender: os métodos, dezenas de códigos de status, um registro extenso de campos de header (cabeçalho), cookies, proxies, cinco versões. Na verdade, ele é menor do que essa lista. Toda troca é uma requisição e uma resposta, e cada item da lista ou é uma parte dessas duas mensagens, ou é uma forma de transportá-las.
Uma troca, duas mensagens
O padrão resume o protocolo inteiro numa frase: "HTTP is a stateless request/response protocol for exchanging 'messages' across a connection" ( 9110, seção 3.4), ou seja, um protocolo de requisição e resposta, stateless (sem estado), que troca mensagens por uma conexão. O cliente envia uma requisição: um método, que diz o que ele quer que seja feito; o alvo, sobre o qual isso deve ser feito; campos de header que detalham o pedido; e, às vezes, um corpo. O servidor responde com um código de status, que diz como foi, campos de header próprios e, normalmente, um corpo.
Essa também é a ordem certa para aprender. Leia a requisição de cima para baixo, do jeito que o servidor lê: a linha de requisição (a request line, com o método e o alvo), depois os campos, depois o corpo e o ponto em que ele termina. Leia a resposta do mesmo jeito: o status, depois os campos. A série segue essa ordem e depois passa para as camadas em volta das mensagens.
Duas camadas desde junho de 2022
Durante a maior parte da sua história, o padrão do HTTP/1.1 misturava dois tipos de regra. Umas dizem o que a mensagem significa: o que um GET promete, o que um 304 obriga um cache a fazer, para que serve o campo Host. Outras dizem como a mensagem é organizada em bytes: linhas de texto que terminam com um carriage return e um line feed, e um tamanho ou uma codificação chunked que mostra onde o corpo termina.
Em junho de 2022, a Internet Engineering Task Force () republicou o HTTP com os dois tipos de regra separados. A RFC 9110, HTTP Semantics, "defines aspects of the protocol that are shared by all versions", ou seja, reúne o que vale para todas as versões: os métodos, os códigos de status, os campos. Cada versão tem, então, um documento próprio para o formato em que a mensagem trafega: a RFC 9112 para as mensagens de texto do HTTP/1.1, a RFC 9113 para os frames binários e os streams multiplexados do , e a RFC 9114 para o , que roda sobre o transporte QUIC em vez do TCP.
Essa separação é a ideia mais útil da série. Um 404 significa a mesma coisa no HTTP/1.1 e no HTTP/3, e um GET faz as mesmas promessas nos dois; o que muda é o framing (a forma como os bytes que carregam tudo isso são delimitados). Quando algo quebra, pergunte em que camada quebrou. Um servidor que responde 403 a uma requisição que deveria aceitar tem um problema de significado. Dois equipamentos que discordam sobre onde uma mensagem termina têm um problema de framing, e é exatamente nessa discordância que vive o request smuggling.
O que o HTTP deixa para os outros
O HTTP é stateless de propósito: cada requisição vale por si, e o servidor não tem obrigação nenhuma de lembrar da anterior. O estado foi acrescentado por cima. O servidor grava um cookie com o header Set-Cookie, e o navegador o devolve com o header Cookie, nas requisições que o escopo do cookie permite (RFC 6265).
O caminho também raramente é direto. "HTTP enables the use of intermediaries to satisfy requests through a chain of connections", e o padrão cita três formas comuns desses intermediários: proxy, gateway e túnel (RFC 9110, seção 3.7). Quase tudo o que um operador mantém entre o navegador e o servidor é um deles, seja um forward proxy na borda do escritório, seja um reverse proxy na frente dos servidores, e cada um lê, e pode reescrever, as mensagens que repassa.
O método mais novo
A lista de métodos cresceu em junho de 2026. A define o QUERY: "As with POST, the input to the query operation is passed as the content of the request rather than as part of the request URI"; mesmo assim, "QUERY requests are safe with regard to the target resource" e "QUERY requests are idempotent". Na prática, uma busca grande demais para caber num endereço agora pode ir no corpo da requisição e, ainda assim, ser repetida e ter a resposta guardada em cache, como acontece com um GET.
Esta série, em ordem
Dez partes: a mensagem lida de cima para baixo, depois as camadas em volta dela e, por fim, um epílogo.
- Requisição HTTP crua: como ler e transformar de volta em algo que roda. A mensagem como ela chega de verdade, com linha de requisição, campos e corpo, e as três armadilhas na hora de reproduzi-la.
- Métodos HTTP: os verbos da web. A primeira palavra da linha de requisição e as duas propriedades, safe (segura) e idempotente, que caches, retries e crawlers levam em conta para agir.
- Códigos de status HTTP: as cinco famílias. O primeiro dígito da resposta já diz quase tudo; depois vêm os códigos que um operador encontra de fato.
- Headers HTTP: a anatomia dos metadados. Os campos que as duas mensagens carregam: os quatro papéis que eles cumprem, o campo Host e a divisão entre fim a fim () e hop by hop.
- Cookies HTTP: estado sobre um protocolo sem estado. Dois campos de header que dão memória a um protocolo stateless, e as regras que dizem quando o cookie vai junto.
- Onde uma mensagem HTTP/1.1 termina: Content-Length, chunked e as oito regras. A camada de framing: como o receptor sabe onde uma mensagem acaba e a próxima começa, e o que o smuggling explora.
- Proxies HTTP: forward ou reverse, explícito ou transparente. Os intermediários: para qual lado o proxy trabalha, se o cliente sabe que ele está ali e os campos que registram a passagem dele.
- HTTP/0.9 vs 1.0 vs 1.1 vs 2 vs 3: cinco versões do protocolo da web. Os mesmos significados transportados de cinco formas, de um GET de uma linha só a streams multiplexados sobre QUIC.
- HTTP QUERY: a leitura que finalmente carrega um corpo. O método mais novo: o que ele resolve, como as respostas dele vão para o cache e o que cada camada da infraestrutura precisa verificar.
- Mensagens escondidas em headers HTTP: homenagens, piadas e vagas de emprego no overhead. Um epílogo: o que as pessoas escreveram nos campos que quase ninguém lê.
Fontes
- RFC 9110, HTTP Semantics (STD 97), junho de 2022: o resumo (os aspectos "shared by all versions"), a seção 3.4 (um protocolo de requisição e resposta sem estado) e a seção 3.7 (intermediários: proxy, gateway, túnel) (lida em 2026-10-07)
- RFC 9112, HTTP/1.1 (STD 99), junho de 2022: a sintaxe e o enquadramento das mensagens da versão 1.1 (lida em 2026-10-06)
- RFC 9113, HTTP/2, junho de 2022: "an optimized expression of the semantics" do HTTP; torna obsoletas a RFC 7540 e a RFC 8740 (lida em 2026-10-06)
- RFC 9114, HTTP/3, junho de 2022: o HTTP sobre o transporte QUIC (lida em 2026-10-06)
- RFC 6265, HTTP State Management Mechanism, abril de 2011: os campos de cabeçalho Cookie e Set-Cookie (lida em 2026-10-06)
- RFC 10008, The HTTP QUERY Method, junho de 2026: a seção 1 (a consulta passada como conteúdo da requisição), a seção 2 (segura e idempotente) e a seção 2.7 (a resposta pode ir para o cache) (lida em 2026-10-06)