본문 바로가기

Project Log/RoomieSeoul

RESTful API를 구현하고자 하는 노오력

REST란 Representational State Transfer의 약자로, 자원을 이름(자원의 표현)으로 구분하여 해당 자원의 상태(정보)를 주고 받는 모든 것을 의미한다. 구체적으로 HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)를 명시하고 HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것을 의미한다.

 

나도 이에 맞춰서 RESTful API를 구현하려고 하다보니 애매한 경우가 발생했다. 자원기준으로 URI를 표현하려다보니 자원보다는 액션에 가까운 URI는 어떻게 표현해야하나 라는 고민이 들었다. 예를 들면, 로그인, 회원가입, 로그아웃 같은 경우 아래와 같이 구성했다.

 

로그인: post '/api/auth/local/login'
회원가입: post '/api/auth/local/signup'
로그아웃: get '/api/auth/local/logout'

 

RESTful API를 만들기 위해서는 login, signup, logout이라는 동사를 쓰면 안되고, 유저 resource에 대한 API이기 때문에 URI를 '/user'라던지 알맞는 해당 resource 명사로 바꿔야한다. 로그아웃 할때는 delete '/user'를 해야하나? 했지만 이 api는 회원탈퇴를 위해 아껴놓은건데...

 

검색해보니 stackoverflow에도 비슷한 질문이 올라와있었다.

 

RESTfully design /login or /register resources?

I was designing a web app and then stopped to think about how my api should be designed as a RESTful web service. For now, most of my URI's are generic and might apply to various web apps: GET /...

stackoverflow.com

로그인, 로그아웃 시에는 session자원으로 간주하고 '/session'을 사용하라는 답변도 있지만 REST API는 stateless 특징을 가지고 있기 때문에 session을 쓰지말라는 답변도 있다. 그런데 보안이슈에 의한 authentication에 한해서는 serverside에서 가지고 있어도 되기 때문에 상관 없다는 의견도 대립한다. 으으 갈수록 모르겠드아아앙아아악

 

로컬 회원가입하고 로그인은 auth/local을 쓰려고하는데 문제는 회원가입과 로그인의 method가 겹친다. 쿼리로 보내면 비밀번호가 보이기 때문에 둘다 post로 보내야하는데 그러면 회원가입을 'auth/local/new'로 하고 로그인을 'auth/local'로 해야하나? 아니 'new'도 마음에 안든다고요~~~! 그치만 생각나는 다른 방법이 없는걸...

 

결국 아래 처럼 짓긴 지었다. 로컬이 아닌 다른 sns로 통하는 로그인/회원가입은 api/auth/kakao나 api/auth/naver처럼 만들었다.

 

- 회원가입 : post 'api/auth/local/new'
- 회원가입할 때 이메일, 닉네임 중복체크:
   get 'api/auth/local/property?email=${email}', get 'api/auth/local/property?email=${email}'
- 로그인: post 'api/auth/local'
- 로그아웃: delete 'api/auth/local'

 

찝찝하다...마음에 안든다...