web-dev-qa-db-ja.com

ログアウト:GETまたはPOST?

この質問は、一般にGETまたはPOSTをいつ使用するかに関するものではありません; Webアプリケーションからのログアウトを処理するために推奨されるのはどちらかです。一般的な意味でのGETとPOSTの違いに関する多くの情報を見つけましたが、この特定のシナリオに対する明確な答えは見つかりませんでした。

実用主義者として、GETを使用する傾向があります。これは、POSTよりも簡単に実装できるためです。簡単なリンクをドロップするだけで完了です。これは、少なくとも私の頭の上から考えると、私が考えることができるウェブサイトの大多数の場合のようです。 Stack Overflowでさえ、GETを使用したログアウトを処理します。

私がheしているのは、いくつかのWebアクセラレータ/プロキシがページ内にあるすべてのリンクにアクセスして取得することでページを事前キャッシュするため、ユーザーがクリックしたときに応答が速くなるという(とはいえ)議論です。これがまだ当てはまるかどうかはわかりませんが、そうだとすると、理論上、これらのアクセラレータのいずれかを持つユーザーは、彼女のアクセラレータがログアウトを見つけて取得するため、ログインするとすぐにアプリケーションから追い出されますリンクをクリックしていなくてもリンクします。

これまでに読んだすべてのものは、POSTを「破壊的なアクション」に使用し、アプリケーションの内部状態を変更しないアクション(クエリなど)をGETで処理することを推奨しています。 。これに基づいて、ここでの本当の質問は次のとおりです。

アプリケーションからログアウトすると、破壊的なアクションと見なされますか?それはアプリケーションの内部状態を変更しますか?

357
Daniel Liuzzi

POSTを使用します。

2010年には、GETを使用することがおそらく受け入れられる答えでした。しかし、今日(2013年)、ブラウザは、次にアクセスする「と思う」ページをプリフェッチします。

以下は、StackOverflow開発者の1人がTwitterでこの問題について話しているところです。

GETリクエストをログオフしてくれた銀行と、便利なURLプリフェッチのためのChromeチームに感謝します。-Nick Craver( @ Nick_Craver1月29、201

楽しい事実:StackOverflowはGETを介してログアウトを処理するために使用されていましたが、もう使用されていません。

406
David Murdoch

RESTにはセッションがないはずです。したがって、破棄するものはありません。 RESTクライアントは、すべての要求で認証します。ログインまたはログアウトしても、それは単なる幻想です。

あなたが本当に求めているのは、ブラウザがすべてのリクエストで認証情報を送信し続けることです。

おそらく、アプリケーションがログインしているような錯覚を引き起こす場合、javascriptを使用して「ログアウト」できるはずです。往復は必要ありません。


フィールディング論文- セクション5.1.

クライアントからサーバーへの各リクエストには、リクエストを理解するために必要なすべての情報が含まれている必要があり、サーバーに保存されているコンテキストを利用することはできません。したがって、セッション状態は完全にクライアント上に保持されます

39
Darrel Miller

ここでGETが悪用される可能性のある方法の1つは、人(競合他社かもしれません)がインターネット上のsrc="<your logout link>" ANYWHEREで画像タグを配置し、サイトのユーザーがそのページでつまずくと、彼が知らずにログアウトすることです。

36
raveren

正確に言うと、GET/POST(または他の動詞)は何らかのリソース(URLでアドレス指定)に対するアクションです。したがって、一般にアプリケーションの状態ではなく、リソースの状態に関するものです。したがって、本当の精神では、[Host name]\[user name]\sessionなどのURLが必要であり、「DELETE」がログアウトアクションの正しい動詞になります。

[Host name]\bla bla\logoutを実際にRESTフルウェイ(IMO)ではなくURLとして使用しているのに、なぜGET/POSTの正しい使用について議論するのですか?

もちろん、アプリケーションでログアウトURLにGETを使用します:-)

18
VinayC

ログアウトしても、アプリケーション自体には何も実行されません。アプリケーションに関連するユーザーの状態を変更します。この場合、質問は、このアクションを開始するためにユーザーからコマンドを開始する方法に基づいているようです。これは「破壊的なアクション」ではないため、セッションは破棄または破棄されますが、アプリケーションもデータも変更されないため、両方の方法でログアウト手順を開始することは不可能です。投稿は、ユーザーが開始したアクション(たとえば、ユーザーが[ログアウト]をクリックする)で使用する必要がありますが、getはアプリケーションが開始したログアウト用に予約できます)。

14
Joel Etherton

私の観点からこんにちは。ログインするときにユーザー名とパスワードを確認し、一致する場合はログイントークンを作成します。

CREATトークン=>メソッドPOST

ログアウトするとき、トークンを破棄するので、最も論理的な方法はDELETEである必要があります

DELETEトークン=>メソッドDELETE

10
miorey

事前キャッシュのシナリオは興味深いものです。しかし、多くのサイトSOがこのことを気にしないのであれば、多分あなたもそうすべきではないと推測しています。

または、おそらくリンクをjavascriptで実装できますか?

編集:私が理解しているように、技術的には、GETはアプリケーションの状態を変更しない読み取り専用のリクエスト用でなければなりません。 POSTは、状態を変更する書き込み/編集要求用です。ただし、他のアプリケーションの問題は、状態を変更する要求によってはPOSTよりもGETを好む場合があり、これに問題はないと思います。

1
Richard H