[Django] Bcrypt & PyJWT

Minjeong Bak·2021년 11월 7일
0

PYTHON/Django

목록 보기
14/14
post-thumbnail

Bcrypt

설치

pip install bcrypt
  • python 불러오기
import bcrypt

암호화

  • bcrypt는 str데이터가 아닌 bytes데이터를 암호화하기 때문에 암호화를 하기 위해서는 데이터를 bytes화 해야한다.
  • python에서는 strencode 하면 bytes(이진화) 되고, bytesdecode 하면 str화 한다.
  • encode, decode시에는 우리가 인식할 수 있는 형태로 변환하기 위해 'UTF-8' 유니코드 문자 규격을 사용
password = '1234'
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
print(hashed_password)
b'$2b$12$YFs9rh.1LgJwZuf9ibyjpuLvBoCaGX0MzedFWF2Jo0zU3lMZurZ4a'

복호화

new_password = '1234'
bcrypt.checkpw(new_password.encode('utf-8'),hashed_password)
True
  • bcrypt.checkpw()
    입력받은 패스워드, 저장된 암호화된 패스워드 둘 다 데이터 타입이 bytes 여야 함

JWT(JSON Web Token)

설치

pip install pyjwt

python token 발행

import jwt #패키지명은 pyjwt이지만 임포트할때의 이름은 jwt입니다.

SECRET = 'secret' #'랜덤한 조합의 키' 예제이므로 단순하게 'secret'이라고 하겠습니다.

access_token = jwt.encode({'id' : 1}, SECRET, algorithm = 'HS256')
print(access_token)
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.-xXA0iKB4mVNvWLYFtt2xNiYkFpObF54J9lj2RwduAI'
  • jwt의 결과물은 pyjwt의 버전에 따라 bytes(ver. 1.7)타입 또는 str(ver. 2.0 이상)타입

token 확인

header = jwt.decode(access_token, SECRET, algorithm = 'HS256')
print(header)
{'id': 1}
  • decode 결과는 바로 우리가 encode 할 때 넘겼던 header값인 { 'id' : 1}
  • 인증하는 코드는 엔드포인트에 데코레이터를 구현해야 한다.
  • 데코레이터 구현은 보통 user app에 utils.py를 만들어서 작성

Django에 적용하기

hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')

0개의 댓글