이번 포스팅은 백엔드에서 어떻게 JWT를 발행하고 확인하는지 알아보겠다. JWT를 알아보기 앞서 인증 & 인가에 대한 내용을 선행 하도록 하자!
JWT(json web token)는 회원 로그인이 완료 되었을때 발행되는 토큰을 말한다. JWT에는 암호화 된 회원정보가 들어있으며 복호화를 통해 사이트내의 서비스를 사용할 수 있는지 확인(인가 : Authorizationathon)하는데 사용한다.
JWT는 헤더(header), 정보(payload), 서명(signature) 구조로 이루어져 있다.
벨로퍼트 블로그 jwt 포스팅에 잘 정리되어 있네요.
$ pip install PyJWT
파이썬에서 jwt를 위한 라이브러리를 설치해보자. 아래 명령어를 해당 가상환경/프로젝트폴더에 입력한다.
import jwt # 설치는 pyjwt 로 했지만, import는 jwt
# my_settings.py
SECRET_KEY='비밀이얌'
ALGORITHM = 'HS256'
JWT를 사용할때는 SECRET_KEY(절대 공개되면 안되는 값)과 알고리즘이 필요하다.
SECRET_KEY와 ALGORITHM은 분리된 파일에 보관하여 Import하여 사용한다.
(알고리즘은 선택전, 시크릿키는 필수!)
SECRET_KEY가 담긴 파일은 꼭 .gitignore에 포함하여 git에 업로드 되지 않도록 주의
# 파이썬 인터프리터 실행
>>> import jwt
>>> from .my_settings import SECRET_KEY, ALGORITHM # '비밀이얌'과 'HS256'
>>> data = {'user_id':1} #
>>> token = jwt.encode(data, SECRET_KEY, ALGORITHM)
>>> token
b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.ySq_eguKttdtMLWQl-fW09MR6ogZEBFG3ho6EsKK9Xk'
>>> type(token)
<class 'bytes'>
>>> token_str = token.decode('utf-8')
>>> type(token_str)
<class 'str'>
>>> token_str
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.ySq_eguKttdtMLWQl-fW09MR6ogZEBFG3ho6EsKK9Xk'
# jwt.decode()메서드를 사용해 payload에 들어있는 정보를 확인하자.
# SECRET_KEY와 ALGORITHM은 토큰발행했을때와 동일한 값을 넣는다.
>>> payload = jwt.decode(token_str, SECRET_KEY, ALGORITHM)
>>> payload
{'user_id': 1}
payload에 들어있는 정보를 확인했다. {'user_id': 1}
를 이용해 DB의 데이터를 확인한다. 토큰은 회원 로그인시 발급되기 때문에 토큰의 정보가 DB의 목록에서 확인된다면 접근한 서비스를 사용할 수 있게 된다.
유저의 값을 식별하는 코드는 어디에 들어가야 할까?
- 엔드포인트에 데코레이터를 구현한다.
- 데코레이터는 user app 디렉토리에 utils.py를 만들어 작성한다.
- 회원정보를 확인해야 하는 views.py에 데코레이터를 지정한다.