로그인 데코레이터

문성호·2020년 9월 29일
0

로그인 데코레이터란

  • 1차 프로젝트인 Rawrow에서 로그인 데코레이터를 구현하면서 이해한 것을 정리하려 한다.

  • HTTP 통신의 Stateless 특성 때문에, 사용자가 어떤 웹사이트에 회원가입 후 로그인을 한 상태에서 다른 웹페이지로 옮겨다니려면 '인증 토큰'이 필요하다.

  • 문제는 사용자가 로그인이 필요한 웹사이트의 모든 기능(장바구니, 구매...)을 사용할 때마다
    (즉, Client가 Request를 보낼때마다) 이 인증 토큰을 같이 보내서 사용자가 로그인한 상태임을 알려줘야 한다. 뿐만 아니라, 자신이 어떤 사용자인지도 알려줘야 한다.

  • 정리하면, 로그인 데코레이터는
    (1) 내가 어떤 사용자인지
    (2) 그리고 로그인 한 상태인지 토큰을 통해 검증
    하기 위해 필요하다.

Rawrow 프로젝트에서의 활용 예시.

  • Rawrow는 크게 'User', 'Product', 'Cart' 앱으로 이루어져있다.

1) 로그인 후 인증 토큰 발행.

  • User 앱의 Login View다.
  • 로그인을 통해 인증 토큰을 발행한 다음, Request의 Body에는 'userid' : login_user.id 가 딕셔너리 형태로 저장되고, Request.header에는 Authorization : 인증토큰값이 저장된 상태로 Client에 리턴된다.

2) decorator.py

  • 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 정보와 인증 토큰값을 저장한 채로 실행된다.

3) Cart 앱

  • 장바구니를 구현한 Cart 앱의 CartView다. CartView는 POST, GET, PATCH, DELETE 메소드로 구현되었는데, CartView의 모든 Function 앞에는 @login_decorator가 먼저 실행되어 사용자가 누구인지, 사용자가 인증 토큰을 가지고 있는지에 대해 알려준다.
profile
오늘을 모아 내일을

0개의 댓글