Django : Westagram #5 / 인증 / 인가 / JWT / Token

Jinsung·2021년 11월 25일
0

JWT (JSON Web Token)

https://jwt.io/

설치

pip install pyjwt

먼저 pyjwt 패키지를 설치합니다.

import jwt

아래 명령어를 해당 가상환경/프로젝트폴더에 입력한다.

# my_settings.py

SECRET_KEY='secret'
ALGORITHM = 'HS256'

JWT를 사용할때는 SECRET_KEY(절대 공개되면 안되는 값)과 알고리즘이 필요하다.

토큰 만들기

user.id = 1

access_token = jwt.encode({'id' : user.id}, SECRET_KEY, algorithm=ALGORITHM)
  • 유저가 로그인 했을때 입력값이 DB의 회원정보와 일치할때 JWT를 발급한다.
  • 프론트엔드에서는 JWT를 로컬/세션스토리지에 저장
  • 유저가 회원인증이 필요한 서비스에 접근했을때 프론트는 요청을 보낼때 header, authorization에 토큰값을 담아 보낸다.
  • 백엔드에서는 받은 토큰값을 복호화 하여 유저정보를 확인
  • DB에서 해당정보가 잇는지 확인, 있다면 해당 서비스를 이용할 수 있도록 한다

토큰 확인하기

# SECRET_KEY와 ALGORITHM은 토큰발행했을때와 동일한 값을 넣는다.
>>> payload = jwt.decode(token_str, SECRET_KEY, ALGORITHM)
>>> payload

{'user_id': 1}
  • pyload에 들어있는 정보를 확인했다. {'user_id' : 1}를 이용해 DB의 데이터를 확인한다. 토큰은 회원로그인시 발급되기 때문에 토큰의 정보가 DB의 목록에서 확인되면 접근한 서비스 사용

효율적으로 사용하기 위해 데코레이터

엔드포인트에 데코레이터를 구현한다.
데코레이터는 user app 디렉토리에 utils.py를 만들어 작성한다.
회원정보를 확인해야 하는 views.py에 데코레이터를 지정한다.

import jwt

from django.http import JsonResponse

from my_settings import SECRET_KEY, ALGORITHM
from .models     import User

def login_decorator(func):
    def wrapper(self, request, *args, **kwargs):
        try:
            access_token = request.headers.get('Authorization', None)
            payload      = jwt.decode(access_token, SECRET_KEY, algorithm=ALGORITHM)
            user         = User.objects.get(email=payload['email'])
            request.user = user

        except jwt.exceptions.DecodeError:
            return JsonResponse({'message' : 'INVALID_TOKEN' }, status=400)

        except User.DoesNotExist:
            return JsonResponse({'message' : 'INVALID_USER'}, status=400)

        return func(self, request, *args, **kwargs)

    return wrapper

0개의 댓글