backend django JWT 발행하기

eunji hwang·2020년 4월 14일
7

BACKEND-PYTHON-DJANGO

목록 보기
14/28
post-custom-banner

JWT

이번 포스팅은 백엔드에서 어떻게 JWT를 발행하고 확인하는지 알아보겠다. JWT를 알아보기 앞서 인증 & 인가에 대한 내용을 선행 하도록 하자!

JWT(json web token)는 회원 로그인이 완료 되었을때 발행되는 토큰을 말한다. JWT에는 암호화 된 회원정보가 들어있으며 복호화를 통해 사이트내의 서비스를 사용할 수 있는지 확인(인가 : Authorizationathon)하는데 사용한다.

JWT의 구조


JWT는 헤더(header), 정보(payload), 서명(signature) 구조로 이루어져 있다.

  • header : 타입(JWT)과 알고리즘(BASE64 같은)을 담는다.
  • payload : 보통 유저정보(id같은)와 만료기간이 객체형으로 담긴다.
  • signature : header, payload를 인코딩 한 값을 합친뒤 SECRET_KEY로 해쉬한다.

벨로퍼트 블로그 jwt 포스팅에 잘 정리되어 있네요.


실습

1. PyJWT install & Import

$ pip install PyJWT

파이썬에서 jwt를 위한 라이브러리를 설치해보자. 아래 명령어를 해당 가상환경/프로젝트폴더에 입력한다.

import jwt # 설치는 pyjwt 로 했지만, import는 jwt

2. SECRET_KEY 와 ALGORITHM

# my_settings.py

SECRET_KEY='비밀이얌'
ALGORITHM = 'HS256'

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

SECRET_KEY와 ALGORITHM은 분리된 파일에 보관하여 Import하여 사용한다.
(알고리즘은 선택전, 시크릿키는 필수!)
SECRET_KEY가 담긴 파일은 꼭 .gitignore에 포함하여 git에 업로드 되지 않도록 주의

3. 토큰 만들기

# 파이썬 인터프리터 실행

>>> 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'
  • 유저가 로그인 했을때 입력값이 DB의 회원정보와 일치할때 JWT를 발급한다.
  • 프론트엔드에서는 JWT를 로컬/세션스토리지에 저장
  • 유저가 회원인증이 필요한 서비스에 접근했을때, 프론트는 요청을 보낼때 header, authorization에 토큰값을 담아 보낸다.
  • 백엔드 에서는 받은 토큰값을 복호화 하여 유저정보를 확인
  • DB에서 해당정보가 있는지 확인, 있다면 해당 서비스를 이용할수 있도록 함

4. 토큰 확인하기

# jwt.decode()메서드를 사용해 payload에 들어있는 정보를 확인하자.

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

{'user_id': 1}

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

5. 토큰 발행받기

  • 로그인 엔드포인트로 post요청을 보냈다~ 정상적으로 토큰이 발행 되었다.

데코레이터 ?

유저의 값을 식별하는 코드는 어디에 들어가야 할까?

  • 엔드포인트에 데코레이터를 구현한다.
  • 데코레이터는 user app 디렉토리에 utils.py를 만들어 작성한다.
  • 회원정보를 확인해야 하는 views.py에 데코레이터를 지정한다.
profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!
post-custom-banner

0개의 댓글