웹 사이트에 게시판에서 게시물을 등록하거나 댓글을 다는 등의 기능을 이용하려고 할 때는 대부분 로그인을 해야만 이용할 수 있습니다.
그런데 현재 댓글이나 게시물을 작성하는 사람이 로그인한 유저인지 확인하려면 그 전에 토큰을 확인해야 합니다.
로그인한 유저에게 고유한 토큰을 발급해주고 이를 이용해서 해당 유저인지 식별이 가능합니다.
유저는 발급받은 토큰을 가지고 마치 놀이공원의 입장권 혹은 자유이용권처럼 해당 사이트에서의 기능들을 이용할 수 있습니다.
그렇지만 토큰을 인증해야 이용할 수 있는 기능들은 상당히 많고 그 때마다 확인 과정을 거쳐야하기 때문에 데코레이터로 인증과정을 만들어 놓고 사용합니다.
데코레이터를 간략하게 설명하자면 '함수를 받아 명령을 추가한 뒤 이를 다시 함수의 형태로 반환하는 함수'입니다.
함수 내부를 수정하지 않고 기능에 변화를 주고 싶을 때 사용합니다.
일반적으로 함수의 전처리나 후처리에 대한 필요가 있을 때 사용을 합니다.
또한, 반복을 줄이고 메소드나 함수의 책임을 확장합니다.
로그인 이후 댓글 등록, 게시물 등록, 장바구니 이용 등등 이용할 때 마다 확인 과정을 거쳐야 하는 상황에서는 딱 알맞게 이용할 수 있습니다.
def access_decorator(func):
def wrapper(self, request, *args, **kwargs):
try:
access_token = request.headers.get('Authorization', None)
payload = jwt.decode(access_token, SECRET, algorithm='HS256')
user = User.objects.get(user_id = payload['user_id'])
request.user = user
except jwt.exceptions.DecodeError:
return JsonResponse({'message' : 'INVALID_TOKEN' }, status=400)
except Account.DoesNotExist:
return JsonResponse({'message' : 'INVALID_USER'}, status=400)
return func(self, request, *args, **kwargs)
return wrapper
기존에 API를 만들 때는 request.body 에서 받은 key, value 값들을 이용했지만 토큰은 HTTP Request의 헤더에 있기 때문에 request.headers 에서 토큰을 받아옵니다.
그 다음 토큰을 다시 디코딩해서 어떤 유저였는지 확인합니다.
그리고 토큰이 맞지 않거나 존재하지 않는 유저에 대해서는 예외처리를 해줍니다.
class ViewShopppingBasket(View): # 장바구니 조회
@access_decorator
def get(self, request):
...
인증 여부를 확인하고 싶은 메소드위에 @decorator_name
을 작성합니다.
'get' 메소드가 실행되기 전에 로그인 인증 여부를 확인합니다.
post man이용
로그인 할 때 받았던 토큰을 Headrs에 적용시키고 API를 호출합니다.
인증에 성공하면 장바구니 리스트를 return합니다.
토큰이 유효하지 않았을 때는 예외처리 했던 부분이 실행됩니다.