it-swarm.com.de

Logout: GET oder POST?

Bei dieser Frage geht es nicht darum, wann GET oder POST im Allgemeinen; verwendet werden soll. Es geht darum, welche Frage für die Abmeldung von einer Webanwendung empfohlen wird. Ich habe festgestellt Viele Informationen zu den Unterschieden zwischen GET und POST im allgemeinen Sinne, aber für dieses spezielle Szenario habe ich keine eindeutige Antwort gefunden.

Als Pragmatiker neige ich dazu, GET zu verwenden, da die Implementierung viel einfacher ist als bei POST. Lass einfach einen einfachen Link fallen und du bist fertig. Dies scheint bei der überwiegenden Mehrheit der Websites der Fall zu sein, die ich mir zumindest aus der Vogelperspektive vorstellen kann. Sogar Stack Overflow erledigt das Abmelden mit GET.

Die Sache, die mich zögern lässt, ist das (wenn auch alte) Argument, dass einige Web-Beschleuniger/Proxies Seiten vor dem Cache speichern, indem sie jeden auf der Seite gefundenen Link aufrufen und abrufen, sodass der Benutzer eine schnellere Antwort erhält, wenn er darauf klickt. Ich bin nicht sicher, ob dies immer noch zutrifft, aber wenn dies der Fall wäre, würde theoretisch ein Benutzer mit einem dieser Beschleuniger aus der Anwendung geworfen, sobald er sich anmeldet, da sein Beschleuniger den Abmeldevorgang findet und abruft Link, auch wenn sie nie darauf geklickt hat.

Alles, was ich bisher gelesen habe, deutet darauf hin, dass POST für "destruktive Aktionen" verwendet werden sollte, wohingegen Aktionen, die den internen Status der Anwendung nicht verändern - wie Abfragen und dergleichen -, mit GET behandelt werden sollten . Auf dieser Grundlage lautet die eigentliche Frage hier:

Wird das Abmelden von einer Anwendung als destruktive Aktion angesehen/ändert sich der interne Status der Anwendung?

373
Daniel Liuzzi

Verwenden Sie POST.

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

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

Ich möchte meiner Bank dafür danken, dass sie eine GET-Anfrage abgemeldet hat, und dem Chrome Team für das praktische URL-Prefetching.- Nick Craver ( @ Nick_Craver ) - 29. Januar 201

lustige Tatsache: StackOverflow verwendet, um sich über GET abzumelden, aber nicht mehr.

420
David Murdoch

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

Was Sie wirklich fragen, sollte der Browser weiterhin die Authentifizierungsinformationen bei jeder Anfrage senden.

Wenn Ihre Anwendung den Eindruck erweckt, angemeldet zu sein, sollten Sie in der Lage sein, sich mit Javascript abzumelden. Keine Hin- und Rückfahrt erforderlich.


Fielding Dissertation - Abschnitt 5.1.

jede Anforderung von Client zu Server muss alle Informationen enthalten, die zum Verständnis der Anforderung erforderlich sind, und kann keinen auf dem Server gespeicherten Kontext nutzen. Der Sitzungsstatus bleibt daher vollständig auf dem Client

41
Darrel Miller

Eine Möglichkeit, wie GET hier missbraucht werden kann, besteht darin, dass eine Person (vielleicht ein Konkurrent) irgendwo im Internet ein Image-Tag mit src="<your logout link>" Platziert hat und dass ein Benutzer Ihrer Website auf diese Seite stößt wird unwissentlich abgemeldet.

36
raveren

Um richtig zu sein, GET/POST (oder andere Verben) sind Aktionen auf einer Ressource (über URL adressiert) - es geht also im Allgemeinen um den Status der Ressource und nicht um den Anwendungsstatus als solchen. Also in wahrer Stimmung, sollten Sie eine URL wie [Host name]\[user name]\session, dann wäre 'DELETE' das richtige Verb für die Abmeldeaktion.

Mit [Host name]\bla bla\logout als URL in nicht wirklich einer Weise REST full way (IMO), also warum Debatte über die korrekte Verwendung von GET/POST darauf?

Natürlich benutze ich GET auch, um mich in meinen Anwendungen abzumelden :-)

19
VinayC

Das Abmelden wirkt sich nicht auf die Anwendung selbst aus. Es ändert den Status des Benutzers in Bezug auf die Anwendung. In diesem Fall hängt Ihre Frage eher davon ab, wie der Befehl vom Benutzer initiiert werden soll, um diese Aktion zu starten. Da es sich nicht um eine "destruktive Aktion" handelt, können Sie nicht zulassen, dass beide Methoden einen Abmeldevorgang einleiten, da sichergestellt ist, dass die Sitzung abgebrochen oder zerstört wird, aber weder Ihre Anwendung noch Ihre Daten geändert werden. Der Beitrag sollte von allen benutzerinitiierten Aktionen verwendet werden (z. B. - Benutzer klickt auf "Abmelden"), während get für anwendungsinitiierte Abmeldungen reserviert sein kann (z. B. - eine Ausnahme, die ein mögliches Eindringen eines Benutzers erkennt, leitet mit einem Abmeldungs-GET zwangsweise auf die Anmeldeseite um ).

14
Joel Etherton

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

CREAT-Token => Methode NACH

Wenn Sie sich abmelden, zerstören Sie das Token. Für mich sollte die logischste Methode DELETE sein

DELETE token => method DELETE

11
miorey

Das Szenario des Pre-Caching ist interessant. Aber ich vermute, dass wenn sich viele Websites mit SO keine Sorgen machen, sollten Sie sich auch keine Sorgen machen.

Oder könnte der Link in Javascript implementiert sein?

Bearbeiten: Soweit ich weiß, sollte ein GET technisch für schreibgeschützte Anforderungen sein, die den Anwendungsstatus nicht ändern. Ein POST sollte für Schreib-/Bearbeitungsanforderungen sein, die den Status ändern. Andere Anwendungsprobleme ziehen GET jedoch bei einigen Zustandsänderungsanforderungen möglicherweise POST vor, und ich glaube, es liegt kein Problem damit vor.

1
Richard H