HTTP-сжатие - это возможность, которая может быть встроена в веб-серверы и веб-клиенты для повышения скорости передачи и использования полосы пропускания.
Данные HTTP сжимаются перед отправкой с сервера: совместимые браузеры сообщат, какие методы поддерживается на сервер перед загрузкой в правильном формате; браузеры, не поддерживающие соответствующий метод сжатия, будут загружать несжатые данные. Наиболее распространенные схемы сжатия включают gzip и Deflate ; однако полный список доступных схем поддерживается IANA. Кроме того, третьи стороны разрабатывают новые методы и включают их в свои продукты, например схему сжатия общего словаря Google для HTTP (SDCH), реализованную в браузере Google Chrome и используемую на серверах Google..
Есть два разных способа сжатия в HTTP. На более низком уровне поле заголовка Transfer-Encoding может указывать на то, что полезная нагрузка сообщения HTTP сжата. На более высоком уровне поле заголовка Content-Encoding может указывать на то, что ресурс, который передается, кэшируется или используется иным образом, сжат. Сжатие с использованием Content-Encoding поддерживается более широко, чем Transfer-Encoding, и некоторые браузеры не рекламируют поддержку сжатия Transfer-Encoding, чтобы избежать появления ошибок на серверах.
В большинстве случаев, за исключением SDCH, согласование выполняется в два этапа, описанных в RFC 2616 :
1. Веб-клиент объявляет, какие схемы сжатия он поддерживает, включая список токенов в HTTP-запрос. Для Content-Encoding список в поле под названием Accept-Encoding; для передачи-кодирования это поле называется TE.
GET / encrypted-area HTTP / 1.1 Host: www.example.com Accept-Encoding: gzip, deflate
2. Если сервер поддерживает одну или несколько схем сжатия, исходящие данные могут быть сжаты одним или несколькими методами, поддерживаемыми обеими сторонами. Если это так, сервер добавит поле Content-Encoding или Transfer-Encoding в HTTP-ответ с используемыми схемами, разделенными запятыми.
HTTP / 1.1 200 OK Дата: пн, 26 июня 2016 22:38:34 GMT Сервер: Apache / 1.3.3.7 (Unix) (Red-Hat / Linux) Последнее изменение: среда, 8 января 2003 г., 23:11 : 55 GMT Диапазон допустимых значений: байты Длина содержимого: 438 Соединение: закрыть Тип содержимого: текст / html; charset = UTF-8 Content-Encoding: gzip
Веб-сервер никоим образом не обязан использовать какой-либо метод сжатия - это зависит от внутренних настроек веб-сервера, а также может зависеть от внутренних архитектура рассматриваемого веб-сайта.
В случае SDCH также требуется согласование словаря, что может включать дополнительные шаги, такие как загрузка правильного словаря с внешнего сервера.
Официальный список токенов, доступных для серверов и клиентов, поддерживается IANA и включает:
В дополнение к этому ряд неофициальных или нестандартизованных токенов используются в дикой природе либо серверами, либо клиентами:
. Сжатие в HTTP также может быть достигнуто с помощью функциональности серверных сценариев языков, таких как PHP или языки программирования, такие как Java.
В статье 2009 года инженеров Google Арвинда Джейна и Джейсона Глазго говорится, что более 99 человеко-лет ежедневно тратится впустую из-за увеличения времени загрузки страницы, когда пользователи не получают сжатый контент. Это происходит, когда антивирусное программное обеспечение мешает соединениям, чтобы заставить их быть распакованными, когда используются прокси (с чрезмерно осторожными веб-браузерами), когда серверы настроены неправильно и когда ошибки браузера не позволяют использовать сжатие. Internet Explorer 6, который переходит на HTTP 1.0 (без таких функций, как сжатие или конвейерная обработка), когда за прокси-сервером - обычная конфигурация в корпоративных средах - был основным браузером, наиболее склонным к отказу от несжатого HTTP.
Другая проблема обнаруженное при крупномасштабном развертывании HTTP-сжатия, связано с определением кодировки deflate : в то время как HTTP 1.1 определяет кодировку deflate как данные, сжатые с deflate (RFC 1951 ) внутри потока, отформатированного в zlib (RFC 1950 ), серверные и клиентские продукты Microsoft исторически реализовывали его как «необработанный» сжатый поток, что делало его развертывание ненадежным. По этой причине некоторые программы, включая HTTP-сервер Apache, реализуют только кодировку gzip .
Сжатие позволяет выполнить атаку по выбранному открытому тексту : если злоумышленник может внедрить любой выбранный контент на страницу, он может узнать, есть ли на странице содержит заданный ими контент, наблюдая за увеличением размера зашифрованного потока. Если увеличение меньше, чем ожидалось для случайных инъекций, это означает, что компрессор обнаружил повторение в тексте, т. Е. Введенный контент перекрывает секретную информацию. Это идея CRIME.
В 2012 году была объявлена общая атака на использование сжатия данных под названием CRIME. Хотя атака CRIME могла эффективно работать против большого количества протоколов, включая, помимо прочего, TLS, и протоколы прикладного уровня, такие как SPDY или HTTP, были продемонстрированы эксплойты только против TLS и SPDY, и в браузерах и серверах они в значительной степени смягчены. Эксплойт CRIME против HTTP-сжатия вообще не был устранен, хотя авторы CRIME предупредили, что эта уязвимость может быть даже более распространенной, чем сжатие SPDY и TLS вместе взятые.
В 2013 году был опубликован новый пример CRIME-атаки на HTTP-сжатие, получивший название BREACH. Атака BREACH может извлекать токены входа, адреса электронной почты или другую конфиденциальную информацию из зашифрованного TLS веб-трафика всего за 30 секунд (в зависимости от количества байтов, которые нужно извлечь), при условии, что злоумышленник обманом заставляет жертву перейти по вредоносной веб-ссылке. Все версии TLS и SSL подвержены риску BREACH независимо от используемого алгоритма шифрования или шифра. В отличие от предыдущих экземпляров CRIME, от которых можно успешно защититься, отключив сжатие TLS или сжатие заголовков SPDY, BREACH использует сжатие HTTP, которое невозможно отключить, поскольку практически все веб-серверы полагаются на него для улучшения данных. скорость передачи данных для пользователей.
По состоянию на 2016 год атака TIME и атака HEIST теперь известны общественности.