← tópicos

Específicos · Engenharia de Software

HTTP: métodos (idempotência), status (401×403, 301×302, 5xx), stateless, cookies

O primeiro dígito do código de status já diz de quem é a culpa, e é essa leitura que decide os itens de HTTP do tópico; a idempotência dos métodos é edital que esta amostra ainda não cobrou.

Altíssima8 itens no tópico

A ideia que organiza o assunto

O HTTP é um protocolo de requisição e resposta em que o cliente sempre fala primeiro e o servidor não guarda memória da conversa anterior. Essas duas frases não são detalhes de implementação: são a arquitetura, e delas decorre tudo o que a prova cobra.

Porque o servidor não guarda contexto, cada requisição precisa chegar autocontida, com o método, o endereço e os cabeçalhos que a tornam interpretável sozinha. É isso que permite pôr proxy, cache e balanceador no caminho e atender a mesma sequência de chamadas em instâncias diferentes — e é isso que obriga a inventar cookie, token e sessão do lado de fora do protocolo para simular a continuidade que ele deliberadamente não oferece. Repare na inversão que a banca explora: o cookie existe porque o HTTP é sem estado, não como prova de que ele tenha estado.

Porque a resposta é sempre estruturada da mesma maneira — linha de estado, cabeçalhos e, se houver, corpo —, o código de status é obrigatório e o corpo é opcional. E porque o código tem três dígitos com o primeiro carregando a família, a leitura correta de uma resposta começa antes de saber o código exato: 4xx é culpa do cliente, 5xx é culpa do servidor. Só essa distinção resolve uma fatia grande dos itens, porque dela decorre a única pergunta prática que importa — vale a pena repetir a requisição sem mudar nada?

A terceira ideia é a semântica do método. O verbo não é decoração: ele declara ao servidor e a todo intermediário se aquela requisição altera o recurso (seguro) e se repeti-la soma efeito (idempotente). É a combinação dessas duas propriedades que autoriza um proxy a fazer cache, um navegador a repetir uma requisição que falhou e uma biblioteca a implementar retentativa automática.

O método para julgar item, então: identifique o dígito, identifique o verbo, pergunte de quem é a responsabilidade. Quase nada aqui exige memória além dessas três perguntas e das tabelas que as respondem.

Como funciona

A requisição tem uma linha inicial com método, alvo e versão, seguida de cabeçalhos e de um corpo opcional. A resposta tem uma linha de estado com a versão, o código de três dígitos e uma frase de motivo, seguida de cabeçalhos e de corpo opcional. O código é estrutural — não existe resposta HTTP sem ele —, ao passo que o corpo falta em várias situações legítimas: no 204, no 304 e em qualquer resposta a um HEAD.

Os métodos, pelas duas propriedades que decidem item:

Seguro quer dizer que o método não pretende alterar o estado do recurso; idempotente quer dizer que o efeito de N requisições idênticas é o mesmo de uma. Todo método seguro é idempotente, mas a recíproca é falsa — PUT e DELETE são a prova.

As cinco famílias de status, cada uma com uma responsabilidade:

401 contra 403 é a distinção mais cobrada da família 4xx. O 401 diz não sei quem você é: falta autenticação, ou a credencial apresentada não vale, e a resposta traz o cabeçalho WWW-Authenticate convidando o cliente a se autenticar. O 403 diz sei quem você é e não é o bastante: a autenticação foi aceita, mas aquela identidade não tem permissão para o recurso, e reapresentar a mesma credencial não muda nada. Em uma frase: 401 é autenticação, 403 é autorização.

429 Too Many Requests é a resposta ao excesso de requisições no intervalo — situação típica de força bruta, varredura e negação de serviço na camada de aplicação. A contramedida correspondente é a limitação de taxa, que inclui retardar deliberadamente a resposta para reduzir a taxa útil do atacante e encarecer cada tentativa.

Ausência de estado, na prática. O protocolo não guarda sessão, e o estado é reintroduzido por cima dele: cookie gravado no cliente e devolvido a cada requisição, token em cabeçalho de autorização, identificador de sessão que o servidor usa para buscar o contexto no seu próprio armazenamento. Nada disso altera a natureza do protocolo — apenas a contorna.

O que decide os itens

As famílias, pela responsabilidade e pela conduta:

famíliade quem é a falharepetir sem alterar nada resolve?
1xx— informativa
2xx— sucesso
3xx— redirecionamentosegue-se o Location
4xxdo clientenão — é preciso mudar a requisição
5xxdo servidorpode — a falha é possivelmente transitória

Os pares que a banca opõe:

significao que muda
401não autenticadofalta credencial ou ela é inválida; vem com WWW-Authenticate
403autenticado, sem permissãoreapresentar a credencial não adianta
301mudança permanenteo cliente pode memorizar o novo endereço
302mudança temporáriao endereço original continua válido
307 / 308temporária / permanentepreservam o método; 301 e 302 podem virar GET
200sucesso com corpo
204sucesso sem corpo
404recurso inexistenteculpa do cliente
500falha no servidorculpa do servidor
502 / 504gateway502 resposta inválida do servidor de origem; 504 tempo esgotado

Métodos, pelas duas propriedades:

métodoseguroidempotente
GETsimsim
HEADsimsim
OPTIONSsimsim
TRACEsimsim
PUTnãosim
DELETEnãosim
PATCHnãonão (em geral)
POSTnãonão

Regra de bolso: só o POST falha nas duas colunas; o PATCH falha na segunda; todo método seguro é idempotente e a recíproca é falsa.

Obrigatório × opcional na resposta:

código de statussempre presente — é estrutural
corpoopcional — ausente no 204, no 304 e em resposta a HEAD

Ausência de estado, nas duas direções:

o item diz…veredito
o servidor não guarda contexto entre requisiçõescerto
cada requisição traz tudo o que é preciso para ser entendidacerto
o cookie existe porque o protocolo é sem estadocerto
o cookie torna o HTTP um protocolo com estadoerrado
o servidor mantém sessão aberta entre duas chamadaserrado

Registro em log, em qualquer servidor web — IIS, Apache e NGINX gravam o mesmo núcleo de campos: endereço IP de origem, data e hora, método, recurso solicitado, código de status e tempo de resposta. É o conjunto que sustenta auditoria e resposta a incidente, e item que negue esse registro básico a um deles está errado.

Números que caem

porta do HTTP · do HTTPS80 · 443
dígitos de um código de status3; o primeiro define a família
famílias de status5: 1xx, 2xx, 3xx, 4xx, 5xx
handshake do WebSocket101 Switching Protocols
criado com sucesso, com Location201
sucesso sem corpo204
redirecionamento permanente · temporário301 · 302
redirecionamentos que preservam o método307 (temporário) · 308 (permanente)
conteúdo não modificado, resposta a requisição condicional304
requisição malformada400
não autenticado · sem permissão401 · 403
recurso inexistente · método não permitido404 · 405
conflito de recurso409
excesso de requisições429
erro interno do servidor500
gateway inválido · serviço indisponível · tempo esgotado no gateway502 · 503 · 504
métodos seguros4: GET, HEAD, OPTIONS, TRACE
métodos idempotentes6: os quatro seguros mais PUT e DELETE
método nem seguro nem idempotente1: POST

Como a CEBRASPE derruba você aqui

A medição está fechada, e a primeira coisa que ela mostra é que o título promete mais do que a amostra cobra. São 8 itens explicados: 5 Certos e 3 Errados. Só 4 dos 8 são de HTTP — três de código de status (4xx contra 5xx, o 429 e a obrigatoriedade do código) e um único de método, o HEAD. Os outros quatro chegaram pelo enunciado do caderno, não pela matéria: log do IIS, git cherry-pick, realm do Tomcat e modo InPrivate do Edge. A tabela de idempotência dos métodos é, portanto, conteúdo de edital ainda não cobrado nesta amostra: está aqui porque é barata de guardar e decide item em qualquer caderno de API, não porque estes oito a tenham exigido.

Com três itens errados não há frequência a citar — os três fazem movimentos distintos, e é assim que estão descritos abaixo. O que é apenas conhecido do assunto vem rotulado como não medido.

Família de status trocada. “Usuários que recebem um código de status HTTP 4XX podem refazer a solicitação mesmo sem alterar nada e ter sucesso na próxima resposta” descreve corretamente a conduta diante de um 5xx e a pendura na família errada. O 4xx é erro do cliente: repetir a mesma requisição produz a mesma resposta. Sempre que um item associar uma conduta a uma família, faça a pergunta de quem é a culpa antes de aceitar.

Advérbio absoluto que está certo. “As requisições a um servidor Apache sempre retornam um código de status e, opcionalmente, um corpo de resposta” usa sempre e é verdadeiro, porque a obrigatoriedade do código é estrutural. É o caso que ensina a não marcar errado por reflexo: diante de sempre, procure a exceção concreta, e se não houver nenhuma, o advérbio é legítimo. Neste tópico há um par que se confunde — o código é sempre obrigatório, o corpo é sempre opcional.

Modo privativo com alcance esticado. O modo InPrivate do Edge “apaga os cookies, os arquivos baixados e os sites selecionados como favoritos durante uma sessão de navegação” — a frase começa certa e estende a regra a dois itens que sobrevivem ao fim da janela. O modo privativo descarta o rastro da navegação — histórico, cookies, dados de site e de formulário —, não os artefatos salvos: o arquivo baixado fica no disco e o favorito fica nos favoritos. Vale igualmente para o modo anônimo de qualquer navegador.

Ação real, componente errado. “Um realm no servidor Tomcat verifica a integridade de um arquivo ao comparar o seu resumo de mensagem com o do arquivo original” descreve verificação de checksum e a atribui ao repositório de usuários, senhas e papéis do Tomcat. A vizinhança é o que torna o item plausível — o realm de fato costuma guardar a senha como resumo de mensagem. Separe o objetivo: autenticar é provar identidade; comparar resumo de arquivo é conferir integridade.

Comando de versionamento trocado pelo vizinho — conhecido do assunto, não medido aqui. O único item de Git da amostra é Certo e descreve o git cherry-pick com precisão: aplica no ramo atual as alterações de commits já existentes e exige árvore de trabalho limpa. A troca segue previsível porque a família inteira é alvo — merge junta históricos, rebase reescreve a base do ramo, cherry-pick copia commits avulsos e revert cria um commit que desfaz outro —, e a descrição costuma vir correta com o nome do comando trocado. Fica registrada como expectativa, não como medição.

Erros clássicos

Confundir 401 com 403. 401 é autenticação — não sei quem você é, e a resposta traz WWW-Authenticate. 403 é autorização — sei quem você é e não basta. Reapresentar credencial resolve o primeiro e não resolve o segundo.

Confundir 301 com 302. 301 é permanente e o cliente pode memorizar o novo endereço; 302 é temporário e o original continua valendo. E nenhum dos dois garante preservar o método — quem garante são o 307 e o 308.

Achar que toda resposta tem corpo. 204, 304 e a resposta a um HEAD não têm. O que nunca falta é o código de status.

Achar que POST é idempotente. É o único método que não é seguro nem idempotente. Repetir um POST cria outro recurso.

Achar que DELETE não é idempotente porque a segunda resposta muda. A idempotência é do efeito sobre o recurso, não do código devolvido: depois da segunda tentativa o recurso continua ausente.

Achar que HEAD devolve um corpo reduzido. Não devolve corpo nenhum — devolve os mesmos cabeçalhos que o GET devolveria.

Achar que o cookie torna o HTTP um protocolo com estado. O protocolo continua sem estado; o cookie é o mecanismo externo que reintroduz continuidade justamente porque ele não a tem.

Tratar 429 como erro do servidor. É 4xx: quem excedeu o limite foi o cliente. A resposta costuma vir com Retry-After.

Confundir 403 com 404 em recurso protegido. Devolver 404 no lugar de 403 é decisão de projeto para não revelar a existência do recurso, e não equivalência entre os códigos.

Praticar8 itens