← tópicos

Específicos · Engenharia de Software

TLS, DNS, proxy reverso, cache (ETag, Cache-Control), CDN

Entre o navegador e a aplicação há uma cadeia — resolver o nome (DNS), abrir o canal (TLS, entre aplicação e transporte), atravessar o intermediário (proxy direto serve o cliente, proxy reverso…

Altíssima23 itens no tópico

A ideia que organiza o assunto

Uma requisição web não vai do navegador ao servidor: ela atravessa uma cadeia de intermediários, e cada um deles resolve um problema diferente. Antes de qualquer conexão, é preciso descobrir para onde ir — e isso é o DNS. Depois é preciso abrir um canal em que ninguém leia nem altere o que passa — e isso é o TLS. No caminho há intermediários que falam pelos dois lados — os proxies. E, no fim, a melhor requisição é a que não precisa acontecer — e isso é cache.

Por isso, diante de qualquer item do tópico, a pergunta é sempre a mesma: quem faz isso, e em que ponto da cadeia? A banca quase nunca inventa uma função; ela pega uma função verdadeira e a atribui ao elo errado — dá ao CDN o papel do servidor de aplicação, dá ao TLS uma posição entre camadas que não é a dele, nega ao Apache uma capacidade que ele tem.

Dentro dessa cadeia, uma distinção decide sozinha uma boa parte dos itens: o proxy direto trabalha para o cliente; o proxy reverso trabalha para o servidor. O primeiro fica na saída da organização, guarda o que os usuários acessaram e é ele quem aparece para a Internet — os clientes sabem que ele existe, o servidor de destino não. O segundo fica na frente dos servidores web: o cliente acha que está falando com a aplicação, e é o proxy reverso quem recebe a conexão, encerra o TLS, distribui carga, guarda cache e audita o tráfego. Mesma tecnologia, sentido oposto, e é o sentido que a prova cobra.

Por que se usa (e o que custa)

Cada elo dessa cadeia compra algo e cobra algo, e os custos explicam os itens.

O DNS compra nomes memorizáveis e a liberdade de trocar o endereço IP sem avisar ninguém. Paga com dependência e com cache: enquanto o TTL não expira, o mundo continua indo ao endereço antigo, e um cache envenenado manda o usuário para o servidor do atacante sem que nada, na barra de endereço, mude. Distribuir o serviço em vários servidores com autoridade sobre a mesma zona é o preço que se paga em sincronização para não perder o serviço inteiro quando um deles cai.

O TLS compra confidencialidade, integridade e autenticação do servidor. Paga em custo de estabelecimento — há um aperto de mão com criptografia assimétrica antes do primeiro byte útil — e em cegueira dos intermediários: o conteúdo cifrado não pode ser inspecionado nem armazenado em cache por quem está no meio, a menos que o TLS seja encerrado ali.

O proxy reverso e o cache compram latência e escala: conteúdo servido da borda não consome o servidor de origem nem a travessia da rede. O que se paga é consistência — todo cache corre o risco de entregar conteúdo velho, e é por isso que existe todo o aparato de expiração e validação: max-age, ETag, Last-Modified, revalidação condicional. A pergunta que o protocolo responde não é “guardar ou não”, é “por quanto tempo posso usar sem perguntar, e como pergunto barato quando o prazo acabar”.

Como funciona

DNS. É um banco de dados distribuído e hierárquico que mapeia nomes em endereços IP. A hierarquia vai da raiz aos domínios de topo e destes aos domínios delegados; a delegação é o que permite que ninguém precise conhecer tudo. O resolvedor recursivo pergunta em nome do cliente e guarda a resposta pelo tempo do TTL; os servidores com autoridade sobre a zona são a fonte da verdade, e ter mais de um evita que a falha de um servidor derrube o serviço de nomes do domínio. Registros que caem: A e AAAA (nome para IPv4 e IPv6), CNAME (apelido), MX (correio), NS (delegação), SOA (dados da zona), PTR (a resolução reversa, do IP para o nome, em in-addr.arpa). O serviço usa a porta 53, em UDP para consultas normais e em TCP para respostas grandes e transferência de zona. No cliente também há cache: no Windows, ipconfig /displaydns mostra e ipconfig /flushdns limpa a tabela local que associa nomes visitados a endereços.

Do lado do ataque, o envenenamento de cache DNS insere uma resposta falsa no cache de um resolvedor, e a partir daí todos os clientes que dependem dele são desviados. O DNS também é instrumento de ataques de negação de serviço distribuída: consultas com origem forjada fazem servidores legítimos responderem à vítima, com amplificação — o mesmo protocolo aparece ora como alvo, ora como arma.

TLS. O HTTPS não é um protocolo novo: é HTTP sobre TLS, o antigo SSL, na porta 443. A camada de segurança é inserida entre a camada de aplicação e a de transporte — a aplicação entrega o dado ao TLS, que cifra e passa ao TCP. É por isso que o TLS protege o conteúdo HTTP sem que o HTTP saiba dele e sem alterar o roteamento IP. No estabelecimento da sessão, o servidor apresenta o seu certificado digital, assinado por uma autoridade certificadora em que o cliente confia; o cliente valida a cadeia, e as partes combinam uma chave simétrica de sessão usando criptografia assimétrica. Daí em diante o tráfego é cifrado com a chave simétrica, que é muito mais rápida. O certificado do cliente é opcional e só existe quando se exige autenticação mútua — o caso comum tem certificado de um lado só.

Proxy direto e proxy reverso. O proxy direto intermedia a saída dos clientes: armazena o conteúdo web recuperado recentemente e o compartilha entre todos os clientes da rede, o que reduz banda e acelera o acesso repetido, além de permitir filtragem e registro de navegação. O proxy reverso faz o inverso: apresenta-se como se fosse o servidor. Como todo o tráfego passa por ele, ele faz cache, acelera a exibição das páginas, audita toda a navegação, encerra o TLS, equilibra carga entre servidores de origem e serve de ponto para filtragem de aplicação. Apache e Nginx fazem os dois papéis — não há exclusividade de nenhum deles nessa função.

As diretivas que a prova cobra. No Apache, o proxy vive no mod_proxy: ProxyPass encaminha a requisição para o servidor de origem e ProxyPassReverse faz o caminho de volta, reescrevendo os cabeçalhos da respostaLocation, Content-Location e URI — para que as URLs vistas pelo cliente apontem para o proxy e não para o servidor interno. O mod_cache cuida do cache e é independente: funciona com conteúdo servido localmente ou por proxy. HostNameLookups On faz o servidor resolver por DNS reverso cada conexão de entrada, obtendo o nome do cliente a partir do IP — útil para registro, caro em desempenho, e por isso desativado por padrão. No Nginx, o bloco location escolhe o tratamento pelo prefixo da URL: com root, a requisição é mapeada em arquivo dentro do diretório indicado; com proxy_pass, ela é encaminhada ao endereço e porta de destino — o par clássico é location / com proxy_pass http://localhost:8080 e location /images/ com root /data.

Cache HTTP: expiração e validação. São dois mecanismos encadeados. Enquanto o conteúdo está fresco, o cache responde sozinho: quem define o prazo é o Cache-Control, com max-age em segundos (e s-maxage para caches compartilhados). Vencido o prazo, o cache não descarta o conteúdo — ele revalida: envia uma requisição condicional com If-None-Match, carregando o valor do ETag que recebeu, ou com If-Modified-Since, carregando a data do Last-Modified. Se nada mudou, o servidor responde 304 Not Modified, sem corpo, e o cache reaproveita o que já tinha — a economia está aí. As diretivas que a banca confunde: no-cache não proíbe armazenar, obriga a revalidar antes de usar; quem proíbe armazenar é no-store; private autoriza apenas o cache do navegador, public autoriza também os compartilhados; e must-revalidate proíbe servir conteúdo vencido quando a origem está inacessível. O ETag é um identificador opaco da versão do recurso, mais preciso que a data porque não depende de relógio nem de granularidade de segundo.

CDN. Rede de servidores distribuídos geograficamente que guardam cópias do conteúdo perto do usuário. Ela reduz latência e carga na origem, absorve picos e ajuda a mitigar negação de serviço. O que ela não faz é executar a aplicação: renderização do lado do servidor é papel do servidor de aplicação ou do framework, não da rede de distribuição de conteúdo.

O que decide os itens

Proxy direto × proxy reverso — a distinção de maior rendimento:

proxy diretoproxy reverso
trabalha parao clienteo servidor
ficana saída da rede do usuáriona frente dos servidores web
quem sabe que ele existeo cliente (é configurado nele)ninguém do lado do cliente
usos típicoscache compartilhado, filtragem, controle de navegação, anonimato do clientecache, balanceamento, encerramento de TLS, auditoria, WAF

Quem faz o quê na cadeia:

funçãoquem
traduzir nome em endereço IPDNS
traduzir endereço IP em nomeDNS reverso (registro PTR)
cifrar o conteúdo HTTPTLS, entre aplicação e transporte
guardar cópia perto do usuárioCDN / proxy / cache do navegador
reescrever cabeçalhos da resposta do backendProxyPassReverse (Apache)
encaminhar a requisição ao backendProxyPass (Apache), proxy_pass (Nginx)
renderizar a página no servidorservidor de aplicação, nunca o CDN

Cache: diretiva → efeito:

max-age=Nconteúdo fresco por N segundos; nesse prazo o cache responde sem perguntar
s-maxage=No mesmo, mas só para caches compartilhados
no-cachepode armazenar, mas precisa revalidar antes de usar
no-storenão pode armazenar em lugar nenhum
private / publicsó cache do navegador / também caches compartilhados
ETag + If-None-Matchvalidação por versão do recurso
Last-Modified + If-Modified-Sincevalidação por data de modificação
304 Not Modifiedresposta sem corpo: use o que você já tem

Fronteiras que a banca repete: o TLS fica entre aplicação e transporte, nunca entre transporte e rede; no estabelecimento comum só o servidor apresenta certificado, o do cliente é opcional; Apache e Nginx fazem proxy, cache e proxy reverso — nenhum recurso é exclusivo de um deles; mod_cache não depende de mod_proxy; CDN distribui conteúdo, não renderiza aplicação; ter mais de um servidor com autoridade sobre a zona é redundância, não redundância de cache; e envenenamento de cache DNS pode compor um ataque de negação de serviço, além de servir a desvio de tráfego.

Números que caem

DNSporta 53 (UDP nas consultas, TCP em resposta grande e transferência de zona)
HTTP / HTTPSportas 80 / 443
posição do TLSentre a camada de aplicação e a de transporte
resposta de revalidação bem-sucedida304 Not Modified
resolução reversaregistro PTR, domínio in-addr.arpa
servidores com autoridade por zonamais de um, para não perder o serviço em falha
Nginx do exemplo clássicoproxy_pass para a porta 8080 do localhost

Como a CEBRASPE derruba você aqui

Medido sobre os 23 itens do assunto: 8 são Errados, e metade deles cai no mesmo rótulo — atribuição errada 4, e generalização, inversão, troca de termo e relação causal com 1 cada. Duas observações antes dos padrões.

O peso do assunto não está onde o título sugere. O título abre com TLS, e TLS aparece em 3 dos 23 itens. Quem domina é o intermediário — proxy direto, proxy reverso e a configuração de Apache e Nginx somam 11 dos 23; DNS vem em 5. E 3 dos 23 itens não são deste assunto: MVC, REST e domain-driven design entraram porque dividiam o enunciado com um item de proxy reverso. Se aparecer um item de camada de modelo ou de statelessness no meio do bloco, não é erro de leitura sua.

6 dos 8 itens errados perguntam a mesma coisa: o que o intermediário faz. Proxy reverso, cache, CDN e módulo de servidor web concentram o erro; os outros dois são de TLS. E dentro desses seis há um formato que se repete mais que qualquer rótulo: o item nega, estreita ou condiciona uma capacidade que existe — 3 dos 8. Essa é a primeira verificação.

Negar ou estreitar uma capacidade real — 3 dos 8. “O Nginx suporta atuar como um proxy de páginas HTTP, capacidade que o Apache não possui”: a primeira metade é verdadeira e serve de isca, a segunda inventa uma exclusividade — o mod_proxy faz isso no Apache desde sempre. “Um proxy reverso não é adequado para ofertar conteúdo estático, mas, sim, dinâmico”: ele serve os dois, e estático com cache é justamente o que ele faz melhor. “O mod_cache […] mas depende da associação com o funcionamento do módulo mod_proxy”: os dois nomes existem, o cenário é plausível e a dependência é inventada — o mod_cache funciona também sobre conteúdo servido localmente. Defesa: as diferenças reais entre Apache e Nginx são de arquitetura e desempenho, não de existência de função; e relação de dependência entre componentes é barata de inventar e difícil de refutar por impressão. Marque “não possui”, “não é adequado” e “depende de” e trate cada um como afirmação a provar.

Dar a um elo a função de outro — 2 dos 8. O CDN que “serve para fornecer renderização do lado do servidor para aplicativos da Web” está descrevendo o servidor de aplicação: CDN guarda e entrega cópia, não executa a aplicação. E o proxy reverso que “busca a melhor forma de interconectar as requisições da porta 80 para Internet” inverte o sentido da cadeia — quem encaminha requisição para a Internet é o proxy direto; o reverso recebe da Internet e entrega aos servidores internos. Defesa: leia a função, decida sozinho de quem ela é, e só então olhe o nome que o item escreveu. Em proxy, a pergunta é sempre de quem ele é procurador.

Deslocar a camada, e generalizar o aperto de mão — 2 dos 8, os dois itens de TLS, e os dois com a frase quase inteira correta. O HTTPS implementado “introduzindo-se uma nova camada no modelo TCP/IP (camada SSL/TLS), posicionada entre as camadas de transporte e de rede”: a camada existe, o nome está certo, o modelo está certo, a posição é a do vizinho — se o TLS estivesse abaixo do TCP, cifraria os cabeçalhos que o roteamento precisa ler. E “o protocolo SSL/TLS funciona por meio da troca de certificados assinados digitalmente entre o computador do usuário e o servidor da aplicação”: transforma em regra o que é exceção, porque no HTTPS comum quem apresenta certificado é só o servidor. Defesa: em item de camada, desenhe a pilha e pergunte quem entrega a quem; em item de handshake, conte quantos certificados a frase exige.

O lado Certo quase nunca restringe. Nenhum dos 15 itens Certos limita por conta própria o que um componente pode fazer: eles descrevem ou autorizam — “pode ser usado para o compartilhamento desse conteúdo entre todos os clientes”, “permite que se faça cache de dados e acelere a exibição de páginas”, “tem a vantagem de evitar a perda do serviço”. As duas negações que aparecem em itens Certos pertencem à definição, não ao elaborador: o proxy reverso que “normalmente não gera ou hospeda os dados” e o REST em que o servidor “não mantém contexto de cliente”. Quando a restrição é do elaborador, ela é o erro; quando é da definição, é o gabarito.

O que ainda não foi medido. Nenhum item deste corpus cobrou cabeçalho de cache HTTP: Cache-Control, max-age, no-cache × no-store, ETag, Last-Modified e o 304 aparecem zero vezes em 23 itens, assim como a porta 53, a porta 443 e o TTL do DNS. O bloco continua na nota porque é o conteúdo canônico do tema e a banca o cobra em outros assuntos de HTTP — mas, neste recorte, é estudo de reserva. O que rende aqui é a cadeia de intermediários.

Erros clássicos

Achar que proxy reverso e proxy direto são o mesmo com nomes diferentes. Pergunte de quem o intermediário é procurador: se ele representa o cliente diante da Internet, é direto; se representa o servidor diante do cliente, é reverso. Cache, filtragem e registro existem nos dois — o que muda é o lado.

Confundir no-cache com no-store. no-cache permite guardar e obriga a perguntar antes de usar; no-store proíbe guardar. Item que trate no-cache como proibição de armazenamento está errado.

Achar que o 304 devolve o recurso. A resposta 304 é justamente a que não traz corpo: ela autoriza o cache a reutilizar a cópia que já tem. É daí que vem a economia da revalidação condicional.

Tratar ETag como data. ETag é identificador de versão, comparado com If-None-Match; a data é o Last-Modified, comparado com If-Modified-Since. Trocar os pares é a confusão mais comum do bloco de cache.

Supor que o TLS impede o cache. Não impede: impede que intermediários que não encerram o TLS vejam o conteúdo. O navegador guarda normalmente, e o proxy reverso que encerra a sessão também.

Esquecer que o DNS é hierárquico e distribuído. Não existe servidor único que saiba tudo, e é por isso que há delegação, TTL, cache em cada nível e mais de um servidor com autoridade por zona. Quase todo item de DNS se decide lembrando disso.

Praticar23 itens