암호화를 위한 라이브러리 Bcrypt를 사용함.
pip install bcrypt
import bcrypth
bcrypt는 str
데이터가 아닌 Bytes
데이터를 암호화한다. 따라서 암호화시에 bytes화 해야합니다. 파이썬에서는 str
을 encode하면 bytes(이진화) 되고, Bytes
를 decode하면 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'
hashed_password
의 타입은 bytes
타입이다. 이렇게 암호화된 것은 복호화할 수 없는 단방향 암호화이다. 비밀번호를 확인하는 작업은 다음과 같이 진행한다.
new_password = '1234'
bcrypt.checkpw(new_password.encode('utf-8'),hashed_password)
# True
이 때 비교할 대상인 두 패스워드는 모두 bytes
타입이어야 한다. django에서 이를 적용시켜 db에 저장하게 되면 기존의 필드타입이 str
타입이어서 bytes
타입으로 저장하면 str
타입으로 저장되어 비교가 불가능해진다. 또한 bytes
타입을 그대로 저장하면 이를 나타내는 b
까지 함께 문자열로 저장되서 불러와서 비교할 때 애를 먹었다. 때문에 나는 저장시에 str
으로 decode해서 저장하고 불러와서 encode하여 비교하였다.
pip install pyjwt
import jwt #패키지명은 pyjwt이지만 임포트할때의 이름은 jwt입니다.
SECRET = 'secret' #'랜덤한 조합의 키' django 프로젝트의 settings.py에 있다.
access_token = jwt.encode({'id' : 1}, SECRET, algorithm = 'HS256')
print(access_token)
# b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MX0.-xXA0iKB4mVNvWLYFtt2xNiYkFpObF54J9lj2RwduAI'
jwt의 결과물 또한 bytes
타입이다. 때문에 로그인 시 발행할 때 JSON형식으로 보내기 위해서 decode 후 보내주었다.
후에 들어온 jwt를 비교하는 것은 다음과 같다.
header = jwt.decode(access_token, SECRET, algorithm = 'HS256')
print(header)
# {'id': 1}
header의 Authorization으로 토큰은 들어오게 되는데 header에서 Authorization Key를 통해 값을 가져온 후 비교한다.