어떠한 페이지를 이용할 때, 사용자가 회원인지, 비회원인지를 판단하여 컨텐츠를 이용할 수 있도록 해야한다. HTTP의 성질 중에 상태를 저장하지 않는다. 라는 성질 때문에, 우리는 어떠한 컨텐츠를 사용할 때 항상 사용자가 로그인이 이미 되어 있는지, 아닌지를 판단해야 한다. 그렇기에 우리는 데코레이터를 이용하여서, 어떠한 사용자가 회원만 가능한 컨텐츠를 이용할 때 이를 쉽게 판단해 볼 것이다.
데코레이터는 대상 함수를 wrapping히고, 이 함수 앞뒤로 꾸며질 구문에 대하여 손쉽게 재사용할 수 도록 하는 또다른 함수이다.
일단 로그인시에 프론트엔드에게 해당 아이디로 발행한 암호화된 jwt토큰을 전달해주어야 한다.
해당 유저의 정보를 확인하기 위해 HTTP헤더로 부터 토큰을 전달 받는다.
-> 없다면 에러메세지를 프론트에게 전달해준다.
백엔드는 암호화되어 전달받은 jwt 토큰을 decode한다.
-> decode시에 오류가 난다면 해당 웹페이지에서 발행한 토큰이 아니다 이를 프론트에 전달 해준다.
Django models.py에 저장된 데이터와 decode한 데이터가 일치하는 회원의 정보를 변수에 저장한다.
-> 유저의 정보가 없다면 알수 없는 유저라는 메세지를 프론트에게 전달한다.
request할 객체에 user 변수를 저장하여 프론트에게 전달한다.
def login_decorator(func):
def wrapper(self, request, *args, **kwargs):
try:
access_token = request.headers.get('Authorization', None) [1]
payload = jwt.decode(access_token, SECRET_KEY, algorithm='HS256') [2]
user = Account.objects.get(email=payload['email']) [3]
request.user = user [4]
except jwt.exceptions.DecodeError: [5]
return JsonResponse({'message' : 'INVALID_TOKEN' }, status=400)
except Account.DoesNotExist: [6]
return JsonResponse({'message' : 'INVALID_USER'}, status=400)
return func(self, request, *args, **kwargs)
return wrapper