Backend Auth: Bcrypt & JWT

Seoyul Kim·2020년 4월 15일
0

Django

목록 보기
5/12

Bcrypt

  • 개인정보의 보호를 위해 필수적으로 비밀번호 암호화를 진행해야 한다.
  • 암호화를 위한 Bcrypt 라이브러리를 설치한다.
pip install bcrypt
  • python 인터프리터를 실행한고 라이브러리를 import한다.
import bcrypt
  • bcrypt는 str데이터가 이는 Bytes데이터를 암호화하기 때문에 암호화시 bytes화 해야한다.
>>> a = '1234'
>>> bytes(a, 'utf-8')
b'1234'
>>> a.encode('utf-8')
b'1234'
  • 파이썬에서는 str을 encode하면 bytes(이진화)되고, Bytes를 decode하면 str화 한다.
  • encode, decode시에는 우리가 인식할 수 있는 형태로 변환하기 때문에 'UTF-8' 유니코드 문자 규격을 사용한다.
#bcrypt 라이브러리를 사용하여 패스워드 암호화

password = '1234'
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
print(hashed_password)
b'$2b$12$YFs9rh.1LgJwZuf9ibyjpuLvBoCaGX0MzedFWF2Jo0zU3lMZurZ4a'
  • 암호화된 데이터 타입은 Bytes이다.
type(hashed_password)
<class 'bytes'>
  • 이렇게 암호화된 방식은 단방향 암호화로 복호화 할 수 없도록 하는 방식이다.
# 비밀몬호 확인 작업(bycrypt 지원)

new_password = '1234'
bcrypt.checkpw(new_password.encode('utf-8'),hashed_password)
True
  • 이 메소드에는 입력받은 패스워드와 저장된 암호화된 패스워드의 데이터 타입이 Bytes여야 한다는 규칙이 있다.

JWT

  • 먼저 라이브러리를 설치해 준다.
pip install pyjwt
import jwt #패키지명은 pyjwt이지만 임포트할때의 이름은 jwt이다.

SECRET = 'secret' #원래는 '랜덤한 조합의 키' 

access_token = jwt.encode({'id' : 1}, SECRET, algorithm = 'HS256')
print(access_token)
b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.-xXA0iKB4mVNvWLYFtt2xNiYkFpObF54J9lj2RwduAI'
  • JWT의 결과물도 bytes 타입이며 이렇게 인증을 위한 매개체인 access token을 만든다.
  • 발급된 토큰은 로그인이 성공하면 프론트엔드 엔지니어에게 전달한다.
  • 인증은 통과한 사용자만 접근하려면 토큰을 받아서 다시 우리가 발행한 토근이 맞는지 확인한다.
header = jwt.decode(access_token, SECRET, algorithm = 'HS256')
print(header)
{'id': 1}
  • 우리가 담아 넘기는 header 값을 통해 유저를 식별할 수 있다.
  • 인증하는 코드는 엔드포인트에 데코레이터를 구현하며 보통 user app에 utils.py를 만들어서 작성한다.

0개의 댓글