로그인은 왜 GET Method 를 안쓸까?

Kim Dong Kyun·2023년 5월 21일
1
post-thumbnail

썸네일 출처

시작

새 프로젝트 인증 환경 구성 중에 내가 당연히 로그인에서 POST 매서드를 사용하고 있는 것을 발견했다.

  • POST 매서드는 서버에 무엇이든 "쓰기" 명령을 내려서 멱등성을 보장하지 않는 (즉 서버의 상태가 변경되는, 여러번의 요청이 다른 결과를 가질 수 있는) 매서드이다.

: 내가 쓸 때에는 DB에 새로운 데이터를 추가할 때 주로 사용했다

  • GET 요청은 서버에 "읽기" 명령을 내려서 멱등성을 보장한다. 서버의 상태는 같다

: 주로 DB에 있는 데이터를 읽어 올 때 사용했다.

로그인/로그아웃 은 어떨까? 로그인과 로그 아웃이 멱등성을 보장받나? 아닌가? 서버의 상태가 달라지나? 아닌가? 궁금해졌다.


1. GET

어떻게 요청할건데?

로그인을 하려면 사용자의 ID/Password 를 입력해야 한다. GET 요청의 경우 그것을 쿼리스트링으로 처리하기 때문에, 다음과 같은 형식이 될 것이다

http://localhost:8080/login?username=testuser&password=testpassword

딱 봐도 뭔가 이상하다. url에 저렇게 비밀번호를 다 넣어버린다구?

더불어 위와 같이 사용되면 브라우저나 캐싱에 의해서 기록 될 수 있으므로...

보안이 매우 취약해진다.

Restful API 관점에서

이 부분이 내가 가장 크게 혼동한 부분이다.

나의 생각

아! 디비에 뭔가 저장되면 POST

아니면 GET!

위와 같이 DB 와 연관되어 생각했었다. 하지만 Restful API에서 POST는 개요에서 기술한 대로 "서버의" 상태를 변경시키는 행위이며, GET은 "서버의" 상태를 변경시키지 않아야 한다.

따라서 인증 과정처럼 서버의 상태를 변경시키는(일반적으로 세션을 사용하고, 최근에는 JWT를 사용하지만 보안을 위해서 서버의 상태를 변경시키는 경우가 많으므로)은 GET을 쓰면 안된다.

CSRF

Spring Security 문서에서, GET 매서드의 경우는 CSRF 공격에 취약하기 때문에 POST를 권장한다고 한다.


2. Post

Restful API

Restful API 의 의미는 URL과 HTTP Method 만으로도 API 요청의 기능을 알 수 있도록 하는 것이다.

따라서 서버에 사용자를 인증하기 위해 어떤 데이터(아이디, 패스워드)를 사용해서 요청하는 경우는 일반적으로 POST로 봐야한다.


참고 블로그 : https://ssdragon.tistory.com/92

0개의 댓글