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


93

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

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

답변:


77

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

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


1
로그인 요청과 관련하여 질문에 PUT이 될 수 있다는 내용을 추가했으며 GET에 주저하지 않았습니다. +1 자세한 답변
greg0ire 2011 년

1
ok-PUT은 실제로 서버에서 무언가를 만들고 있다고 생각합니다. 그래서 RESTful 의미에서 새로운 사용자를 만들 때 사용할 수있는 것 같아요. 그리고 사용자는 지정한 URL에 생성되어야합니다. 그러나 http 세션과 같이 실제로 일시적인 경우 POST를 통해 로그인합니다.
planetjones 2011 년

http 세션이 일시적이라는 사실이 당신의 요점을 만든다고 생각합니다. 말씀하신대로하겠습니다. 감사합니다.
greg0ire

16
src 속성이 "www.yoursite.com/logout"인 이미지 태그와 함께 사용자 이메일을 보내면 해당 사용자가 로그 아웃되기 때문에 LOGOUT이 GET이어야한다는 데 동의하지 않습니다.
Vytautas Butkus 2014

2
GET은 의미가 없습니다. 이에 대한 또 다른 입력은 다음에서 찾을 수 있습니다. stackoverflow.com/questions/3521290/logout-get-or-post
thasmo

37

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를 사용할 수도 있습니다.


4
브라우저 콘솔에서 직접 XHR 요청을 실행하는 것과 같이 브라우저에서 바로 사용할 수있는 최신 브라우저 도구를 사용하는 GET 요청만큼 DELETE 요청을 수행하는 것이 거의 쉽습니다. 데이터베이스뿐만 아니라 중요한 의미론에 대해서도 이야기했기 때문에 여전히 찬성했습니다.
trysis

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를 추가하면 HTTP POST 만 사용하도록 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.