bcrypt와 PyJWT

Jina·2020년 4월 16일
4

Django

목록 보기
8/11

bcrypt를 이용하여 password 암호화 하기와 PyJWT를 이용하여 토큰 발행하기

이 글을 보기 전에 인증과 인가부터 보고오기

bcrypt

bcrypt는 password를 암호화해줌

bcrypt 설치, 실행

pip install bcrypt

위의 명령어를 이용하여 bcrypt를 설치하고 아래의 명령어를 이용하여 import 해주기

import bcrypt

bcrypt를 이용하여 암호화하기

encode

bcrypt에서 암호화할 때는 str 데이터가 아니라 Bytes 데이터를 이용함
따라서 암호화할 때 암호화 할 내용을 bytes화 해줘야함

python에서 str을 encode하면 bytes(이진화)가 되고 bytes를 decode하면 str이 됨

bytes화 방법 1 : str.encode('utf-8')

아래의 명령어 이용하여 strd을 bytes로 만들 수 있음
encode할 때 우리가 인식할 수 있는 형태로 변환하기 위해 'UTF-8' 유니코드 문자 규격을 사용

password='1234'
password.encode('utf-8') 

# b.1234

bytes화 방법 2 : bytes(str, 'utf-8')

password='1234'
bytes(password, 'utf-8')

# b.1234

bcrypt.hashpw를 이용하여 암호화 하기

사용방법 : bcrypt.hashpw(encode_password, bcrypt.gensalt())

여기서 encode_password 자리에는 encode된 password가 들어가야하며
bcrypt.gensalt()는 Salt를 만들어주는 메서드

아래의 예시와 같이 사용

import bcrypt

password='1234'
encode_password=password.encode('utf-8')  # bytes화 하기
bcrypt.hashpw(encode_password,bcrypt.gensalt())

# b'$2b$12$IVkBZbfAw4GC9bDgH6gAeuUQh9o6GbGWh6PLT2TKqf/tLFRIvfz/K'

암호화를 마치고 난 데이터 타입도 bytes

암호 저장하기

비밀번호를 저장할 때 필드의 저장 형식이 str으로 되어있으면 bytes화된 password가 그대로 str으로 저장이 됨
이 경우 나중에 비밀번호를 확인할 때 힘들기 때문에 필드의 저장 형식을 바이너리(bytes 저장)로 지정하거나 암호를 decode해서 저장해주어야함

decode

decode 방법 : bytes.decode('utf-8')

위의 암호화한 password를 hashed_password라고 했을 때

hashed_password=bcrypt.hashpw(encode_password,bcrypt.gensalt())

hashed_password.decode('utf-8')
# '$2b$12$s9IzN9CxPW8WHyLvu70yX.xZUmnPdE1UFokv8ZwKx8Uw7O1c7GRtC'

위와 같이 decode 된 암호를 저장해주기
(또는 password 저장 필드를 바이너리로 지정해주기)

암호 확인하기

웹 이용자가 로그인을 할 때 password를 입력함
입력받은 password와 위에서 저장해 둔 password가 같은지 확인해야 함

bcrypt.checkpw를 이용하여 비밀번호 확인하기

사용방법 : bcrypt.checkpw(입력받은 패스워드, 저장된 암호화 패스워드)

이 때 입력받은 패스워드와, 저장된 암호화 패스워드 둘 다 데이터 타입이 bytes여야 함

위의 암호화 password를 decode해서 저장해주었기때문에 다시 encode해주기

input_password = '1234'
bcrypt.checkpw(input_password.encode('utf-8'),hashed_password)

# True

비밀번호가 같으면 True
비밀번호가 다르면 False


PyJWT

JWT(Json Web Token)구현하게 해줌

PyJWT 설치, 실행

pip install PyJWT

위의 명령어를 이용하여 pyjwt를 설치하고 아래의 명령어를 이용하여 import 해주기

import jwt

토큰 만들기

방법 : jwt.encode(payload, key, algorithm)

payload

payload는 개인을 식별하는 정보 / payload는 암호화 하는 것이 아니라 encode하는 것이므로 개인 정보가 들어가면 안됨

보통 data의 id를 payload로 사용함

key

시크릿 키 / 랜덤한 조합의 키 (유출하면 안됨)
예시 ) django settings.py의 SECRET_KEY

algorithm

보통 algorithm = 'HS256'을 많이 이용함

사용 예시

payload={'user_id':1}
key = 'secretkeyissecret'
token=jwt.encode(payload, key, algorithm='HS256')

위의 방법으로 token을 생성할 수 있음

위에서 생성한 토큰을 프론트엔드에게 전달해주기
전달된 토큰은 인증이 필요할 때 request의 header의 'Authorization'으로 들어옴

토큰 사용하기

request.header의 'Authorization'에서 받은 토큰을 decode해서 payload를 풀어내서 이용자 정보를 사용/확인함

token=jwt.encode(payload, 'secret', algorithm='HS256')

payload=jwt.decode(token, 'secret', algorithm='HS256')

토큰 decoding

보통 app안에 utils.py를 만들어서 토큰을 decode하는 코드를 짜서 사용함
토큰은 여러 곳에서 사용하기 때문에 decode하는 함수를 decorator로 만들어두는 것이 편리함

2개의 댓글

comment-user-thumbnail
2020년 4월 17일

👍👍👍👍👍👍👍👍

답글 달기
comment-user-thumbnail
2020년 4월 18일

많은 도움이 되었습니다

답글 달기