비밀번호를 암호화하는데 있어서 필수적인 개념인 Bcrypt와 로그인시 JWT 발행에 대한 내용은 여기서 공부했었다
pip install bcrypt
pip install pyjwt
-> 패키지명은 pyjwt
이지만 import할 때는 jwt
from my_settings import SECRET_KEY, ALGORITHM
hashpw(password, salt)
근데 여기서 비밀번호를 그냥 바로 해싱하려하면 TypeError: Unicode-objects must be encoded before hashing
이런 에러가 뜬다. 유니코드 객체는 해싱전에 인코딩되어야 한다는 것인데, Bcrypt에서 암호화할때는 str형태가 아니라 컴퓨터가 알아들을 수 있는 bytes 데이터로 바뀌어 있어야 한다는 말이다. 코드로 하면 password.encode('utf-8')
이고 이것만 출력해보면 b'password'
이런식으로 str 데이터 앞에 b가 붙어서 생성된다. 그리고 salt는 말 그대로 소금을 치는 것인데 어떻게 치냐? bcrypt 라이브러리의 gensalt()메소드를 사용하면 된다. 이 과정을 다한 코드가 bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
이고 이걸 변수에 담아준다. 이게 비밀번호를 해쉬한 것bcrypt.checkpw(A,B)
메소드를 사용한다는 것
checkpw(password, hashedPassword)
: boolean 타입으로 비밀번호와 암호화된 비밀번호를 인자로 받아 같을 경우 true, 다를 경우 false를 반환. 로그인시 패스워드 확인할 때 사용. 인자1 = 사용자가 입력한 패스워드. 인자2 = 해시된 값
bcrypt.checkpw(A,B)
A와 B를 비교할건데 A에는 데이터로 받은 비번을 인코딩한 값이 오고 B에는 로그인 하려는 email과 같은 인스턴스의 password 키의 값을 인코딩한 값이 온다. not이 붙어있기 때문에 이 둘을 비교해서 다르면 설정해놓은 에러메세지와 상태코드를 반환하고 같으면 다음으로 넘어간다jwt.encode({'id' : user.id}, SECRET_KEY, algorithm=ALGORITHM)
✍🏼