Что такое http-заголовок X-REQUEST-ID?

97

Я уже много гуглил на эту тему, читал различные статьи об этом заголовке, его использовании в Heroku и проектах, основанных на Django.

Однако в голове до сих пор все запутано.

  • Какова цель этого заголовка?
  • Нарушает ли это конфиденциальность пользователей?
  • Может ли это помочь в отслеживании пользователя?
Стефан
источник
1
@Wrikken Я уже сделал это ... и я до сих пор не понимаю этот заголовок.
Стефан
Затем, чтобы (1) согласовать веб-запрос с запросом, перенаправленным в ваше приложение (2) Нет, поскольку пользователь не отправляет его, маршрутизатор устанавливает его (3) См. (2), но он может помочь отслеживать отдельные запросы при отладке.
Wrikken

Ответы:

170

Когда вы используете веб-сервис, к которому обращаются клиенты, может быть сложно сопоставить запросы (которые видит клиент) с журналами сервера (которые сервер может видеть).

Идея X-Request-IDзаключается в том, что клиент может создать случайный идентификатор и передать его серверу. Затем сервер включает этот идентификатор в каждый оператор журнала, который он создает. Если клиент получает сообщение об ошибке, он может включить идентификатор в отчет об ошибке, позволяя оператору сервера искать соответствующие операторы журнала (без необходимости полагаться на временные метки, IP-адреса и т. Д.).

Поскольку этот идентификатор генерируется (случайным образом) клиентом, он не содержит конфиденциальной информации и, следовательно, не должен нарушать конфиденциальность пользователя. Поскольку уникальный идентификатор создается для каждого запроса, он также не помогает отслеживать пользователей.

Стефан Кёгль
источник
@Wrikken упоминает в своем комментарии, что идентификатор был установлен маршрутизатором, а здесь - его клиентами. Какие клиенты?
Стефан
4
Клиент - это программное обеспечение, которое отправляет запрос на сервер, может быть браузером или инструментом стресс-тестирования, таким как JMeter. Также сервер может сгенерировать идентификатор запроса, если он не предоставлен исходным клиентом, и передать его другим серверам по линии, например, веб-сервер генерирует идентификатор и пересылает его на сервер приложений.
isapir 05
1
В блоге Heroku объявляется, что X-Request-ID помогает сопоставить несколько записей журнала с отдельными HTTP-запросами: blog.heroku.com/…
Стефан
4
Он также известен как CorrelationId, а не стандартный заголовок HTTP: en.wikipedia.org/wiki/List_of_HTTP_header_fields X-Request-ID, X-Correlation-ID. Коррелирует HTTP-запросы между клиентом и сервером.
Major
если каждый запрос идет с пользовательской сессией, нужно ли прикреплять X-Request-ID?
Джерри Чин
14

Назначение: идемпотентность

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

Это цитата некоего поставщика API:

Все HTTP-запросы POST, PUT и PATCH должны содержать уникальный заголовок X-Request-Id, который используется для обеспечения обработки идемпотентного сообщения в случае повторной попытки.

Если вы сделаете его случайной строкой, уникальной для каждого запроса , это не повлияет ни на вашу конфиденциальность, ни на отслеживание.

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

NB. Как отмечает Стефан Кёгль, этот заголовок не стандартизирован - отсюда (устаревший) префикс «X-».

Евгений Березовский
источник
5
Обратите внимание, что хотя «какой-то поставщик API» может использовать заголовок X-Request-Id таким образом, это нестандартное поведение. Обычно его нельзя использовать для этой цели.
Стефан Кёгль
Еще один простой фрагмент: restapitutorial.com/lessons/idempotency.html
JayRizzo,
1

Объяснение с использованием рассказа / аналогии

Ваш Интернет набирает обороты (как обычно), так что вы звоните в Tellstra и ждете по телефону вечно ... наконец, вы сдаетесь и в отчаянии бросаете трубку. (Это неудавшийся вызов. Об этом есть запись в журнале вызовов Tellstra.)

"Все, я звоню омбудсмену!"

Но у Обмудсмана есть тысячи записей звонков, которые нужно просмотреть (все неудавшиеся запросы Tellstra). Если вы скажете им, что звонили в Telstra и что ваш звонок был неудачным, этого будет недостаточно: как омбудсмен узнает из всех записей разговоров в Tellstra, какой из них был вашим, чтобы его можно было расследовать дальше? ?

Вот где появляется X-Request-ID - когда вы звоните в Tellstra, вы передаете случайное число (X-Request-ID), и это регистрируется в записях Tellstra. Таким образом, омбудсмен (имеющий доступ ко всем записям) сможет найти ваш входящий звонок и выяснить, что пошло не так.

Применение истории к HTTP

То же самое относится к HTTP-запросам - это идентификатор, который помогает вам (как внутреннему разработчику) выяснить, что пошло не так, когда клиент выдает вам ошибку или большой отчет.

Это основное его резюме. Любые вопросы и т. Д. Просто оставьте комментарий, и я надеюсь прояснить это.

BKSpurgeon
источник
1
«Аналогия» здесь, на мой взгляд, скорее добавляет путаницы, чем ясности. В случае телефонного звонка невозможно передать случайное число, которое автоматически регистрируется получателем, и, следовательно, ваша история бессмысленна.
Марк Эмери
-12

Этот заголовок запроса может использоваться для синхронизации. Допустим, вы создали список ToDo, который предлагает автономную работу. Ваш пользователь создает 3 элемента, и каждому из них дается уникальный UUID в автономном приложении. Когда сетевое подключение доступно, записи отправляются на сервер POST и возвращаются соответствующие идентификаторы, автоматически сгенерированные из базы данных. Затем вы можете заменить идентификаторы в своем приложении (например, атрибут «id» элемента HTML «li»).

Марк PNG
источник
4
Описанный здесь сценарий не подразумевает использование заголовка HTTP для передачи UUID.
Стефан