Compresión HTTP

Capacidad que se puede incorporar en servidores web y clientes web

La compresión HTTP es una capacidad que se puede incorporar en servidores web y clientes web para mejorar la velocidad de transferencia y la utilización del ancho de banda. [1]

Los datos HTTP se comprimen antes de ser enviados desde el servidor: los navegadores compatibles anunciarán qué métodos son compatibles al servidor antes de descargar el formato correcto; los navegadores que no admiten el método de compresión compatible descargarán datos sin comprimir. Los esquemas de compresión más comunes incluyen gzip y Brotli ; la IANA mantiene una lista completa de los esquemas disponibles . [2]

Existen dos formas diferentes de realizar la compresión en HTTP. En un nivel inferior, un campo de encabezado Transfer-Encoding puede indicar que la carga útil de un mensaje HTTP está comprimida. En un nivel superior, un campo de encabezado Content-Encoding puede indicar que un recurso que se está transfiriendo, almacenando en caché o al que se hace referencia de otro modo está comprimido. La compresión mediante Content-Encoding tiene un mayor soporte que la de Transfer-Encoding, y algunos navegadores no anuncian su compatibilidad con la compresión Transfer-Encoding para evitar generar errores en los servidores. [3]

Negociación de esquemas de compresión

La negociación se realiza en dos pasos, descritos en RFC 2616 y RFC 9110:

1. El cliente web anuncia qué esquemas de compresión admite incluyendo una lista de tokens en la solicitud HTTP . En el caso de Content-Encoding , la lista se encuentra en un campo llamado Accept-Encoding ; en el caso de Transfer-Encoding , el campo se llama TE .

GET  /área cifrada  HTTP / 1.1 Host :  www.example.com Aceptar codificación :  gzip, deflate

2. Si el servidor admite uno o más esquemas de compresión, los datos salientes pueden comprimirse mediante uno o más métodos admitidos por ambas partes. Si este es el caso, el servidor agregará un campo Content-Encoding o Transfer-Encoding en la respuesta HTTP con los esquemas utilizados, separados por comas.

HTTP / 1.1  200  OK Fecha :  lunes, 26 de junio de 2016 22:38:34 GMT Servidor :  Apache/1.3.3.7 (Unix) (Red-Hat/Linux) Última modificación :  miércoles, 8 de enero de 2003 23:11:55 GMT Rangos de aceptación :  bytes Longitud del contenido :  438 Conexión :  cerrada Tipo de contenido :  text/html; charset=UTF-8 Codificación del contenido :  gzip

El servidor web no está obligado de ninguna manera a utilizar ningún método de compresión: esto depende de la configuración interna del servidor web y también puede depender de la arquitectura interna del sitio web en cuestión.

Tokens de codificación de contenido

La lista oficial de tokens disponibles para servidores y clientes la mantiene la IANA, [4] e incluye:

  • br – Brotli , un algoritmo de compresión diseñado específicamente para la codificación de contenido HTTP, definido en RFC 7932 e implementado en todos los principales navegadores modernos.
  • compress – método de "compresión" de programa UNIX (histórico; obsoleto en la mayoría de las aplicaciones y reemplazado por gzip o deflate)
  • deflate – compresión basada en el algoritmo deflate (descrito en RFC 1951), una combinación del algoritmo LZ77 y la codificación Huffman, envuelta dentro del formato de datos zlib ( RFC 1950);
  • exi – Intercambio XML eficiente del W3C
  • gzip – formato zip de GNU (descrito en RFC 1952). Utiliza el algoritmo deflate para la compresión, pero el formato de datos y el algoritmo de suma de comprobación difieren de la codificación de contenido "deflate". Este método es el más ampliamente admitido a partir de marzo de 2011. [5]
  • identidad : no se utiliza ninguna transformación. Este es el valor predeterminado para la codificación de contenido.
  • pack200-gzip – Formato de transferencia de red para archivos Java [6]
  • zstd : compresión Zstandard, definida en RFC 8478

Además de estos, los servidores o clientes utilizan en la red una serie de tokens no oficiales o no estandarizados:

  • bzip2 – compresión basada en el formato gratuito bzip2, compatible con lighttpd [7]
  • lzma – la compresión basada en LZMA (sin procesar) está disponible en Opera 20 y en elinks a través de una opción de tiempo de compilación [8]
  • peerdist [9] – Almacenamiento en caché y recuperación de contenido entre pares de Microsoft
  • rsync [10]codificación delta en HTTP , implementada por un par de servidores proxy rproxy .
  • xpress: protocolo de compresión de Microsoft utilizado por Windows 8 y versiones posteriores para las actualizaciones de aplicaciones de la Tienda Windows. Compresión basada en LZ77 que utiliza opcionalmente una codificación Huffman. [11]
  • xz – Compresión de contenido basada en LZMA2, compatible con un parche no oficial de Firefox; [12] y completamente implementada en mget desde el 31 de diciembre de 2013. [13]

Servidores que admiten compresión HTTP

Muchas redes de distribución de contenido también implementan la compresión HTTP para mejorar la entrega rápida de recursos a los usuarios finales.

La compresión en HTTP también se puede lograr utilizando la funcionalidad de lenguajes de script del lado del servidor como PHP , o lenguajes de programación como Java .

Existen varias herramientas en línea para verificar una implementación funcional de la compresión HTTP. Estas herramientas en línea suelen solicitar múltiples variantes de una URL, cada una con diferentes encabezados de solicitud (con contenido de Accept-Encoding variable). Se considera que la compresión HTTP se implementa correctamente cuando el servidor devuelve un documento en un formato comprimido. [17] Al comparar los tamaños de los documentos devueltos, se puede calcular la tasa de compresión efectiva (incluso entre diferentes algoritmos de compresión).

Problemas que impiden el uso de la compresión HTTP

Un artículo de 2009 de los ingenieros de Google Arvind Jain y Jason Glasgow afirma que se desperdician más de 99 años-persona [18] diariamente debido al aumento del tiempo de carga de las páginas cuando los usuarios no reciben contenido comprimido. Esto ocurre cuando el software antivirus interfiere con las conexiones para obligarlas a descomprimirse, cuando se utilizan servidores proxy (con navegadores web demasiado cautelosos), cuando los servidores están mal configurados y cuando los errores del navegador impiden que se utilice la compresión. Internet Explorer 6, que se reduce a HTTP 1.0 (sin funciones como compresión o canalización) cuando está detrás de un proxy (una configuración común en entornos corporativos), fue el navegador principal más propenso a volver a HTTP sin comprimir. [18]

Otro problema encontrado al implementar la compresión HTTP a gran escala se debe a la definición de codificación deflate : mientras que HTTP 1.1 define la codificación deflate como datos comprimidos con deflate (RFC 1951) dentro de un flujo con formato zlib (RFC 1950), los productos de servidor y cliente de Microsoft históricamente lo implementaron como un flujo deflate "sin procesar", [19] lo que hace que su implementación no sea confiable. [20] [21] Por esta razón, algunos programas, incluido el servidor HTTP Apache, solo implementan la codificación gzip .

Implicaciones de seguridad

La compresión permite realizar una forma de ataque de texto simple elegido : si un atacante puede inyectar cualquier contenido elegido en la página, puede saber si la página contiene el contenido dado observando el aumento de tamaño del flujo cifrado. Si el aumento es menor de lo esperado para inyecciones aleatorias, significa que el compresor ha encontrado una repetición en el texto, es decir, el contenido inyectado se superpone a la información secreta. Esta es la idea detrás de CRIME.

En 2012, se anunció un ataque general contra el uso de la compresión de datos, denominado CRIME . Si bien el ataque CRIME podría funcionar de manera efectiva contra una gran cantidad de protocolos, incluidos, entre otros, TLS y protocolos de capa de aplicación como SPDY o HTTP, solo se demostraron y mitigaron en gran medida los exploits contra TLS y SPDY en navegadores y servidores. El exploit CRIME contra la compresión HTTP no se ha mitigado en absoluto, a pesar de que los autores de CRIME han advertido que esta vulnerabilidad podría estar incluso más extendida que la compresión SPDY y TLS combinadas.

En 2013, se publicó una nueva instancia del ataque CRIME contra la compresión HTTP, denominada BREACH. Un ataque BREACH puede extraer tokens de inicio de sesión, direcciones de correo electrónico u otra información confidencial del tráfico web cifrado con TLS en tan solo 30 segundos (según la cantidad de bytes que se extraigan), siempre que el atacante engañe a la víctima para que visite un enlace web malicioso. [22] Todas las versiones de TLS y SSL están en riesgo por BREACH independientemente del algoritmo de cifrado o el cifrado utilizado. [23] A diferencia de las instancias anteriores de CRIME , contra las que se puede defender con éxito desactivando la compresión TLS o la compresión de encabezado SPDY, BREACH explota la compresión HTTP que no se puede desactivar de manera realista, ya que prácticamente todos los servidores web dependen de ella para mejorar las velocidades de transmisión de datos para los usuarios. [22]

A partir de 2016, el ataque TIME y el ataque HEIST son ahora de conocimiento público. [24] [25] [26] [27]

Referencias

  1. ^ "Uso de compresión HTTP (IIS 6.0)". Microsoft Corporation . Consultado el 9 de febrero de 2010 .
  2. ^ RFC 2616, Sección 3.5: "La Autoridad de Números Asignados de Internet (IANA) actúa como un registro para tokens de valor de codificación de contenido".
  3. ^ 'RFC2616 "Transfer-Encoding: gzip, chunked" no se maneja correctamente', problema 94730 de Chromium
  4. ^ "Parámetros del Protocolo de transferencia de hipertexto - Registro de codificación de contenido HTTP". IANA . Consultado el 18 de abril de 2014 .
  5. ^ "Pruebas de compresión: resultados". Verve Studios, Co. Archivado desde el original el 21 de marzo de 2012 . Consultado el 19 de julio de 2012 .
  6. ^ "JSR 200: Formato de transferencia de red para archivos Java". Programa de proceso de la comunidad Java.
  7. ^ "ModCompress - Lighttpd". lighty labs . Consultado el 18 de abril de 2014 .
  8. ^ elinks Descompresión LZMA
  9. ^ "[MS-PCCRTP]: Almacenamiento en caché y recuperación de contenido entre pares: extensiones del Protocolo de transferencia de hipertexto (HTTP)". Microsoft . Consultado el 19 de abril de 2014 .
  10. ^ "rproxy: Definición de protocolo para codificación HTTP rsync". rproxy.samba.org .
  11. ^ "[MS-XCA]: Algoritmo de compresión Xpress" . Consultado el 29 de agosto de 2015 .
  12. ^ "Compresión LZMA2 - MozillaWiki" . Consultado el 18 de abril de 2014 .
  13. ^ "Página del proyecto mget en GitHub". GitHub . Consultado el 6 de enero de 2017 .
  14. ^ "mod_deflate - Servidor HTTP Apache versión 2.4 - Codificaciones compatibles".
  15. ^ "Parte adicional del manual del servidor web Hiawatha". Archivado desde el original el 22 de marzo de 2016. Consultado el 25 de enero de 2012 .
  16. ^ "Servir archivos estáticos es parte de la documentación de Armeria".
  17. ^ "¿Cómo funciona la comprobación de compresión gzip?".httptools.dev, recuperado el 10 de abril de 2022.
  18. ^ ab "Utilice la compresión para hacer que la web sea más rápida". Google Inc. Consultado el 22 de mayo de 2013 .
  19. ^ "deflate - ¿Por qué los principales sitios web utilizan gzip?". Stack Overflow . Consultado el 18 de abril de 2014 .
  20. ^ "Pruebas de compresión: Acerca de". Verve Studios. Archivado desde el original el 2 de enero de 2015. Consultado el 18 de abril de 2014 .
  21. ^ "Adiós a la espera: compresión HTTP". Rendimiento web de Zoompf . Consultado el 18 de abril de 2014 .
  22. ^ ab Goodin, Dan (1 de agosto de 2013). «Desapareció en 30 segundos: un nuevo ataque extrae secretos de páginas protegidas con HTTPS». Ars Technica . Condé Nast . Consultado el 2 de agosto de 2013 .
  23. ^ Leyden, John (2 de agosto de 2013). "Step into the BREACH: New attack developed to read encrypted web data" (Entra en la brecha: se ha desarrollado un nuevo ataque para leer datos web cifrados). The Register . Consultado el 2 de agosto de 2013 .
  24. ^ Sullivan, Nick (11 de agosto de 2016). "CRIMEN, TIEMPO, INCUMPLIMIENTO y ATRACO: Una breve historia de los ataques de compresión de oráculos en HTTPS" . Consultado el 16 de agosto de 2016 .
  25. ^ Goodin, Dan (3 de agosto de 2016). «Exploit HEIST: nuevo ataque roba números de seguridad social, direcciones de correo electrónico y más de páginas HTTPS» . Consultado el 16 de agosto de 2016 .
  26. ^ Be'ery, Tal. "¿Un crimen perfecto? El tiempo lo dirá" (PDF) .
  27. ^ Vanhoef, Mathy. "HEIST: La información cifrada HTTP puede ser robada a través de ventanas TCP" (PDF) .
  • RFC 2616: Protocolo de transferencia de hipertexto – HTTP/1.1
  • RFC 9110: Semántica HTTP
  • Valores de codificación de contenido HTTP por parte de la Autoridad de Números Asignados de Internet
  • Compresión con lighttpd
  • Horror de codificación: compresión HTTP en IIS 6.0 Archivado el 6 de febrero de 2014 en Wayback Machine
  • 15 segundos: compresión de sitios web en Wayback Machine (archivado el 16 de julio de 2011)
  • Uso de la compresión HTTP Archivado el 14 de marzo de 2016 en Wayback Machine por Martin Brown de Server Watch
  • Uso de compresión HTTP en PHP
  • Compresión HTTP dinámica y estática con Apache httpd
Retrieved from "https://en.wikipedia.org/w/index.php?title=HTTP_compression&oldid=1241507032"