끄적끄적 코딩일지

flask 에서 JWT를 사용한 인증하기 본문

Python

flask 에서 JWT를 사용한 인증하기

BaekGyuHyeon 2022. 5. 12. 10:24

JWT란?

Json Web Token의 약자로써 사용자를 구분하는 Json을 만들고 (보통 로그인한 정보로 생성)

암호화를 한다음 token을 발급하여 사용자에게 전달하면 사용자는 그 정보로 서버에 자신을 인증하는 용도로 쓰인다.

 

시작하기

일단 jwt 모듈을 설치한다.

pip install pyjwt

 

토큰 발급하기

import jwt
import hashlib
from datetime import dateitime,timedelta

SECRET_KEY = 'this is key' # 토큰을 암호화할 key 세팅

@app.route('/signin',methods=['POST'])
def sign_in():
	id = request.form['id']
    pw = request.form['pw']
    
    if id=='맞는 id' and pw == '맞는 pw':
    	# 사용자 정보를 json 형태로 만든다.
        # exp를 설정하여 만료 일자를 설정한다.
        payload = {
         'id': id,
         'pw' : pw,
         'exp': datetime.utcnow() + timedelta(seconds=60 * 60 * 24)
        }
        # 토큰을 발급한다.
        token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
        
        
        # 토큰 리턴하기
        # 최신 버전의 jwt에서는 decode 된 상태로 만들어지지만 옛날 버전의 jwt에서는
        # 바이너리 형태로 리턴한다. 만약 오류가 난다면 
        # token = jwt.encode(payload, SECRET_KEY, algorithm='HS256').decode('utf-8')
        # 으로 시도해 볼것
        return jsonify({'result': 'success', 'token': token})

토큰 인증하기

SECRET_KEY = 'this is key' # 토큰을 발급할때 사용한 키값

@app.route('/')
def index():
	# 발급한 토큰을 쿠키등에 저장해 놓도록 하자
    token = request.cookies.get('token') # 토큰을 저장할때 쓴 키값
	try:
    	payload = jwt.decode(token, SECRECT_KEY, algorithms=['HS256'])
        print(payload['id']) # 로그인한 id 조회
        print(payload['pw']) # 로그인한 pw 조회
        return render_template('index.html')
   	# token이 만료 되었을때
  	except jwt.ExpriedSignatureError:
    	return '로그인이 만료되었습니다. 다시 로그인 해주세요'
    # token이 없을때
    except jwt.exceptions.DecodeError:
    	return '로그인 정보가 없습니다.'

DB랑 접목하면 사용자 로그인을 일정 시간동안 유지하도록 할 수 있고

로그인한 사용자 정보를 쉽게 조회할 수 있다.