
아이디와 비밀번호를 확인하는 절차생성(Sign Up)하는 기능,확인(Sign In)하는 기능이 우선적으로 필요회원가입과 로그인으로 인증을 구현access token을 전송request에 access token을 첨부하여 서버에 전송해 매번 로그인하지 않도록함암호화되어서 DB에 저장되어야함고정된 길이의 데이터(Byte열)로 반환시키는 함수'암호화'는 가능하지만, 암호문을 평문으로 바꾸는 '복호화'는 불가능한 암호화단방향 해시 함수(one-way hash function)이라고 함

Rainbow table이라고 함1) Salting
2) Key Stretching
$ pip install bcrypt
import bcrypt
# 평문
password = '12345678'
# 암호화하여 저장
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
# 일치 여부 확인
bcrypt.checkpw('12345678'.encode('utf-8'), hashed_password.encode('utf-8'))
gensalt() : 해시 함수에서 암호화된 비밀번호를 생성할 때 추가 문자열hashpw(password, bcrypt.gensalt()) : 암호화된 비밀번호 생성checkpw(password, hasedpassword) : boolean 타입으로 입력된 값과 암호화된 비밀번호를 비교. 일치할 경우 Ture, 불일치할 경우 False 반환>>> import bcrypt
### password 입력
>>> password = '1234123'
### bcrypt를 이용하여 암호화 (bcrypt.gensalt()는 salt 값을 지정하는 함수)
>>> hased_password = bcrpyt.hashpw(password, bcrypt.gensalt())
:::: 📌 위처럼 평문으로 password값을 지정하면 에러가 뜸

>>> TypeError: Unicode-objects must be encoded berfore hasing
위 에러는 unicode 객체는 반드시 해슁 전에 인코딩하여 넣어야한다는 것을 알려준다.
더 자세히말하면, 현재 password의 타입은 str,
bcrypt를 하기 위해서는 byte 타입으로 만들어(인코딩)줘야함
>> hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
>>> hashed_password
b'$2b$12$XXdgXRMbmhCcXOwfZsc3XuAEGb6OC2ZrmanIrLWf9on6Z1iGHpWAm'
# 암호화 된 password를 DB에 저장하기 좋은 형태로 string으로 다시 decode
>>> hashed_password = hashed_password.decode('utf-8')
>>> hashed_password
'$2b$12$XXdgXRMbmhCcXOwfZsc3XuAEGb6OC2ZrmanIrLWf9on6Z1iGHpWAm'
입력받은 값과 DB에 암호화되어 저장되어 있는 비밀번호가 일치하는지 확인하는 과정
>>> bcrypt.checkpw('1234123'.encode('utf-8'), hashed_password.encode('utf-8'))
True
# 일치하면 Ture, 불일치하면 False 반환
# DB에 저장된 암호화된 비밀번호는 byte 타입이 아니므로, checkpw 함수 또한 encode해줘야함
# 참고로, hased_password에는 이미 Salt 값이 저장되어 있으므로, salt값을 가져오는 과정은 필요 없다.

.encode('utf-8').decode('utf-8')