TIL#58 Bcrypt & PyJWT

Dasom·2020년 9월 8일
0

Django

목록 보기
6/34

오늘은 어제의 인증 & 인가 세션에 이어서 암호화와 토큰에 대해 더 자세히 배웠다.

일단, 인증과 인가는 프론트엔드나 백엔드 한쪽에서 담당하는 것이 아닌 프론트엔드와 백엔드와의 상호작용이다.

$ pip install bcrypt  
$ pip install PyJWT

Bcrypt

# 예시(회원가입시)

import bcrypt

password = '1234'   # str 데이터

# bcrypt 는 Bytes 데이터를 암호화하기 때문에 bytes 형태로 인코딩해준다
encoded_password = password.encode('utf-8')

# 반대로 str데이터로 만들기 위해서는 디코딩한다
decoded_password = encoded_password.decode('utf-8')

# 인코딩된 비밀번호를 암호화한다
hashed_password = bcrypt.hashpw(encoded_password, bcrypt.gensalt())
# or
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())

# 이렇게 해시된 비밀번호는 b'$2b$.......' 의 형태가 된다. 데이터베이스에 저장하기 위해서는
# b'' 부분을 제외해야 하기 때문에 해시된 비밀번호를 디코딩한다
hashed_password_decoded = hashed_password.decode('utf-8')
# 예시(로그인)

import bcrypt

# 입력된 비밀번호와 데이터베이스에 저장된 비밀번호가 일치하는지 확인한다
# 입력된 비밀번호를 인코딩하고 디코딩되었던 해시된 비밀번호를 다시 인코딩해서 비교한다
new_password = '1234'
bcrypt.checkpw(new_password.encode('utf-8'), hashed_password_decoded.encode(‘utf-8))
# 일치하면 True, 일치하지 않으면 False

❗️ bcrypt 는 데이터타입이어야 함

JWT

# 예시

import jwt  # 패키지명은 PyJWT 지만 임포트는 jwt 라는걸 기억하기

SECRET = 'secret'   # '랜덤한 조합의 키' 예제라서 단순화.

# 토큰을 만들어 프론트 엔지니어에게 전달
access_token = jwt.encode({'id': 1}, SECRET, algotithm = 'HS256')

# 토큰을 받았을 때는 다시 디코딩하여 확인한다
header = jwt.decode(access_token, SECRET, algorithm = 'HS256')

# 디코딩을 하게 되면 user의 id값이 나온다. 일치하면 요청에 대한 권한이 있다는 의미
profile
개발자꿈나무🌲

0개의 댓글