새 프로젝트 인증 환경 구성 중에 내가 당연히 로그인에서 POST 매서드를 사용하고 있는 것을 발견했다.
: 내가 쓸 때에는 DB에 새로운 데이터를 추가할 때 주로 사용했다
: 주로 DB에 있는 데이터를 읽어 올 때 사용했다.
로그인/로그아웃 은 어떨까? 로그인과 로그 아웃이 멱등성을 보장받나? 아닌가? 서버의 상태가 달라지나? 아닌가? 궁금해졌다.
로그인을 하려면 사용자의 ID/Password 를 입력해야 한다. GET 요청의 경우 그것을 쿼리스트링으로 처리하기 때문에, 다음과 같은 형식이 될 것이다
http://localhost:8080/login?username=testuser&password=testpassword
딱 봐도 뭔가 이상하다. url에 저렇게 비밀번호를 다 넣어버린다구?
더불어 위와 같이 사용되면 브라우저나 캐싱에 의해서 기록 될 수 있으므로...
보안이 매우 취약해진다.
이 부분이 내가 가장 크게 혼동한 부분이다.
나의 생각
아! 디비에 뭔가 저장되면 POST
아니면 GET!
위와 같이 DB 와 연관되어 생각했었다. 하지만 Restful API에서 POST는 개요에서 기술한 대로 "서버의" 상태를 변경시키는 행위이며, GET은 "서버의" 상태를 변경시키지 않아야 한다.
따라서 인증 과정처럼 서버의 상태를 변경시키는(일반적으로 세션을 사용하고, 최근에는 JWT를 사용하지만 보안을 위해서 서버의 상태를 변경시키는 경우가 많으므로)은 GET을 쓰면 안된다.
Spring Security 문서에서, GET 매서드의 경우는 CSRF 공격에 취약하기 때문에 POST를 권장한다고 한다.
Restful API 의 의미는 URL과 HTTP Method 만으로도 API 요청의 기능을 알 수 있도록 하는 것이다.
따라서 서버에 사용자를 인증하기 위해 어떤 데이터(아이디, 패스워드)를 사용해서 요청하는 경우는 일반적으로 POST로 봐야한다.
참고 블로그 : https://ssdragon.tistory.com/92