Эволюция HTTP для современного веба

в 7:39, , рубрики: Digest Fields, http, HTTP Client Hints, HTTPbis, ietf, IT-стандарты, Proxy-Status, RFC 8942, Блог компании М.Видео-Эльдорадо, браузеры, Разработка веб-сайтов, Серверное администрирование
Эволюция HTTP для современного веба - 1
Поле Cache-Control в заголовке ответа от Хабра

Кто двигает научно-технический прогресс? Учёные, которые шлифуют термоядерный синтез, чтобы человечество могло отказаться от ископаемого топлива. Предприниматели, которые финансируют марсианскую программу и разработку новых ракет. И, конечно, инженеры рабочей группы HTTPbis, которые совершенствуют протокол передачи гипертекста.

Прямо сейчас в разработке находится несколько спецификаций для новых полей HTTP в заголовках запросов и ответов, которые сделают нашу жизнь гораздо лучше во многих отношениях — в кешировании контента, в управлении обратными прокси, а также в установке гибких квот на количество запросов к серверу. О чём ещё можно мечтать? Перечислим некоторые из планируемых улучшений, с максимально кратким пояснением.

Статус промежуточных кешей

Новые поля в заголовке ответа HTTP: Cache-Status и таргетированный Cache-Control упростят кеширование статического контента. Поле Cache-Status определяет новое поле заголовка ответа HTTP со стандартизированным синтаксисом и семантикой для всех уровней кеширования, а Cache-Control — это список прямых инструкций кеширования, которые задаются сервером для запросов и ответов. В новой таргетированной версии можно будет задавать эти инструкции конкретной системе, а не всем уровням кеша на пути пакета, как раньше.

Примеры

Cache-Status: ExampleCache; fwd=uri-miss; collapsed=?0

Age: 1800
Cache-Control: max-age=600
CDN-Cache-Control: max-age=3600

Первая версия таргетированного Cache-Control опубликована в июле 2021 года, а Cache-Status предложен ещё в 2018 году, сейчас обсуждается уже 10-я версия черновика.

Коды состояния CDN и прокси

Спецификация Proxy-Status предлагает ввести новое поле в заголовке ответа для отображения статуса промежуточных узлов (прокси) на пути пакета, чтобы лучше понимать причины ошибок.

Этот протокол тоже вводится для лучшего соответствия реалиям современного интернета, где между клиентом и сервером стало много «посредников», таких как CDN и обратные прокси.

Как правило, эти посредники перенаправляют запросы к серверу, а затем ответы обратно клиенту. Но если ошибка возникает до того, как получен ответ от сервера, этот ответ часто генерируется самим прокси.

HTTP показывает такие ошибки с помощью кодов состояния типа 502 Bad Gateway и 504 Gateway Timeout. Но для облегчения отладки нужно более подробно сообщать клиенту о произошедшем. Кроме того, прокси иногда хотят передать с проходящим мимо пакетом дополнительную информацию о своей работе.

Параметры и коды ошибок прокси для поля ответа перечислены в спецификациях. Стандартом также предусмотрена регистрация в будущем и новых параметров Proxy-Status.

Примеры

HTTP/1.1 429 Too Many Requests
Proxy-Status: r34.example.net; error=http_request_error, ExampleCDN

Proxy-Status: cdn.example.org; next-hop=backend.example.org:8001;
next-protocol=h2; received-status=200;
details="Malformed response header: space before colon"

Стандарт в разработке с февраля 2019 года, последняя восьмая версия черновика опубликована в октябре 2021-го.

Ограничение на количество запросов

Смысл нового поля RateLimit в заголовке HTTP заключается в том, чтобы установить стандартный механизм для передачи сообщений об ограничениях на количество запросов (usage quota).

Как это происходит сейчас? Если веб-служба получает чрезмерное количество запросов из одного источника, то может вернуть ответ с кодом ошибки 429 Too Many Requests или 503 Service Unavailable. По текущему стандарту, в этом ответе есть поле Retry-After, в котором указан временной интервал, через который рекомендуется обратиться со следующим запросом. Но это не очень удобно. Сейчас сервер не имеет возможности сообщить клиенту самый главный параметр — допустимое количество запросов за определённый промежуток времени, чтобы ошибки 4хх или 5хх не возникали так часто.

Спецификации определяют синтаксис трёх полей: RateLimit-Limit с указанием общего лимита, RateLimit-Remaining с указанием оставшегося лимита на количество запросов в текущем интервале времени и RateLimit-Reset с указанием количества секунд до окончания этого интервала. Собственно, последнее поле похоже на существующее сейчас значение Retry-After.

Такие определения полей позволяют внедрять сложные политики, включая различные интервалы времени и динамические квоты.

Возможна установка значения service-limit с разными квотами на доступ к определённым разделам сайта и даже конкретным поисковым запросам, см. примеры ниже.

Примеры

Запрос:

 GET /items/123 HTTP/1.1
Host: api.example

Ответ:

 HTTP/1.1 200 Ok
Content-Type: application/json
acme-RateLimit-DayLimit: 5000
acme-RateLimit-HourLimit: 1000
RateLimit-Limit: 5000
RateLimit-Remaining: 100
RateLimit-Reset: 36000

{"hello": "world"}

Запрос:

 GET /items/123 HTTP/1.1
Host: api.example

Ответ:

 HTTP/1.1 200 Ok
Content-Type: application/json
RateLimit-Limit: 10, 100;w=60
Ratelimit-Remaining: 9
Ratelimit-Reset: 50

{
"status": 200,
"detail": "Just slow down without waiting."
}

Запросы и ответы:

GET /books/123 ; service-limit=4, remaining: 3, status=200
GET /books?author=WuMing ; service-limit=4, remaining: 1, status=200
GET /books?author=Eco ; service-limit=4, remaining: 0, status=429

Это предложение тоже обсуждается довольно давно: с сентября 2019 года, последняя версия опубликована в ноябре 2021-го.

Контрольные суммы

В новые поля дайджестов HTTP (Digest Fields) заголовков запроса и ответа предполагается записывать контрольную сумму некоего набора параметров. На основании этой контрольной суммы получатель сможет проверить цельность этих данных. Сами по себе поля не защищают содержимое пакетов от изменения, но в сочетании с цифровыми подписями могут выполнять эту задачу.

Предполагается, что дайджесты идут на смену устаревшему заголовку Content-MD5, который играл роль механизма обеспечения цельности данных до HTTP/1.1, а также стандарту последовавшему за ним стандарту RFC3230.

Итак, новое поле Digest содержит значения одной или нескольких контрольных сумм для набора параметров, вместе с указанием используемого алгоритма.

Пример

 Digest: sha-256=4REjxQ4yrqUVicfSKYNO/cF9zNj5ANbzgDZt3/h3Qxo=,
sha-512=WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+TaPm
AbwAgBWnrIiYllu7BNNyealdVLvRwEnmTHWXvJwew==

Аналогично, поле Content-Digest содержит значения контрольных сумм для содержимого пакетов (контента).

Предлагаются также поля Want-Digest и Want-Content-Digest в запросах с указанием предпочтений по параметрам контрольной суммы в ответных пакетах.

Примеры

 Want-Digest: sha-256
Want-Digest: sha-512;q=0.3, sha-256;q=1, unixsum;q=0
Want-Content-Digest: sha-256
Want-Content-Digest: sha-512;q=0.3, sha-256;q=1, unixsum;q=0

Эти спецификации близки к окончательному утверждению. Обсуждение ведётся с мая 2019 года, последний черновик draft-ietf-httpbis-digest-headers-07 опубликован в ноябре 2021-го.

HTTP Client Hints

HTTP Client Hints можно перевести как «подсказки клиента». Суть в следующем. По существующим стандартам клиент отправляет серверу строку user agent, на основании которой предполагает получить от сервера некоторый ответ. Но на практике клиент часто воздерживается от указания реального юзер-агента, потому что не имеет понятия, как сервер будет использовать эту информацию. Есть опасения в связи с приватностью, фингерпринтингом и т. д. То есть клиент просто опасается выдать лишние данные.

Так вот, по новому стандарту сервер включает в заголовок ответа поле Accept-CH — своеобразное разъяснение, как будут использоваться «подсказки клиента», вместе инструкциями по их составлению:

Accept-CH: Sec-CH-UA-Platform-Version

Получив конкретно такие инструкции, клиент может сгенерировать для сервера подходящий юзер-агент с указанием только того, что требуется:

 Sec-CH-UA: "Examplary Browser"; v="73", ";Not?A.Brand"; v="27"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"
Sec-CH-UA-Platform-Version: "14.0.0"

Этот процесс называется «проактивные переговоры по контенту» (proactive content negotiation).

Примеры использования Client Hints для юзер-агента можно посмотреть в неофициальном черновике User-Agent Client Hints.

Стандарт HTTP Client Hints уже принят в экспериментальном статусе как RFC 8942.

Как видим, протокол HTTP продолжает развиваться. Разработчики браузеров, серверного софта и других инструментов участвуют в этом, а иногда внедряют экспериментальную поддержку новых заголовков на ранней стадии, до их официального утверждения. Такая ранняя обкатка помогает уточнить и оформить стандарты в окончательном виде.

Автор: М.Видео-Эльдорадо

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js