데코레이터(decorator), token검증

Nicholas·2022년 5월 21일
0

Django

목록 보기
5/14

데코레이터란?

  1. 본래의 기능에서 클래스내 함수를 건드리지않고 확장할때 사용
  2. 한개의기능을 다양한 클래스에서 동일하게 확장해야될때 사용

구조

  1. 별도의 파일을 만들어 확장기능을 정의

    ex)
    토큰 조회를 데코레이터로 만드는이유
    1. 토큰의 조회는 하나의 로직에서만활용하는 것이 아니라 전반적으로 사용한다.
    - 여러페이지에 인가하는 과정에서 토큰조회를 활용한다.

# utils.py
def token_reader(func):
    def wrapper(self, request, *args, **kwargs):
        try:
            token        = request.headers.get('Authorization', None)
            # 1. 프론트의 http요청에서 headers를 조회해서 Authorization의 값을 조회해서 그 객체를 token에 담아라.
            payload      = jwt.decode(token, settings.SECRET_KEY, settings.ALGORITHM)
            # 2. jwt라이브러리를 사용해서 token을 decode를 해서 payload에 넣어라
            user         = User.objects.get(id=payload['user_id'])
            # 3. json형태인 payload에 key로 User DB를 조회해서 value값을 넣어라
            request.user = user
            
            
        except jwt.exceptions.DecodeError:
            return JsonResponse({'message' : 'INVALID_TOKEN' }, status=400)
			# 2번 과정에서 오류가생기면 토큰이 존재하지않다는 의미이므로 오류처리
        except User.DoesNotExist:
            return JsonResponse({'message' : 'INVALID_USER'}, status=400)
			# 3번의 과정에서 오류가생긴다면 User DB에 id값이 존재하지않으므로 오류처리
        return func(self, request, *args, **kwargs)
		    # 모든과정에서 오류가없다면 token_reader메소드에 인자로 넣어라
	 return wrapper
  1. 데코레이터의 함수를 import하여 사용하고자 하는 메소드위에 @데코레이터명을 붙여서 사용한다.
# views.py
class PostingView(View):
    @token_reader
    def post(self, request):
    ...
    ...
    
class CommentsView(View):
    @token_reader
    def post(self, request, posting_id):
    ...
    ...
  • 메소드 위에 데코레이터를 붙여 http요청이 왔을때 post메소드가 실행되기전에 먼저 데코레이터가 실행되도록하여 token검사를 할수 있도록 한다.

결론

  1. 데코레이터을 사용하면서 기존에 views.py 에 정의해둔 로직을 건들지 않고 토큰조회에 대한 로직들을 모든 토큰조회가 필요한 모든 클래스에 각각 정의하는것이 아니라 필요한 클래스에 토큰조회기능을 확장하면서 사용하는것을 데코레이터를 사용한다 라고 말한다.
profile
WEB Developer

0개의 댓글