Encabezados HTTP innecesarios

Los encabezados HTTP son importantes para controlar cómo la caché y los navegadores procesan su contenido. Pero muchos de ellos se usan de manera incorrecta o sin sentido, gastando recursos adicionales en un momento crítico de carga de la página, y es posible que no funcionen como cree. En una serie de artículos sobre mejores prácticas, primero veremos títulos innecesarios.

La mayoría de los desarrolladores conocen los encabezados HTTP importantes y útiles. Los más famosos son Content-Type y Content-Length , estos son encabezados casi universales. Pero recientemente, se han utilizado encabezados como Content-Security-Policy y Strict-Transport-Security para aumentar la Strict-Transport-Security , y Link rel=preload para mejorar el rendimiento. A pesar del soporte generalizado en los navegadores, solo unos pocos los usan.

Al mismo tiempo, hay muchos titulares extremadamente populares que generalmente no son nuevos ni muy útiles. Podemos probar esto con la ayuda de HTTP Archive , un proyecto ejecutado por Google y patrocinado por Fastly, que descarga 500,000 sitios cada mes usando WebPageTest y sube los resultados a BigQuery .

Aquí están los 30 encabezados de respuesta más populares según el Archivo HTTP (según el número de dominios en el archivo que muestra cada encabezado) y una estimación aproximada de la utilidad de cada uno de ellos:

TitularConsultasDominiosEstado
fecha48779277535621Protocolo requerido
tipo de contenido47185627533636Generalmente requerido por el navegador
servidor43057807519663Opcional
longitud de contenido42388435519118Útil
última modificación34424562480294Útil
control de caché36490878412943Útil
etag23620444412370Útil
codificación de contenido16194121409159Requerido para contenido comprimido
expira29869228360311Opcional
x-powered-by4883204211409Opcional
pragma7641647188784Opcional
x-frame-options3670032105846Opcional
control de acceso-permitir-origen11335681103596Útil
Opciones de tipo de contenido x1107156094590Útil
enlace121232987475Útil
edad740141559242Útil
x-cache527534356889Opcional
protección x-xss977390651810Útil
estricta seguridad de transporte425912151283Útil
vía402011747102Opcional
p3p828284044308Opcional
esperar-ct268528040465Útil
lenguaje de contenido33408137927Controvertido
x-aspnet-version67612833473Opcional
acceso-control-permitir-credenciales280438230346Útil
x-robots-tag17917724911No importa para los navegadores
compatible con x-ua48905624811Opcional
acceso-control-permitir-métodos162612920791Útil
control de acceso-permitir-encabezados120573519120Útil

Veamos los encabezados opcionales, por qué no los necesitamos y qué hacer al respecto.

Vanity (servidor, x-powered-by, vía)


Puede estar muy orgulloso de su elección de software de servidor, pero a la mayoría de las personas no les importa. En el peor de los casos, estos encabezados pueden revelar datos confidenciales, lo que facilita el ataque a su sitio.

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


RFC7231 le permite incluir el encabezado del servidor en la respuesta del servidor, indicando el software específico en el servidor que se utiliza para entregar el contenido. Muy a menudo se trata de una cadena como "apache" o "nginx". Aunque el título está permitido, es opcional y no es particularmente valioso para los desarrolladores o usuarios finales. Sin embargo, hoy es el tercer encabezado de servidor HTTP más popular en Internet.

X-Powered-By es el título más popular que no está definido por ningún estándar y tiene un propósito similar: generalmente indica la plataforma de aplicación en la que se ejecuta el servidor. Las respuestas más populares incluyen "ASP.net", "PHP" y "Express". Una vez más, esto no aporta ningún beneficio tangible y solo tiene lugar.

Quizás más controvertido pueda considerarse Via . Se requiere (de acuerdo con RFC7230 ) agregar a la solicitud cada proxy a través del cual pasa la solicitud, para identificar el proxy. Este puede ser el nombre de host proxy, pero con mayor frecuencia un identificador genérico como "vegur", "barniz" o "calamar". Eliminar (o no agregar) dicho encabezado puede conducir a un ciclo de reenvío de proxy . Pero es interesante que también se agregue en respuesta a la ruta de retorno al navegador, y aquí simplemente realiza una función de información: ningún navegador hace nada con él, por lo que es lo suficientemente seguro como para deshacerse de él si lo desea.

Estándares obsoletos (P3P, caduca, opciones de marco X, compatible con X-UA)


Otra categoría de encabezados son los que realmente causan un efecto en el navegador, pero (ya) no son la mejor manera de lograr este efecto.

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 es una pequeña cosa divertida. No tenía idea de qué era. Aún más divertido, uno de los contenidos más comunes del encabezado P3P es "Esto no es una regla P3P". Bueno, eso es o no?

Aquí, la historia se remonta a un intento de estandarizar las reglas de privacidad legibles por máquina . Hubo desacuerdo sobre cómo mostrar los datos en los navegadores, y solo un navegador implementó soporte para este encabezado: Internet Explorer. Pero incluso en él, P3P no tuvo ningún efecto visual para el usuario; solo tenía que estar presente para permitir el acceso a cookies de terceros en marcos. Algunos sitios incluso establecen reglas de incumplimiento P3P, como en el ejemplo anterior, aunque hacerlo es muy cuestionable .

No hace falta decir que leer cookies de terceros generalmente es una mala idea, por lo que si no lo hace, ¡no necesita configurar el encabezado P3P !

Expires simplemente increíblemente popular teniendo en cuenta que Cache-Control ha sido superior a Expires durante más de 20 años. Si el encabezado Cache-Control contiene la directiva max-age , se ignora cualquier encabezado Expires en la misma respuesta. Sin embargo, una gran cantidad de sitios configuran estos dos encabezados, y Expires mayor frecuencia la fecha Thu, 01 Dec 1994 16: 00: 00 GMT , para que el contenido no se almacene en caché. Por supuesto, es más fácil copiar la fecha de las especificaciones .



Pero simplemente no hay necesidad de hacer esto. Si tiene un encabezado Expires con una fecha del pasado, simplemente reemplácelo con:

Cache-Control: no-store, private

( no-store es una directiva demasiado estricta para no escribir contenido en el almacenamiento persistente, por lo que puede preferir no-cache para un mejor rendimiento, por ejemplo, para navegar hacia atrás / adelante o reanudar pestañas dormidas en un navegador)

Algunas herramientas de validación del sitio le aconsejarán que agregue un encabezado X-Frame-Options con el valor 'SAMEORIGIN'. Le dice a los navegadores que se niega a enviar contenido a un marco en otro sitio: como regla, esta es una buena defensa contra el clickjacking . Pero se puede lograr el mismo efecto con otro encabezado con un soporte más consistente y un comportamiento más confiable:

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

Aquí hay un beneficio adicional, porque todavía tiene que dar el encabezado CSP por otros motivos (más información sobre ellos más adelante). Probablemente, en nuestro tiempo, puede prescindir de X-Frame-Options .

Finalmente, en IE9, Microsoft introdujo un "modo de compatibilidad" que renderizó la página usando el motor IE8 o IE7. Incluso en modo normal, el navegador pensó que podría ser necesaria una versión anterior del motor para una representación adecuada. Estas heurísticas no siempre funcionaban correctamente, y los desarrolladores podían anularlas usando el encabezado o metaetiqueta X-UA-Compatible con X-UA-Compatible . De hecho, esto se ha convertido en una parte estándar de muchos marcos como Bootstrap. Ahora este encabezado es prácticamente inútil: la proporción de navegadores que lo entienden es muy pequeña. Y si apoya activamente el sitio, es muy poco probable que use tecnologías que inicien el modo de compatibilidad.

Datos de depuración (X-ASPNet-Version, X-Cache)


De alguna manera, es sorprendente que algunos de los títulos más populares no se mencionen en absoluto en ningún estándar. Esencialmente, esto significa que miles de sitios web de alguna manera acordaron usar un cierto encabezado de cierta manera.

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 hecho, estos títulos "desconocidos" no fueron inventados por los desarrolladores. Típicamente, estos son artefactos del uso de ciertos marcos de servidores, software o servicios de proveedores específicos (por ejemplo, el último encabezado es típico para AWS).

El encabezado X-Cache agrega Fastly (y otros CDN), junto con otros encabezados específicos como X-Cache-Hits y X-Served-By . Cuando la depuración está habilitada, se agrega más, por ejemplo, Fastly-Debug-Path y Fastly-Debug-TTL .

Estos encabezados no son reconocidos por ningún navegador, y su eliminación no afectará en absoluto la visualización de las páginas. Pero como pueden proporcionarle a usted, el desarrollador, información útil, puede guardarlos.

Malentendido (Pragma)


No esperaba que en 2018 tuviera que mencionar el encabezado Pragma , pero de acuerdo con el Archivo HTTP, todavía está en la parte superior (11 ° lugar). No solo se declaró obsoleto en 1997, sino que nunca se concibió como un encabezado de respuesta, sino solo como parte de una solicitud.

Pragma: no-cache

Sin embargo, se usa tanto como encabezado de respuesta que algunos navegadores incluso lo reconocen en este contexto. Pero hoy hay casi cero posibilidades de que alguien entienda a Pragma en el contexto de la respuesta, pero no entienda Cache-Control . Si desea deshabilitar el almacenamiento en caché, todo lo que necesita es Cache-Control: no-store, private .

No navegadores (X-Robots-Tag)


Un título en nuestro top 30 no es un título para el navegador. X-Robots-Tag diseñado para rastreadores como los robots de Google o Bing. Dado que es inútil para un navegador, puede configurar dicha respuesta solo para las solicitudes de los rastreadores. O decide que esto dificulta las pruebas o viola los términos de uso del motor de búsqueda.

Bichos


Finalmente, vale la pena terminar con una mención honorífica de errores simples. El encabezado Host tiene sentido en la solicitud , pero si aparece en la respuesta, entonces su servidor probablemente no esté configurado correctamente (y me gustaría saber cómo). Sin embargo, 68 dominios en el Archivo HTTP devuelven un encabezado de Host en sus respuestas.

Eliminar encabezados en un servidor CDN perimetral


Afortunadamente, si su sitio se ejecuta rápidamente con nosotros, eliminar los encabezados es bastante simple con VCL . Si desea mantener al equipo de desarrollo realmente útil para la depuración, pero ocultarlo al público en general, entonces esto se hace fácilmente usando cookies o el encabezado HTTP entrante:

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;
}


En el próximo artículo hablaré sobre las mejores prácticas para los títulos realmente necesarios y cómo activarlos en el servidor de CDN Edge.

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


All Articles