Articulo de referencia

compresión HTTP

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

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

Los datos HTTP se comprimen antes de enviarse desde el servidor: los navegadores compatibles informarán al servidor sobre los métodos de compresión que admiten antes de descargar el formato correcto; los navegadores que no admitan métodos de compresión compatibles descargarán los 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. A un nivel inferior, un campo de encabezado Transfer-Encoding puede indicar que la carga útil de un mensaje HTTP está comprimida. A un nivel superior, un campo de encabezado Content-Encoding puede indicar que un recurso que se está transfiriendo, almacenando en caché o referenciando de otra manera está comprimido. La compresión mediante Content-Encoding es más compatible que la de Transfer-Encoding, y algunos navegadores no anuncian compatibilidad con la compresión Transfer-Encoding para evitar errores en los servidores. [ 3 ]

Negociación del plan de compresión

La negociación se realiza en dos etapas, descritas en los 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 . Para Content-Encoding , la lista está en un campo llamado Accept-Encoding ; para Transfer-Encoding , el campo se llama TE .

GET /encrypted-area HTTP / 1.1 Host : www.example.com Accept-Encoding : 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 compatibles con ambas partes. En tal caso, el servidor añadirá un campo Content-Encoding o Transfer-Encoding en la respuesta HTTP con los esquemas utilizados, separados por comas.

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

The web server is by no means obligated to use any compression method – this depends on the internal settings of the web server and also may depend on the internal architecture of the website in question.

Content-Encoding tokens

The official list of tokens available to servers and client is maintained by IANA,[4] and it includes:

  • brBrotli, a compression algorithm specifically designed for HTTP content encoding, defined in RFC 7932 and implemented in all modern major browsers.
  • compress – UNIX "compress" program method (historic; deprecated in most applications and replaced by gzip or deflate)
  • deflate – compression based on the deflate algorithm (described in RFC 1951), a combination of the LZ77 algorithm and Huffman coding, wrapped inside the zlib data format (RFC 1950);
  • exi – W3C Efficient XML Interchange
  • gzipGNU zip format (described in RFC 1952). Uses the deflate algorithm for compression, but the data format and the checksum algorithm differ from the "deflate" content-encoding. This method is the most broadly supported as of March 2011.[5]
  • identity – No transformation is used. This is the default value for content coding.
  • pack200-gzip – Network Transfer Format for Java Archives[6]
  • zstd – Zstandard compression, defined in RFC 8478

In addition to these, a number of unofficial or non-standardized tokens are used in the wild by either servers or clients:

  • bzip2 – compression based on the free bzip2 format, supported by lighttpd[7]
  • lzip – compression based on the free lzip format, supported by wget[8] and Links[9]
  • lzma – compression based on (raw) LZMA is available in Opera 20, and in elinks via a compile-time option[10]
  • peerdist[11] – Microsoft Peer Content Caching and Retrieval
  • rsync[12]delta encoding in HTTP, implemented by a pair of rproxy proxies.
  • xpress – Microsoft compression protocol used by Windows 8 and later for Windows Store application updates. LZ77-based compression optionally using a Huffman encoding.[13]
  • xz – LZMA2-based content compression, supported by a non-official Firefox patch;[14] and fully implemented in mget since 2013-12-31.[15]

Servers that support HTTP compression

Many content delivery networks also implement HTTP compression to improve speedy delivery of resources to end users.

The compression in HTTP can also be achieved by using the functionality of server-side scripting languages like PHP, or programming languages like Java.

Various online tools exist to verify a working implementation of HTTP compression. These online tools usually request multiple variants of a URL, each with different request headers (with varying Accept-Encoding content). HTTP compression is considered to be implemented correctly when the server returns a document in a compressed format.[19] By comparing the sizes of the returned documents, the effective compression ratio can be calculated (even between different compression algorithms).

Problems preventing the use of HTTP compression

Un artículo de 2009 de los ingenieros de Google Arvind Jain y Jason Glasgow afirma que se pierden más de 99 años-persona diariamente [ 20 ] debido al aumento en el 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 forzarlas a no comprimirse, cuando se utilizan proxies (con navegadores web demasiado cautelosos), cuando los servidores están mal configurados y cuando los errores del navegador impiden el uso de la compresión. Internet Explorer 6, que recurre 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—  era el navegador más propenso a volver a HTTP sin comprimir. [ 20 ]

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 la implementaron como un flujo deflate "en bruto", [ 21 ] lo que hace que su implementación no sea confiable. [ 22 ] [ 23 ] 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 un ataque de texto plano elegido : si un atacante logra inyectar cualquier contenido deseado en la página, puede determinar si esta contiene dicho contenido 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, que 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 podía funcionar eficazmente contra un gran número de protocolos, incluidos TLS y protocolos de capa de aplicación como SPDY o HTTP, solo se demostraron vulnerabilidades contra TLS y SPDY, las cuales fueron mitigadas en gran medida en navegadores y servidores. La vulnerabilidad de CRIME contra la compresión HTTP no se ha mitigado en absoluto, a pesar de que sus autores advirtieron que podría ser 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 (dependiendo del número de bytes a extraer), siempre que el atacante engañe a la víctima para que visite un enlace web malicioso. [ 24 ] Todas las versiones de TLS y SSL son vulnerables a BREACH, independientemente del algoritmo de cifrado o cifrado utilizado. [ 25 ] A diferencia de las instancias anteriores de CRIME , que se pueden contrarrestar desactivando la compresión TLS o la compresión de encabezados SPDY, BREACH explota la compresión HTTP, que no se puede desactivar de forma realista, ya que prácticamente todos los servidores web dependen de ella para mejorar la velocidad de transmisión de datos para los usuarios. [ 24 ]

A partir de 2016, el ataque TIME y el ataque HEIST son de dominio público. [ 26 ] [ 27 ] [ 28 ] [ 29 ]

Referencias

  1. "Uso de la 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 del 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" . El programa del proceso de la comunidad Java.
  7. "ModCompress - Lighttpd" . lighty labs . Consultado el 18 de abril de 2014 .
  8. "GNU Wget2 2.0.0 lanzado" . Consultado el 14 de mayo de 2025 .
  9. "Links ChangeLog: Compatibilidad con compresión lzip" . Consultado el 22 de julio de 2025 .
  10. Enlaces a la descompresión LZMA
  11. " [ 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 .
  12. "rproxy: Protocol Definition for HTTP rsync Encoding". rproxy.samba.org.
  13. "[MS-XCA]: Xpress Compression Algorithm". Retrieved 29 August 2015.
  14. "LZMA2 Compression - MozillaWiki". Retrieved 18 April 2014.
  15. "mget GitHub project page". GitHub. Retrieved 6 January 2017.
  16. "mod_deflate - Apache HTTP Server Version 2.4 - Supported Encodings".
  17. "Extra part of Hiawatha webserver's manual". Archived from the original on 2016-03-22. Retrieved 2012-01-25.
  18. "Serving static files part of Armeria's documentation". Archived from the original on 2020-04-02. Retrieved 2020-01-16.
  19. "How does the gzip compression check work?". httptools.dev, retrieved 10 April 2022.
  20. 12"Use compression to make the web faster". Google Inc. Retrieved 22 May 2013.
  21. "deflate - Why are major web sites using gzip?". Stack Overflow. Retrieved 18 April 2014.
  22. "Compression Tests: About". Verve Studios. Archived from the original on 2 January 2015. Retrieved 18 April 2014.
  23. "Lose the wait: HTTP Compression". Zoompf Web Performance. Retrieved 18 April 2014.
  24. 12Goodin, Dan (1 August 2013). "Gone in 30 seconds: New attack plucks secrets from HTTPS-protected pages". Ars Technica. Condé Nast. Retrieved 2 August 2013.
  25. Leyden, John (2 August 2013). "Step into the BREACH: New attack developed to read encrypted web data". The Register. Retrieved 2 August 2013.
  26. Sullivan, Nick (11 August 2016). "CRIME, TIME, BREACH and HEIST: A brief history of compression oracle attacks on HTTPS". Retrieved 16 August 2016.
  27. Goodin, Dan (3 August 2016). "HEIST exploit — New attack steals SSNs, e-mail addresses, and more from HTTPS pages". Retrieved 16 August 2016.
  28. Be'ery, Tal. "A Perfect Crime? TIME will tell"(PDF).
  29. Vanhoef, Mathy. "HEIST: HTTP Encrypted Information can be Stolen through TCP-windows"(PDF).
  • RFC 2616: Hypertext Transfer Protocol – HTTP/1.1
  • RFC 9110: HTTP Semantics
  • HTTP Content-Coding Values by Internet Assigned Numbers Authority
  • Compression with lighttpd
  • Coding Horror: HTTP Compression on IIS 6.0Archived 2014-02-06 at the Wayback Machine
  • 15 Seconds: Web Site Compression at the Wayback Machine(archived July 16, 2011)
  • Using HTTP CompressionArchived 2016-03-14 at the Wayback Machine by Martin Brown of Server Watch
  • Using HTTP Compression in PHP
  • Dynamic and static HTTP compression with Apache httpd