bcrypt를 이용하여 password 암호화 하기와 PyJWT를 이용하여 토큰 발행하기
이 글을 보기 전에 인증과 인가부터 보고오기
bcrypt는 password를 암호화해줌
pip install bcrypt
위의 명령어를 이용하여 bcrypt를 설치하고 아래의 명령어를 이용하여 import 해주기
import bcrypt
bcrypt에서 암호화할 때는 str 데이터가 아니라 Bytes 데이터를 이용함
따라서 암호화할 때 암호화 할 내용을 bytes화 해줘야함
python에서 str을 encode하면 bytes(이진화)가 되고 bytes를 decode하면 str이 됨
아래의 명령어 이용하여 strd을 bytes로 만들 수 있음
encode할 때 우리가 인식할 수 있는 형태로 변환하기 위해 'UTF-8' 유니코드 문자 규격을 사용
password='1234'
password.encode('utf-8')
# b.1234
password='1234'
bytes(password, 'utf-8')
# b.1234
여기서 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해서 저장해주어야함
위의 암호화한 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가 같은지 확인해야 함
이 때 입력받은 패스워드와, 저장된 암호화 패스워드 둘 다 데이터 타입이 bytes여야 함
위의 암호화 password를 decode해서 저장해주었기때문에 다시 encode해주기
input_password = '1234'
bcrypt.checkpw(input_password.encode('utf-8'),hashed_password)
# True
비밀번호가 같으면 True
비밀번호가 다르면 False
JWT(Json Web Token)구현하게 해줌
pip install PyJWT
위의 명령어를 이용하여 pyjwt를 설치하고 아래의 명령어를 이용하여 import 해주기
import jwt
payload는 개인을 식별하는 정보 / payload는 암호화 하는 것이 아니라 encode하는 것이므로 개인 정보가 들어가면 안됨
보통 data의 id를 payload로 사용함
시크릿 키 / 랜덤한 조합의 키 (유출하면 안됨)
예시 ) django settings.py의 SECRET_KEY
보통 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')
보통 app안에 utils.py를 만들어서 토큰을 decode하는 코드를 짜서 사용함
토큰은 여러 곳에서 사용하기 때문에 decode하는 함수를 decorator로 만들어두는 것이 편리함
👍👍👍👍👍👍👍👍