ログインリクエストを行うときに使用するhttpメソッドとその理由を知りたいのですが。このリクエストはサーバー上にオブジェクト(ユーザーセッション)を作成するので、POSTである必要があると思いますが、どう思いますか?しかし、ログイン要求はべき等である必要があるため、PUTである可能性がありますね。
ログアウトリクエストについても同じ質問ですが、DELETEメソッドを使用する必要がありますか?
回答:
ログイン要求がユーザー名とパスワードを指定するユーザーを介して行われる場合、詳細はURLではなくHTTPメッセージ本文で送信されるため、POSTをお勧めします。https経由で暗号化していない限り、プレーンテキストで送信されます。
HTTP DELETEメソッドは、サーバー上の何かを削除するための要求です。メモリ内のユーザーセッションを削除することは、実際には意図されたものではないと思います。さらに、ユーザーレコード自体を削除するためのものです。したがって、ログアウトする可能性があるのは、www.yoursite.com / logoutなどの単なるGETです。
LOGIN&LOGOUTメソッドを基本的なCRUD操作CREATE&DELETEに変換できると思います。SESSIONという新しいリソースを作成し、ログアウト時に破棄するため、次のようになります。
IMGタグ付きの電子メールまたはそのようなIMGタグが存在するWebサイトへのリンクを送信するだけで誰もが攻撃を行うことができるという理由だけで、私はGETとしてLOGOUTを実行することは決してありません。(<img src="youtsite.com/logout" />
)
PS長い間、RESTfulログイン/ログアウトをどのように作成するのか疑問に思っていましたが、それは本当に簡単であることがわかりました。説明したとおりに実行します。CREATEメソッドとDELETEメソッドで/ session /エンドポイントを使用すれば問題ありません。何らかの方法でセッションを更新する場合は、UPDATEを使用することもできます...
これが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)
ログアウト方法について:
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も使用する必要があります(本文は暗号化できます。他の回答を参照してください)。
ログインの場合、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}});
}