it-swarm.com.de

Was ist der Unterschied zwischen einer 302- und einer 307-Umleitung?

Was ist der Unterschied zwischen einem 302 FOUND und ein 307 TEMPORARY REDIRECT HTTP-Antwort?

Die W3-Spezifikation scheint darauf hinzudeuten, dass beide für temporäre Weiterleitungen verwendet werden, und beide können nicht zwischengespeichert werden, es sei denn, die Antwort lässt dies ausdrücklich zu.

186
Zach Hirsch

Der Unterschied betrifft das Umleiten von POST-, PUT- und DELETE -Anforderungen sowie die Erwartungen des Servers an das Verhalten des Benutzeragenten ( RFC 2616 ):

Hinweis: RFC 1945 und RFC 2068 geben an, dass der Client die Methode für die umgeleitete Anforderung nicht ändern darf. Die meisten vorhandenen Benutzeragentenimplementierungen behandeln 302 jedoch so, als wäre es eine 303-Antwort, und führen unabhängig von der ursprünglichen Anforderungsmethode ein GET für den Feldwert Location aus. Die Statuscodes 303 und 307 wurden für Server hinzugefügt, die eindeutig angeben möchten, welche Art von Reaktion vom Client erwartet wird.

Lesen Sie auch den Wikipedia-Artikel über x Umleitungscodes .

89
Franci Penov

307 kam zustande, weil Benutzerprogramme als de facto Verhalten angenommen wurden, um POST Anforderungen, die eine 302-Antwort empfangen und senden) anzunehmen eine GET-Anforderung an den Location-Antwortheader.

Das ist das falsche Verhalten - nur ein 303 sollte ein POST zu verwandeln Benutzerprogramme sollten (aber nicht) bei der Anforderung der neuen URL die Methode POST) beibehalten, wenn die ursprüngliche POST=) Anforderung eine 302 zurückgab.

307 wurde eingeführt, um Servern zu ermöglichen, dem Benutzeragenten zu verdeutlichen, dass eine Methodenänderung vom Client nicht vorgenommen werden sollte , wenn der Location-Antwortheader befolgt wird.

147
Christopher Orr

Ein gutes Beispiel für die 307 Internal Redirect in Aktion ist, wenn Google Chrome) auf einen HTTP-Aufruf zu einer Domain stößt, die bekanntermaßen eine strikte Transportsicherheit erfordert.

Der Browser leitet nahtlos um und verwendet dabei dieselbe Methode wie beim ursprünglichen Aufruf.

HTST 307 Internal Redirect

56

ERWARTET für 302: Die Umleitung verwendet dieselbe Anforderungsmethode POST on NEW_URL

CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT POST NEW_URL

ACTUAL für 302, 303: Leitet die Anforderungsmethode für Änderungen von POST zu GET für NEW_URL um

CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)
CLIENT POST OLD_URL -> SERVER 303 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)

ACTUAL für 307: Redirect verwendet dieselbe Anforderungsmethode POST on NEW_URL

CLIENT POST OLD_URL -> SERVER 307 NEW_URL -> CLIENT POST NEW_URL
7
Roy Hyunjin Han

Flowchart

  • 301: Permanente Weiterleitung: Die URL ist alt und sollte ersetzt werden. Browser werden dies zwischenspeichern.
    Beispielverwendung: URL verschoben von /register-form.html bis signup-form.html.
    Die Methode wird gemäß RFC 7231 in GET geändert: "Aus historischen Gründen KANN ein Benutzeragent die Anforderungsmethode für die nachfolgende Anforderung von POST in GET ändern."
  • 302: temporäre Umleitung. Nur für HTTP/1.0-Clients verwenden. Dieser Statuscode sollte die Methode nicht ändern, aber die Browser haben es trotzdem getan. Der RFC sagt: "Viele Benutzeragenten vor HTTP/1.1 verstehen [303] nicht. Wenn die Interoperabilität mit solchen Clients ein Problem darstellt, kann stattdessen der 302-Statuscode verwendet werden, da die meisten Benutzeragenten auf eine 302-Antwort wie hier beschrieben reagieren für 303. " Natürlich können einige Clients es gemäß der Spezifikation implementieren. Wenn die Interoperabilität mit solchen alten Clients also kein echtes Problem darstellt, ist 303 besser für konsistente Ergebnisse.
  • 303: Temporäre Weiterleitung, Änderung der Methode in GET.
    Beispielverwendung: wenn der Browser POST an /register.php, dann lade jetzt (GET) /success.html.
  • 307: Temporäre Umleitung, die Anforderung wird identisch wiederholt.
    Beispielverwendung: wenn der Browser eine POST an /register.php, dann wird es angewiesen, POST at /signup.php.
  • 308: Permanente Weiterleitung, die Anforderung wird identisch wiederholt. Wenn 307 das Gegenstück von 303 "keine Methodenänderung" ist, ist dieser 308-Status "keine Methodenänderung" "Gegenstück zu 301.

RFC 7231 (von 2014) ist sehr lesbar und nicht übermäßig ausführlich. Wenn Sie die genaue Antwort wissen möchten, ist dies eine empfohlene Lektüre. Einige andere Antworten verwenden RFC 2616 von 1999, aber nichts hat sich geändert.

RFC 7238 gibt den 308-Status an. Es gilt als experimentell, wurde aber bereits 2016 von von allen gängigen Browsern unterstützt .

5
Luc

Für Serveradministratoren kann es außerdem wichtig sein, zu beachten, dass Browser dem Benutzer möglicherweise eine Eingabeaufforderung anzeigen, wenn Sie die 307-Umleitung verwenden.

Zum Beispiel *, Firefox und Opera bittet den Benutzer um Erlaubnis zur Weiterleitung, während Chrome IE und Safari die Weiterleitung transparent ausführen würden.

* per Bulletproof SSL und TLS (Seite 192).

1
Pacerier

In einigen Anwendungsfällen können 307 Weiterleitungen von einem Angreifer missbraucht werden, um die Berechtigungsnachweise des Opfers zu ermitteln.

Weitere Informationen finden Sie in Abschnitt 3.1 von Eine umfassende formale Sicherheitsanalyse von OAuth 2. =.

Die Autoren des obigen Papiers schlagen Folgendes vor:

Fix. Entgegen der aktuellen Formulierung im OAuth Standard, die genaue Methode der Weiterleitung ist kein Implementierungsdetail Im HTTP-Standard ( RFC 7231 ) ist nur die 303-Umleitung eindeutig definiert, um den Hauptteil einer HTTP POST) -Anforderung zu löschen. Alle anderen HTTP-Umleitungsstatuscodes, einschließlich der am häufigsten verwendeten 302, lassen dem Browser die Option, die POST) - Anforderung und die Formulardaten beizubehalten. In der Praxis schreiben Browser normalerweise eine GET-Anforderung um Löschen der Formulardaten mit Ausnahme von 307 Weiterleitungen. Daher sollte der Standard OAuth 303 Weiterleitungen für die oben genannten Schritte erfordern, um dieses Problem zu beheben.

1
M.S. Dousti