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


93

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

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

回答:


77

ログイン要求がユーザー名とパスワードを指定するユーザーを介して行われる場合、詳細はURLではなくHTTPメッセージ本文で送信されるため、POSTをお勧めします。https経由で暗号化していない限り、プレーンテキストで送信されます。

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


1
ログインリクエストに関して、私はそれがPUTである可能性があるという質問に何かを追加しました、私はGETで躊躇しませんでした。詳細な回答のための1
greg0ire

1
わかりました-PUTは本当にサーバー上に何かを作成していると思います。したがって、RESTfulな意味で、新しいユーザーを作成する場合は、これを使用できると思います。また、ユーザーは指定したURLで作成する必要があります。ただし、httpセッションのように一時的なものの場合は、POST経由でログインします。
planetjones 2011年

httpセッションが一時的なものであるという事実があなたの主張だと思います。あなたが言ったように私はするつもりです、ありがとう。
greg0ire 2011年

16
「www.yoursite.com/logout」としてsrc属性を持つ画像タグを使用してユーザーの電子メールを送信するだけでそのユーザーがログアウトするため、LOGOUTをGETにする必要があることに同意しません。
Vytautas Butkus 2014

2
GETはあまり意味がありません。これに関する別の入力はここで見つけることができます:stackoverflow.com/questions/3521290/logout-get-or-post
thasmo 2015

37

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

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

IMGタグ付きの電子メールまたはそのようなIMGタグが存在するWebサイトへのリンクを送信するだけで誰もが攻撃を行うことができるという理由だけで、私はGETとしてLOGOUTを実行することは決してありません。(<img src="youtsite.com/logout" />

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


4
最新のブラウザツールを使用してGETリクエストを実行するのとほぼ同じくらい簡単にDELETEリクエストを実行できます。その一部は、ブラウザコンソールから直接XHRリクエストを発行するなど、ブラウザで直接利用できます。データベースだけでなく、重要なセマンティクスについて話したので、まだ賛成です。
トリシス2016年

6

これがRESTガイドと推奨事項に基づく私の解決策です:

ログイン-リソースを作成する

リクエスト:

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

BODY => {'login': 'login@example.com', '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)

2

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

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

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

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

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


0

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

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

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

ありがとう


0

ログインの場合、POSTを使用します。以下は、ExpressとMongooseでNodejsを使用したLOGINメソッドのコードです。

your router.js
     const express = require("express");
     const router = express.Router();

     router.post("/login", login);

your controller.js
     export.login = async(req, res) => {
         //find the user based on email
         const {email, password} = req.body; 

           try{
                const user =  awaitUser.findOne({email});
                if(user==null) 
                 return res.status(400).json({err : "User with 
                         email doesnot exists.Please signup"});
          }
           catch(error){
                 return res.status(500).json({err : 
                                     error.message});
               }

         //IF EVERYTHING GOES FINE, ASSIGN YOUR TOKEN
          make sure you have JWT installed 
         const token = jwt.sign({_id: user._id}, YOUR_SECRET_KEY);

         res.cookie('t');

         const {_id, name, email} = user;
         return res.json({token, user : {_id, email, name}});



     }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.