1차 프로젝트인 Rawrow에서 로그인 데코레이터를 구현하면서 이해한 것을 정리하려 한다.
HTTP 통신의 Stateless 특성 때문에, 사용자가 어떤 웹사이트에 회원가입 후 로그인을 한 상태에서 다른 웹페이지로 옮겨다니려면 '인증 토큰'이 필요하다.
문제는 사용자가 로그인이 필요한 웹사이트의 모든 기능(장바구니, 구매...)을 사용할 때마다
(즉, Client가 Request를 보낼때마다) 이 인증 토큰을 같이 보내서 사용자가 로그인한 상태임을 알려줘야 한다. 뿐만 아니라, 자신이 어떤 사용자인지도 알려줘야 한다.
정리하면, 로그인 데코레이터는
(1) 내가 어떤 사용자인지
(2) 그리고 로그인 한 상태인지 토큰을 통해 검증
하기 위해 필요하다.
decorator.py 코드는 Project 폴더에 저장해도 되고, 데코레이터가 필요한 앱 폴더에 저장해도 무방하다.
login_decorator 함수의 목적은 이 함수가 데코레이터 형태로 참조되는 모든 앱(장바구니, 구매..)에서 로그인 상태를 유지하게 해준다.
access_token 값에는 LoginView에서 Client가 header로 받았던 인증토큰 값(Authorization)을 가져오고, payload에는 access_token과 함께 user의 인증을 위해 가져온 userid값(login_user.id)이 decode되어 저장된다.
즉, 정리하면 access_token = 인증 토큰값 / payload = encode 시 사용자 구분을 위해 같이 encoding했던 userid 값이 저장된다.
로그인 데코레이터 함수의 목적은 결국 사용자 인증 외에도 사용자의 정보를 넘겨줘야 한다. 그래서 userid 값을 단서로 User 객체에 받아서, request.user에 user 정보를 넘겨줘야 한다. 여기서는 user의 id인 user.id를 저장했다.
이제 이 Decorator를 사용하는 모든 앱이 사용시 user 정보와 인증 토큰값을 저장한 채로 실행된다.