회원가입/로그인 서버 구현을 하다 문득 왜 로그인이 Postmapping이지?하는 궁금증이 생겼다. 회원가입은 Post가 당연한데 로그인은 회원가입된 정보를 가져오는 작업아닌가? Get 아닌가? 하는 생각이 들었다. (몇 번 해본 작업이라 늘 '그냥' 했었는데 게슈탈트 붕괴처럼 갑자기 응? 왜지? 싶음)
그래서 간단하게 정리해본다!
로그인 시 아이디와 비밀번호 같은 민감한 정보가 요청 본문(Body)에 포함되는데, POST 방식은 본문을 사용하므로 URL에 정보가 노출되지 않음.
GET 방식은 URL에 데이터를 포함하는 쿼리 스트링을 사용하므로, 브라우저 히스토리나 로그에 아이디/비밀번호가 남을 위험이 있음.
GET은 리소스를 조회할 때 사용하고, 상태를 변경하는 작업은 POST, PUT, DELETE를 사용해야 함.
로그인은 서버에서 세션을 생성하거나 토큰을 발급하는 과정이 포함되므로 리소스의 상태를 변경하는 작업에 해당함 → POST가 적절함
POST 방식은 요청 본문(Body)에 데이터를 담을 수 있어, JSON 형식으로 유연하게 데이터를 보낼 수 있음.
반면, GET은 URL에 데이터를 담아야 해서 길이 제한이 있고, 구조화된 데이터 전송이 어려움.
GET 요청은 기본적으로 브라우저나 중간 캐시 서버에 의해 캐싱될 가능성이 있음.
로그인 요청이 캐싱되면 보안 문제가 발생할 수 있으므로, 일반적으로 캐싱되지 않는 POST 방식을 사용함.
CSRF(Cross-Site Request Forgery) 공격을 방어하기 위해 로그인 요청을 POST로 처리하는 것이 일반적.
GET 방식은 CSRF 공격에 취약할 수 있으며, POST 요청은 CSRF 토큰을 활용하여 보안을 강화할 수 있음.
로그인은 민감한 정보를 다루고, 서버의 상태를 변경하는 작업이므로 @PostMapping을 사용하는 것이 RESTful한 설계 원칙과 보안 측면에서 적절하다.