594 Stimmen

Abmelden: GET oder POST?

In dieser Frage geht es nicht darum, wann man GET oder POST im Allgemeinen verwenden sollte; Es geht darum, welches die empfohlene Lösung für das Abmelden von einer Webanwendung ist. Ich habe viele Informationen über die Unterschiede zwischen GET und POST im allgemeinen Sinne gefunden, aber ich habe keine eindeutige Antwort für dieses spezielle Szenario gefunden.

Als Pragmatiker neige ich dazu, GET zu verwenden, weil die Implementierung viel einfacher ist als POST; man muss nur einen einfachen Link einfügen, und schon ist man fertig. Dies scheint bei der großen Mehrheit der Websites der Fall zu sein, die mir einfallen, zumindest wenn ich mich recht entsinne. Sogar Stack Overflow loggt sich mit GET aus.

Was mich zögern lässt, ist das (wenn auch alte) Argument, dass einige Web-Beschleuniger/Proxys Seiten vorcachen, indem sie jeden Link, den sie auf der Seite finden, abrufen, so dass der Benutzer eine schnellere Antwort erhält, wenn er darauf klickt. Ich bin mir nicht sicher, ob dies immer noch zutrifft, aber wenn dies der Fall wäre, dann würde theoretisch ein Benutzer mit einem dieser Beschleuniger aus der Anwendung geworfen werden, sobald er sich anmeldet, weil sein Beschleuniger den Abmeldelink finden und abrufen würde, auch wenn er ihn nie angeklickt hat.

Alles, was ich bisher gelesen habe, deutet darauf hin, dass POST sollte für "destruktive Aktionen" verwendet werden, während Aktionen, die den internen Zustand der Anwendung nicht verändern - wie Abfragen und dergleichen - mit GET behandelt werden sollten. . Die eigentliche Frage, die sich hier stellt, ist also:

Gilt das Abmelden von einer Anwendung als destruktive Aktion bzw. wird der interne Zustand der Anwendung verändert?

0 Stimmen

Wenn Sie die Website zum ersten Mal besuchen und der Abmeldelink nicht vorhanden ist, werden Sie beim Anmelden abgemeldet. Wenn Sie sich ein zweites Mal anmelden, ist das kein Problem, da die Abmelde-URL bereits im Cache gespeichert ist. Man kann aber davon ausgehen, dass jeder anständige Beschleuniger in der Lage ist, die meisten Logout-URLs herauszufiltern.

2 Stimmen

HyperCas, das Herausfiltern von Logout-URLs durch Beschleuniger war eine Theorie, die ich in Betracht gezogen habe, und einer der Gründe, warum ich mich entschlossen habe, die Frage zu stellen. Es widerstrebt mir, einfach der Logik der Beschleuniger zu vertrauen und eines Tages eine Benutzerin mit einem schlechten Beschleuniger zu haben, die sich beschwert, dass sie sich nicht anmelden kann. Wissen Sie, ob sie einem Standard folgen, oder ob ein solcher Standard existiert?

0 Stimmen

Jeder Accelerator, der automatisch ein Formular übermittelt (zum Beispiel), wäre IMO Malware... es ist völlig unlogisch zu denken, dass ein Accelerator automatisch ein Formular übermitteln würde. Stellen Sie sich vor, Sie besuchen Google. Wie könnte er das Suchformular übermitteln? Niemand kann für Malware verantwortlich gemacht werden, da sie zu unberechenbar ist und sich nicht an die Regeln hält.

661voto

David Murdoch Punkte 85120

Utilice POST .

Im Jahr 2010, unter Verwendung von GET war wahrscheinlich eine akzeptable Antwort. Aber heute (2013) rufen die Browser Seiten vor, von denen sie glauben, dass Sie sie als nächstes besuchen werden.

Hier ist einer der StackOverflow-Entwickler, der über dieses Problem auf Twitter spricht:

Ich möchte mich bei meiner Bank dafür bedanken, dass sie das Abmelden zu einer GET-Anfrage gemacht hat, und beim Chrome-Team für das praktische URL-Prefetching - Nick Craver ( @Nick_Craver ) Januar 29, 2013

Spaßfakt: StackOverflow hat sich früher per GET abgemeldet, aber jetzt nicht mehr.

3 Stimmen

Danke für dieses Update, Dave. Ich habe nicht einmal bemerkt, dass SO ihre Abmeldung auf POST umgestellt hat, und ich hatte ehrlich gesagt keine Ahnung, dass Chrome mit eingebautem Pre-Fetching kommt. Und schließlich hätte der von Ihnen zitierte Trottel kein besseres Beispiel für das Problem bieten können, das ich in meiner Frage beschrieben habe und das meinen Verdacht bestätigt. Ich stimme für Ihre Antwort und mache sie zur akzeptierten Antwort.

4 Stimmen

In my browser, Stackoverflow logout looks like <li><a href="http://stackoverflow.com/users/logout">log out</a></li> which is a GET, not a POST

11 Stimmen

@Mark0978, klicken Sie auf den Link.

60voto

Darrel Miller Punkte 133891

Bei REST sollte es keine Sitzung geben, also gibt es auch nichts zu zerstören. Ein REST-Client authentifiziert sich bei jeder Anfrage. Angemeldet oder abgemeldet, das ist nur eine Illusion.

Die eigentliche Frage ist, ob der Browser weiterhin bei jeder Anfrage die Authentifizierungsdaten senden soll.

Wenn Ihre Anwendung den Eindruck erweckt, dass Sie angemeldet sind, sollten Sie in der Lage sein, sich mit Javascript abzumelden. Kein Umweg erforderlich.


Fielding Dissertation - Abschnitt 5.1.3

jede Anfrage vom Client zum Server muss alle Informationen enthalten, die die notwendig sind, um die Anfrage zu verstehen, und kann keinen Vorteil aus einem gespeicherten Kontext auf dem Server nutzen. Sitzung Zustand wird daher vollständig auf dem dem Client

1 Stimmen

Das war mir tatsächlich nicht bewusst. Dann schätze ich, dass meine App nicht sehr RESTful überhaupt sein wird, da ich ASP.NET MVC mit FormsAuthentication verwende und es auf Sitzungen beruht...

0 Stimmen

@Daniel Ich habe den entsprechenden Abschnitt aus der Definition von REST hinzugefügt.

38 Stimmen

Aber in der Praxis werden die Anmeldeinformationen in einem Cookie gespeichert, das mit dem httponly Attribut, um einigen XSS-Risiken vorzubeugen, was bedeutet, dass es nur vom Server zurückgesetzt werden kann (abgesehen von der manuellen Löschung des Cookies)

49voto

miorey Punkte 634

Hallo aus meiner Sicht, wenn Sie sich anmelden, überprüfen Sie Benutzername / Passwort und wenn diese übereinstimmen, erstellen Sie das Login-Token.

CREATE token => Methode POST

Wenn Sie sich abmelden, zerstören Sie das Token, daher sollte die logischste Methode ein DELETE sein.

DELETE-Token => Methode DELETE

8 Stimmen

Interessanter Blickwinkel.

1 Stimmen

Ich verwende diese Methode in meinen Spring Boot REST-Anwendungen.

2 Stimmen

Ja, aber die URL für DELETE sollte die zu löschende Ressource identifizieren, so dass sie nicht dieselbe sein kann wie bei POST.

47voto

raveren Punkte 16958

Ein Weg GET hier missbraucht werden könnte, ist, dass eine Person (vielleicht ein Wettbewerber:) ein Bild-Tag mit src="<your logout link>" Wenn ein Nutzer Ihrer Website auf diese Seite stößt, wird er unwissentlich ausgeloggt.

7 Stimmen

Nein, das ist nicht richtig. Ein Abmeldelink funktioniert nur, wenn die richtigen Cookie-Daten gesendet werden, was von einer anderen Domäne nicht der Fall sein wird. Und selbst wenn die Sitzungs-ID in der URL gespeichert ist, würde das auch nicht funktionieren, da sich diese bei jeder Sitzung ändert.

5 Stimmen

Wow, daran habe ich nie gedacht! Das ist ein weiterer Grund, GET nicht zu verwenden, und ein weiterer Grund, warum ich nicht verstehe, warum es alle tun. Verdammt, jetzt bin ich in Versuchung, eine stackoverflow.com/benutzer/abmelden "Bild" zu meinem Beitrag hinzufügen und sehen, was passiert :-D

0 Stimmen

@Richard - Das macht Sinn, aber das Problem würde auch bei gemeinschaftsorientierten Websites wie SO bestehen, oder? Die Domain wäre in diesem Fall dieselbe.

25voto

VinayC Punkte 44872

Korrekterweise sind GET/POST (oder andere Verben) Aktionen auf eine Ressource (adressiert durch die URL) - es geht also im Allgemeinen um den Zustand der Ressource und nicht um den Anwendungszustand als solchen. Im wahrsten Sinne des Wortes sollten Sie also eine URL wie die folgende haben [host name]\[user name]\session dann wäre "DELETE" das richtige Verb für die Abmeldeaktion.

Verwendung von [host name]\bla bla\logout als URL ist nicht wirklich ein vollständiger REST-Weg (IMO), warum also über die korrekte Verwendung von GET/POST diskutieren?

Natürlich verwende ich auch GET für eine Logout-URL in meinen Anwendungen :-)

2 Stimmen

In diesem Fall würde ich dann argumentieren, dass der Teil [Benutzername] in der URL unnötig erscheint, da sich die Benutzer immer von (d.h. DELETE) abmelden ihre eigenen Sitzung; niemals die anderer Benutzer :-)

2 Stimmen

Nicht wirklich - wir sagen, dass die Sitzung eine Ressource ist und wir sie löschen wollen. Um eine Sitzung einheitlich zu adressieren, müssen Sie den Benutzernamen als Teil der URL angeben. Ihr Argument ist genauso gut, wie wenn Sie sagen würden, dass Sie eine PUT-Aktion für [Fotogalerie] durchführen. \pictures bedeutet, dass Sie Ihren Fotos (verfügbar unter [Fotogalerie]\[Nutzername] \pictures ). Verschiedene Ressourcen müssen explizit angesprochen werden, es darf keine Selbstverständlichkeiten geben. Die Website kann es anderen Nutzern erlauben, Bilder zu Ihrer Galerie hinzuzufügen - das wäre ein Teil der Zugangskontrolle, genauso wie Sie einen Superuser haben können, der die Sitzungen von anderen löschen kann.

1 Stimmen

Philosophisch gesehen könnte man Sitzungen und Fotos als "Ressourcen" bezeichnen, aber realistisch betrachtet würde ich sie nicht gleich behandeln. Sitzungen sind immer auf den aktuellen Benutzer beschränkt (daher der Name Sitzung), und zumindest in ASP.NET gibt es keine Möglichkeit, auf die Sitzungen eines anderen Benutzers zuzugreifen. Selbst der Anwendungsentwickler hat keine direkte Möglichkeit, alle aktiven Sitzungen aufzuzählen oder Sitzungen einzeln zu beenden. Sie könnten die Anwendung neu starten, um alle Sitzungen zu beenden (InProc), aber das würde ich nicht als Zugriffskontrolle bezeichnen. Abgesehen von den URLs bleibt die Frage bestehen: GET oder POST?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X