파이썬 Django(장고) 로그인 엔드 포인트 중 오류[2편]

이정민·2021년 6월 3일
0

Where

python(장고) westagram프로젝트에서 회원가입을 통해서 password를 암호화하고 로그인을 할 때 암호화된 password를 비교하는 과정에서 오류가 생겼다.

What

회원가입에서는 암호화가 잘 되었는데 로그인 과정에서 ValueError: Invalid salt 오류가 떳다.

처음에는 회원가입은 잘 되었으니 로그인쪽에 문제가 있다고 생각했지만 회원가입하는 과정(password를 비교)에서 문제가 있었다.

Why

(첫번째 사진: Databases에 저장되어있는 회원정보)
(주번째 사진: views.py에 있는 UserView(view)회원가입에 관한 코드)
.
.
.

bcrypt는 str데이터가 아닌 Bytes데이터를 암호화하기 때문에 encode를 통해서 password를 Bytes화 시켜주고 암호화 시켜준다.

Bytes된 password를 Datebases에서 확인해보면 앞부분에 b가 있는걸 볼 수 있다.(현재 Bytes 상태다 (첫번째 사진 참고) )

LoginView를 통해서 로그인을 할 때
if not bcrypt.checkpw(password.encode('utf-8'), user.password.encode('utf-8')):
====> 입력된 비밀번호(password.encode)를 Bytes로 암호화 시키고 Databases에 저장된 회원비밀번호(user.password.encode)를 Bytes로 암호화 시켜서 둘이 비교를 해서 맞지 않다면 return문을 통해서 오류를 뱉어내게 만든다.
.
.
.
.

그래서 오류가 생기는 원인은 뭔가 하면......

hash_pw = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()) 에 .decode('utf-8')을 통해 디코딩을 안해줬기 때문이다. (위 사진 참고)
.
.
.
.


decode를 안해줬을 시 databases에서 encode때문에 bytes화된 상태로 저장된 유저password가 다시 또 bytes화 되기 때문에 이중으로 b가 붙게 된다.

How


여기서 우리는 hash_pw = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8') 처럼 뒤에 decode를 해줘야 한다.

profile
안녕하세요.

0개의 댓글