[login] 로그인 (인증) 요청에는 어떤 방법을 사용해야합니까?

로그인 요청을 할 때 사용해야하는 http 방법을 알고 싶습니다. 그 이유는 무엇입니까? 이 요청은 서버에 객체 (사용자 세션)를 생성하므로 POST 여야한다고 생각합니다. 어떻게 생각하십니까? 그러나 로그인 요청은 멱 등성이 있어야하므로 PUT 일 수 있습니다.

로그 아웃 요청에 대한 동일한 질문입니다. DELETE 메서드를 사용해야합니까?



답변

로그인 요청이 사용자 이름과 암호를 제공하는 사용자를 통해 이루어지는 경우 세부 정보가 URL이 아닌 HTTP 메시지 본문에 전송되므로 POST가 바람직합니다. https를 통해 암호화하지 않는 한 여전히 일반 텍스트로 전송됩니다.

HTTP DELETE 메서드는 서버에서 항목을 삭제하라는 요청입니다. 저는 메모리 내 사용자 세션을 삭제하는 것이 실제로 의도 한 것이라고 생각하지 않습니다. 더 많은 것은 사용자 레코드 자체를 삭제하기위한 것입니다. 따라서 잠재적으로 로그 아웃은 www.yoursite.com/logout과 같은 GET 일 수 있습니다.


답변

LOGIN & LOGOUT 메소드를 기본 CRUD 작업 CREATE & DELETE로 변환 할 수 있다고 생각합니다. SESSION이라는 새 리소스를 생성하고 로그 아웃 할 때 제거하므로 :

  1. POST / login-세션 생성
  2. DELETE / logout-세션 삭제

IMG 태그가있는 이메일이나 IMG 태그가있는 웹 사이트에 대한 링크를 보내는 것만으로도 누구나 공격을 할 수 있기 때문에 GET으로 LOGOUT하지 않습니다. ( <img src="youtsite.com/logout" />)

추신 오랫동안 나는 RESTful 로그인 / 로그 아웃을 어떻게 생성 할 수 있을지 궁금해했는데 정말 간단하다는 것이 밝혀졌습니다. 제가 설명한대로 수행합니다. / session / endpoint를 CREATE 및 DELETE 메서드와 함께 사용하면 괜찮습니다. 세션을 어떤 식 으로든 업데이트하려면 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를 추가하면 HTTP POST 만 사용하도록 LogoutFilter가 업데이트됩니다. 이렇게하면 로그 아웃에 CSRF 토큰이 필요하고 악의적 인 사용자가 사용자를 강제로 로그 아웃 할 수 없습니다.

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

로그인은 POST를 사용해야합니다 (본문은 암호화 될 수 있으며 다른 답변 참조).


답변

로그인 요청에는 POST 방식을 사용해야합니다. 우리의 로그인 데이터는 안전하기 때문에 보안이 필요합니다. POST 방법을 사용하면 데이터가 번들로 서버로 전송됩니다. 그러나 GET 메서드에서 데이터는 모든 사람에게 표시되는 URL 요청과 함께 추가와 같은 URL이 서버로 전송됩니다.

따라서 안전한 인증 및 권한 부여 프로세스를 위해 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}});



     }


답변