web-dev-qa-db-ja.com

ログイン(認証)リクエストにはどの方法を使用すればよいですか?

ログイン要求を行うときに使用するhttpメソッドを知りたいのですが、なぜですか?このリクエストはサーバー上にオブジェクト(ユーザーセッション)を作成するため、POSTである必要があると思いますが、どう思いますか?しかし、ログインリクエストはべき等である必要があるため、PUTで​​ある可能性があります。

ログアウトリクエストにも同じ質問がありますが、DELETEメソッドを使用する必要がありますか?

72
greg0ire

ログイン要求がユーザー名とパスワードを提供するユーザーを介している場合は、POSTが望ましいです。詳細はURLではなくHTTPメッセージの本文で送信されます。 https経由で暗号化する場合を除き、テキスト。

HTTP DELETEメソッドは、サーバー上の何かを削除する要求です。メモリ内のユーザーセッションを削除することは、実際には意図していることではないと思います。さらに、ユーザーレコード自体を削除するためです。したがって、潜在的なログアウトは単にGETになります。 www.yoursite.com/logout。

52
planetjones

LOGIN&LOGOUTメソッドを基本的なCRUD操作CREATE&DELETEに変換できると思います。 SESSIONと呼ばれる新しいリソースを作成し、ログアウト時にそれを破棄しているため:

  1. POST/login-セッションを作成します
  2. DELETE/logout-セッションを破棄します

IMGタグまたはそのようなIMGタグが存在するWebサイトへのリンクを含むメールを送信するだけで誰でも攻撃を仕掛けることができるため、GETとしてログアウトすることはありません。 (<img src="youtsite.com/logout" />

追伸長い間、どのようにRESTfulログイン/ログアウトを作成するのか疑問に思っていましたが、それは本当に簡単だとわかりました、あなたは私が説明したようにそれを行います:use/ session /CREATEおよびDELETEメソッドを使用したエンドポイントで問題ありません。また、何らかの方法でセッションを更新する場合は、UPDATEを使用できます...

28
Vytautas Butkus

ここでは、RESTガイドと推奨事項に基づいた私のソリューションです:

[〜#〜] login [〜#〜]-リソースを作成する

要求:

POST => https://example.com/sessions/

BODY => {'login': '[email protected]', 'password': '123456'}

応答:

http status code 201 (Created)

{'token': '761b69db-ace4-49cd-84cb-4550be231e8f'}

[〜#〜] logout [〜#〜]-リソースを削除する

要求:

DELETE => https://example.com/sessions/761b69db-ace4-49cd-84cb-4550be231e8f/

応答:

http status code 204 (No Content)
5
Ali Mamedov

ログアウト方法について:

Spring(Java Framework)のドキュメントでは、POSTリクエストが推奨されています。GETによりCSRFに対して脆弱になり、ユーザーがログアウトされる可能性があるためです。

CSRFを追加すると、LogoutFilterが更新され、HTTP POSTのみが使用されます。これにより、ログアウトにCSRFトークンが必要になり、悪意のあるユーザーがユーザーを強制的にログアウトできなくなります。

参照: https://docs.spring.io/spring-security/site/docs/current/reference/html/web-app-security.html#csrf-logout

ログインにもPOSTを使用する必要があります(本体は暗号化できます。他の回答を参照してください)。

2
DrunkenPope

ログインリクエストには、POSTメソッドを使用する必要があります。ログインデータはセキュリティで保護されているため、セキュリティが必要です。使用すると、POSTメソッドしかし、GETメソッドでは、データがサーバーに送信され、その後に、すべての人に表示されるurlリクエストを伴うappendのようなurlが続きます。

したがって、安全な認証および承認プロセスのために、POSTメソッドを使用する必要があります。

このソリューションがお役に立てば幸いです。

ありがとう

0
Aman Goyal