Cabeçalhos HTTP desnecessários

Cabeçalhos HTTP são importantes para controlar como o cache e os navegadores processam seu conteúdo. Mas muitos deles são usados ​​incorretamente ou sem sentido, gastando recursos extras em um momento crítico do carregamento da página e podem não funcionar como você pensa. Em uma série de artigos sobre práticas recomendadas, examinaremos primeiro as manchetes desnecessárias.

A maioria dos desenvolvedores está ciente dos cabeçalhos HTTP importantes e úteis. Os mais famosos são o Content-Type Content-Length , são cabeçalhos quase universais. Recentemente, porém, cabeçalhos como Content-Security-Policy e Strict-Transport-Security foram usados ​​para aumentar a Strict-Transport-Security e Link rel=preload para melhorar o desempenho. Apesar do amplo suporte nos navegadores, apenas alguns os utilizam.

Ao mesmo tempo, existem muitas manchetes extremamente populares que geralmente não são novas e não são muito úteis. Podemos provar isso com a ajuda do HTTP Archive , um projeto executado pelo Google e patrocinado pela Fastly, que baixa 500.000 sites todos os meses usando o WebPageTest e carrega os resultados no BigQuery .

Aqui estão os 30 cabeçalhos de resposta mais populares de acordo com o HTTP Archive (com base no número de domínios no archive que cada cabeçalho exibe) e uma estimativa aproximada da utilidade de cada um deles:

MancheteInquéritosDomíniosStatus
data48779277535621Protocolo necessário
tipo de conteúdo47185627533636Geralmente exigido pelo navegador
servidor43057807519663Opcional
comprimento do conteúdo42388435519118Útil
modificado pela última vez34424562480294Útil
controle de cache36490878412943Útil
etag23620444412370Útil
codificação de conteúdo16194121409159Necessário para conteúdo compactado
expira29869228360311Opcional
x-powered-by4883204211409Opcional
pragma7641647188784Opcional
x-frame-options3670032105846Opcional
access-control-allow-origin11335681103596Útil
x-content-type-options1107156094590Útil
link121232987475Útil
idade740141559242Útil
x-cache527534356889Opcional
x-xss-protection977390651810Útil
segurança de transporte estrita425912151283Útil
via402011747102Opcional
p3p828284044308Opcional
expect-ct268528040465Útil
idioma do conteúdo33408137927Controverso
x-aspnet-version67612833473Opcional
access-control-allow-credentials280438230346Útil
x-robots-tag17917724911Não importa para navegadores
compatível com x-ua48905624811Opcional
métodos de controle de acesso e permissão162612920791Útil
acesso-controle-permitir-cabeçalhos120573519120Útil

Vejamos os cabeçalhos opcionais, por que não precisamos deles e o que fazer sobre isso.

Vaidade (servidor, alimentado por x, via)


Você pode ter muito orgulho da sua escolha de software para servidor, mas a maioria das pessoas não se importa. Na pior das hipóteses, esses cabeçalhos podem divulgar dados confidenciais, facilitando o ataque ao site.

Server: apache
X-Powered-By: PHP/5.1.1
Via: 1.1 varnish, 1.1 squid


O RFC7231 permite incluir o cabeçalho do servidor na resposta do servidor, indicando o software específico no servidor usado para entregar o conteúdo. Na maioria das vezes, essa é uma string como "apache" ou "nginx". Embora o título seja permitido, ele é opcional e não é particularmente valioso para desenvolvedores ou usuários finais. No entanto, hoje é o terceiro cabeçalho do servidor HTTP mais popular da Internet.

X-Powered-By é o título mais popular que não é definido por nenhum padrão e tem uma finalidade semelhante: geralmente indica a plataforma de aplicativos na qual o servidor está sendo executado. As respostas mais populares incluem "ASP.net", "PHP" e "Express". Novamente, isso não traz benefícios tangíveis e apenas ocorre.

Talvez mais controverso possa ser considerado na Via . É necessário (de acordo com o RFC7230 ) adicionar à solicitação cada proxy pelo qual a solicitação passa - para identificar o proxy. Pode ser o nome do host proxy, mas com mais freqüência um identificador genérico como "vegur", "verniz" ou "squid". Remover (ou não adicionar) esse cabeçalho pode levar a um ciclo de encaminhamento de proxy . Mas é interessante que ele também seja adicionado em resposta ao caminho de retorno ao navegador - e aqui ele simplesmente executa uma função de informação: nenhum navegador faz nada com ele, por isso é seguro o suficiente para se livrar dele, se você quiser.

Padrões Descontinuados (P3P, Expira, Opções de Quadro X, Compatível com X-UA)


Outra categoria de cabeçalhos são aqueles que realmente causam um efeito no navegador, mas (já) não são a melhor maneira de obter esse efeito.

P3P: cp="this is not a p3p policy"
Expires: Thu, 01 Dec 1994 16:00:00 GMT
X-Frame-Options: SAMEORIGIN
X-UA-Compatible: IE=edge


P3P é uma coisinha divertida. Eu não tinha ideia do que era. Ainda mais engraçado, um dos conteúdos mais comuns do cabeçalho P3P é "Esta não é uma regra do P3P". Bem, é isso ou não?

Aqui, a história remonta a uma tentativa de padronizar as regras de privacidade legíveis por máquina . Houve discordância sobre como exibir dados nos navegadores e apenas um navegador implementou o suporte para esse cabeçalho - o Internet Explorer. Mas mesmo nele, o P3P não teve efeito visual para o usuário; ele só precisava estar presente para permitir o acesso a cookies de terceiros nos quadros. Alguns sites até definem regras de não conformidade do P3P, como no exemplo acima, embora isso seja altamente questionável .

Escusado será dizer que a leitura de cookies de terceiros geralmente é uma má ideia; portanto, se você não o fizer, não precisará definir o cabeçalho P3P !

Expires simplesmente incrivelmente popular, considerando que o Cache-Control é superior ao Expires há mais de 20 anos. Se o cabeçalho de Cache-Control contiver a diretiva de max-age , qualquer cabeçalho de Expires na mesma resposta será ignorado. Porém, um grande número de sites define esses dois cabeçalhos e Expires mais freqüência a data Thu, 01 Dec 1994 16: 00: 00 GMT , para que o conteúdo não seja armazenado em cache. Obviamente, é mais fácil copiar a data das especificações .



Mas simplesmente não há necessidade de fazer isso. Se você tiver um cabeçalho Expires com uma data do passado, basta substituí-lo por:

Cache-Control: no-store, private

( no-store é uma diretiva muito estrita para não gravar conteúdo em armazenamento persistente, portanto, você pode preferir no-cache para obter melhor desempenho, por exemplo, para navegar para frente / para trás ou retomar as guias inativas em um navegador)

Algumas ferramentas de validação de site recomendam que você adicione um cabeçalho X-Frame-Options com o valor 'SAMEORIGIN'. Ele informa aos navegadores que você se recusa a enviar conteúdo para um quadro em outro site: como regra geral, essa é uma boa defesa contra o clickjacking . Mas o mesmo efeito pode ser alcançado com outro cabeçalho com suporte mais consistente e comportamento mais confiável:

Content-Security-Policy: frame-ancestors 'self'

Há um benefício adicional aqui, porque você ainda precisa fornecer o cabeçalho do CSP por outros motivos (mais sobre eles mais tarde). Provavelmente, em nosso tempo, você pode ficar sem o X-Frame-Options .

Por fim, no IE9, a Microsoft introduziu um "modo de compatibilidade" que renderizou a página usando o mecanismo IE8 ou IE7. Mesmo no modo normal, o navegador considerava que uma versão mais antiga do mecanismo poderia ser necessária para a renderização adequada. Essas heurísticas nem sempre funcionavam corretamente, e os desenvolvedores podiam substituí-las usando o cabeçalho ou a metatag X-UA-Compatible com X-UA-Compatible . De fato, isso se tornou parte padrão de muitas estruturas, como o Bootstrap. Agora, esse cabeçalho é praticamente inútil: a proporção de navegadores que o entendem é muito pequena. E se você apoia ativamente o site, é muito improvável que ele use tecnologias que iniciem o modo de compatibilidade.

Depurando dados (versão X-ASPNet, cache X)


De certa forma, é surpreendente que alguns dos títulos mais populares não sejam mencionados em nenhum padrão. Essencialmente, isso significa que milhares de sites de alguma forma concordaram em usar um determinado cabeçalho de uma certa maneira.

X-Cache: HIT
X-Request-ID: 45a336c7-1bd5-4a06-9647-c5aab6d5facf
X-ASPNet-Version: 3.2.32
X-AMZN-RequestID: 0d6e39e2-4ecb-11e8-9c2d-fa7ae01bbebc


De fato, esses títulos "desconhecidos" não foram inventados pelos desenvolvedores. Normalmente, esses são artefatos do uso de determinadas estruturas de servidor, software ou serviços de fornecedores específicos (por exemplo, o último cabeçalho é típico da AWS).

O cabeçalho X-Cache adiciona Fastly (e outras CDNs), juntamente com outros cabeçalhos específicos, como X-Cache-Hits e X-Served-By . Quando a depuração está ativada, mais é adicionado, por exemplo, Fastly-Debug-Path e Fastly-Debug-TTL .

Esses cabeçalhos não são reconhecidos por nenhum navegador e sua remoção não afetará a exibição das páginas. Mas como eles podem fornecer informações úteis a você, o desenvolvedor, você pode salvá-las.

Incompreensão (Pragma)


Eu não esperava que em 2018 eu tivesse que mencionar o cabeçalho Pragma , mas de acordo com o HTTP Archive, ele ainda está no topo (11º lugar). Não foi apenas declarado obsoleto em 1997, mas nunca foi concebido como um cabeçalho de resposta, mas apenas como parte de uma solicitação.

Pragma: no-cache

No entanto, é tão amplamente usado como cabeçalho de resposta que alguns navegadores até o reconhecem nesse contexto. Hoje, porém, há quase zero chance de alguém entender a Pragma no contexto da resposta, mas não entender o Cache-Control . Se você deseja desativar o armazenamento em cache, tudo que você precisa é Cache-Control: no-store, private .

Não-navegadores (X-Robots-Tag)


Um cabeçalho no nosso top 30 não é um cabeçalho para o navegador. X-Robots-Tag desenvolvido para rastreadores, como o Google bots ou o Bing. Como é inútil para um navegador, você pode definir essa resposta apenas para solicitações de rastreadores. Ou você decide que isso dificulta o teste ou viola os termos de uso do mecanismo de pesquisa.

Bugs


Por fim, vale a pena terminar com uma menção honrosa de erros simples. O cabeçalho Host faz sentido na solicitação , mas se aparecer na resposta, provavelmente o servidor não está configurado corretamente (e eu gostaria de saber como). No entanto, 68 domínios no arquivo HTTP retornam um cabeçalho de Host em suas respostas.

Removendo cabeçalhos em um servidor CDN de borda


Felizmente, se o site for executado rapidamente conosco, remover os cabeçalhos é bastante simples usando o VCL . Se você deseja manter a equipe de desenvolvimento realmente útil para depuração, mas oculta-a ao público em geral, isso pode ser feito facilmente usando cookies ou o cabeçalho HTTP de entrada:

unset resp.http.Server;
unset resp.http.X-Powered-By;
unset resp.http.X-Generator;

if (!req.http.Cookie:debug && !req.http.Debug) {
unset resp.http.X-Amzn-RequestID;
unset resp.http.X-Cache;
}


No próximo artigo , falarei sobre as práticas recomendadas para títulos realmente necessários e como ativá-las no servidor de borda da CDN.

Source: https://habr.com/ru/post/pt412813/


All Articles