Поле 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
AbwAgBWnrIiYllu7BNNyealdVLvRwE\nmTHWXvJwew==


Аналогично, поле 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 продолжает развиваться. Разработчики браузеров, серверного софта и других инструментов участвуют в этом, а иногда внедряют экспериментальную поддержку новых заголовков на ранней стадии, до их официального утверждения. Такая ранняя обкатка помогает уточнить и оформить стандарты в окончательном виде.

Комментарии (5)


  1. zorn-v
    29.11.2021 17:37
    +3

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

    А кто то их придерживается по заголовкам ?

    Здравствуйте, я вежливый бот...


    1. mk2
      29.11.2021 22:08
      -1

      Прямо сейчас это конечно ничего особо не даст. А через пару лет можно будет с чистой совестью банить на подольше тех, кто этих ограничений не придерживается.


      1. zorn-v
        30.11.2021 17:32
        +2

        И можете закрывать проект. Браузеры "не придерживаются" )

        Ну и "софт" который дергает АПИ. Поверьте договориться об обмене проще через "все разрешить", чем рассказывать как обрабатывать заголовки )

        Ну может где то существует "идеальный мир", хз


  1. ChuckLaud
    30.11.2021 11:52
    +2

    Я до сих пор встречаю ресурсы без HTTPS :)


  1. OlegZH
    07.12.2021 20:30

    Главными инструментами для создания гипертекста и работы с ним Т. Нельсон считал трансвключение (англ. transclusion), то есть возможность включения одних текстов или частей текстов в другие и ссылки / связи (англ. link) между текстами.

    Именно поэтому

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

    не совсем то, что нужно. А нужно вот это:

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

    В этом смысле, развитие HTTP пошло не вперёд, а куда-то вбок. Под фонарём, наверное, код пишется гораздо лучше.