Was ist der X-REQUEST-ID http-Header?

91

Ich habe dieses Thema bereits viel gegoogelt, verschiedene Artikel über diesen Header, seine Verwendung in Heroku und Projekte gelesen, die auf Django basieren.

Es ist jedoch immer noch alles in meinem Kopf verwirrt.

  • Was ist der Zweck dieses Headers?
  • Verstößt es gegen die Privatsphäre der Benutzer?
  • Kann es helfen, einen Benutzer zu verfolgen?
Stephan
quelle
1
@Wrikken Das habe ich schon gemacht ... und ich bin immer noch verwirrt über diesen Header.
Stephan
Um (1) eine Webanforderung mit der an Ihre Anwendung weitergeleiteten Anforderung zu korrelieren, (2) Nein, da der Benutzer sie nicht sendet, legt der Router sie fest (3) Siehe (2), aber es kann hilfreich sein, einzelne Personen zu verfolgen Anforderungen beim Debuggen.
Wrikken

Antworten:

159

Wenn Sie einen Webservice betreiben, auf den Clients zugreifen, kann es schwierig sein, Anforderungen (die ein Client sehen kann) mit Serverprotokollen (die der Server sehen kann) zu korrelieren.

Die Idee von X-Request-IDist, dass ein Client eine zufällige ID erstellen und an den Server übergeben kann. Der Server nimmt diese ID dann in jede von ihm erstellte Protokollanweisung auf. Wenn ein Client einen Fehler erhält, kann er die ID in einen Fehlerbericht aufnehmen, sodass der Serverbetreiber die entsprechenden Protokollanweisungen nachschlagen kann (ohne sich auf Zeitstempel, IPs usw. verlassen zu müssen).

Da diese ID (zufällig) vom Kunden generiert wird, enthält sie keine vertraulichen Informationen und sollte daher die Privatsphäre des Benutzers nicht verletzen. Da pro Anforderung eine eindeutige ID erstellt wird, hilft dies auch nicht bei der Verfolgung von Benutzern.

Stefan Kögl
quelle
@Wrikken erwähnt in seinem Kommentar, dass die ID von einem Router und hier seinen Clients festgelegt wurde. Was sind Kunden?
Stephan
3
Ein Client ist die Software, die die Anforderung an den Server sendet. Dies kann ein Browser oder ein Stresstest-Tool wie JMeter sein. Der Server kann auch die Anforderungs-ID generieren, wenn eine nicht vom ursprünglichen Client bereitgestellt wurde, und sie später an andere Server weitergeben, z. B. generiert der Webserver die ID und leitet sie an den Anwendungsserver weiter.
Isapir
1
Der Heroku-Blog erklärt, dass X-Request-ID dabei hilft, mehrere Protokolleinträge mit einzelnen HTTP-Anfragen zu korrelieren
Stephan
3
Es wird auch als CorrelationId bezeichnet und ist kein Standard-HTTP-Header: en.wikipedia.org/wiki/List_of_HTTP_header_fields X-Request-ID, X-Correlation-ID. Korreliert HTTP-Anforderungen zwischen einem Client und einem Server.
Major
Wenn jede Anfrage mit einer Benutzersitzung einhergeht, muss dann noch die X-Request-ID angehängt werden?
Jerry Chin
11

Zweck: Idempotenz

Mit einer ID, die sich für jede Anforderung ändert, aber bei einem erneuten Versuch einer Anforderung gleich bleibt, kann der Empfänger sicherstellen, dass die Anforderung nicht mehr als einmal verarbeitet wird.

Dies ist ein Zitat eines API-Anbieters:

Alle POST-, PUT- und PATCH-HTTP-Anforderungen sollten einen eindeutigen X-Request-ID-Header enthalten, der verwendet wird, um die idempotente Nachrichtenverarbeitung im Falle eines erneuten Versuchs sicherzustellen

Wenn Sie eine zufällige Zeichenfolge festlegen, die pro Anfrage eindeutig ist , wird dies weder Ihre Privatsphäre verletzen noch die Nachverfolgung aktivieren.

Wenn Sie mehr über das Angebot von Idempotenz erfahren möchten, lesen Sie diesen aufschlussreichen Artikel .

NB Wie Stefan Kögl kommentiert, ist dieser Header nicht standardisiert - daher das (veraltete) Präfix "X-".

Evgeniy Berezovsky
quelle
5
Bitte beachten Sie, dass "einige API-Anbieter" den X-Request-ID-Header möglicherweise auf diese Weise verwenden, dies jedoch kein Standardverhalten ist. Es kann im Allgemeinen nicht für diesen Zweck verwendet werden.
Stefan Kögl
Ein weiteres einfaches Snippet: restapitutorial.com/lessons/idempotency.html
JayRizzo
1

Erklärung anhand einer Geschichte / Analogie

Ihr Internet läuft (wie üblich), also rufen Sie Tellstra an und warten ewig am Telefon. Schließlich geben Sie auf und knallen das Telefon frustriert auf. (Dies ist ein fehlgeschlagener Anruf. In den Anrufprotokollen von Tellstra ist eine Aufzeichnung davon enthalten.)

"Das war's, ich rufe den Bürgerbeauftragten an!"

Der Obmudsmann muss jedoch Tausende von Anrufdatensätzen durchgehen (alle fehlgeschlagenen Abfragen von Tellstra). Wenn Sie ihnen mitteilen, dass Sie Telstra angerufen haben und Ihr Anruf nicht erfolgreich war, reicht dies nicht aus: Woher weiß der Bürgerbeauftragte aus allen Anruflisten von Tellstra, welche Ihre war - damit sie weiter untersucht werden kann? ?

Hier kommt die X-Request-ID ins Spiel - wenn Sie Tellstra anrufen, geben Sie eine Zufallszahl (die X-Request-ID) weiter, die in den Tellstra-Datensätzen protokolliert wird. Auf diese Weise kann der Ombudsmann (der Zugriff auf alle Datensätze hat) Ihren eingehenden Anruf finden, um herauszufinden, was schief gelaufen ist.

Anwendung der Geschichte auf HTTP

Gleiches gilt für http-Anfragen. Diese ID hilft Ihnen (als Back-End-Entwickler) herauszufinden, was schief gelaufen ist, wenn ein Client Ihnen einen Fehler oder einen großen Bericht ausgibt.

Das ist die grundlegende Zusammenfassung davon. Bei Fragen usw. schreibe einfach einen Kommentar und ich hoffe, ihn zu klären.

BKSpurgeon
quelle
1
Die "Analogie" hier fügt meiner Meinung nach eher Verwirrung als Klarheit hinzu. Im Falle eines Telefonanrufs gibt es keine Möglichkeit, eine Zufallszahl weiterzugeben, die vom Empfänger automatisch protokolliert wird, und folglich ist Ihre Geschichte unsinnig.
Mark Amery
-11

Dieser Anforderungsheader kann zur Synchronisierung verwendet werden. Angenommen, Sie haben eine ToDo-Liste erstellt, die Offline-Funktionen bietet. Ihr Benutzer erstellt 3 Elemente, von denen jedes eine eindeutige UUID in der Offline-Anwendung erhält. Wenn eine Netzwerkverbindung verfügbar ist, werden die Datensätze an den Server gesendet und die entsprechenden IDs, die automatisch aus der Datenbank generiert wurden, zurückgegeben. Sie können dann die IDs in Ihrer App ersetzen (z. B. "id" -Attribut des HTML-Elements "li").

Mark Png
quelle
4
Das hier beschriebene Szenario impliziert nicht die Verwendung eines HTTP-Headers zum Transportieren der UUID.
Stephan