TIL[72].로그인 데코레이터

jake.log·2020년 9월 19일
0

로그인 상태를 계속 유지하려면?


웹페이지 http의 특성에 stateless라는 성질이 있다. 상태가 유지되지 않는다는 뜻이다.

예를 들어 우리가 네이버에 로그인을 했어도, 다시 네이버에 들어가면 로그아웃이 되어있다. http의 stateless 특성으로 인해 네이버에서 로그인을 해도 token이 발행되지 않는다면 이메일 엔드포인트에 접근할 때 로그아웃이 된다.

사용자가 로그인을 하고 token을 발행받아 다른 컨텐츠를 보기 위해 새로운 http request header에 token을 보내면, 이를 통해 회원이라는게 인증이 되어 로그인한 상태로 다른 컨텐츠도 계속 이용할 수 있다.

그런데 header에 보낸 token이 진짜로 우리가 발행한 token일까?

이를 확인하기 위해서 로그인 데코레이터를 만들어 확인해야 한다.


@login decorator


앞서 말한 것 처럼 데코레이터를 통해 token이 유효한 것인지 확인할 수 있다.

데코레이터는 기본적으로 함수 위에서 함수가 실행 되기 전에 먼저 동작한다.

따라서 고객이 로그인을 하고 다른 곳으로 이동하려고 하기전에 그 곳으로 이동할수 있는 권한 즉 token이 있는지 확인하는 역할을 데코레이터가 한다고 보면 된다. 만약 token이 유요하지 않으면 이후 동작은 실행되지 않는다.

import jwt                                                
import json                 
import requests

from django.http import JsonResponse
from django.core.exceptions import ObjectDoesNotExist          

from my_settings import SECRET_KEY                             
from account.models import Account

위와 같이 필요한 모듈들을 import 하고 데코레이터 함수를 짠다.
아래는 데코레이터 함수 예시이다.


def login_decorator(func): 
    def wrapper(self,request, *args, **\kwargs):
        try : 
            token = request.headers.get('Authorization', None)    
            payload = jwt.decode(token, SECRET_KEY, algorithm='HS256')  
            user = Account.objects.get(email=payload['email'])             >    
            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

위와 같은 데코레이터 함수가 생성되면 @login_decorator를 token 인증이 필요한 get, post view 앞에 놓는다. 이렇게 데코레이터 함수를 통해 로그인 token을 확인한 후 로그인을 계속 유지한 채로 다음 함수를 실행할 수 있는 것이다.

profile
꾸준히!

0개의 댓글