Django | WeStagram 5, 6. 회원가입 비밀번호 암호화 및 로그인 JWT 적용

김민호·2021년 9월 30일
0

DJANGO

목록 보기
7/18
post-thumbnail

Bcrypt & JWT

비밀번호를 암호화하는데 있어서 필수적인 개념인 Bcrypt와 로그인시 JWT 발행에 대한 내용은 여기서 공부했었다

암호화 적용 코드 작성

users/views.py 암호화 적용 코드 추가

1.

  • 먼저 암호화하기 위해 필요한 bcrypt와 인가에 필요한 jwt 라이브러리를 설치하고 views.py에서 import해주자
    • pip install bcrypt
    • pip install pyjwt -> 패키지명은 pyjwt이지만 import할 때는 jwt
  • from my_settings import SECRET_KEY, ALGORITHM
    my_settings.py에서 import 해오는 이 두 파일에 대해서 알아보면,
    먼저 두 가지는 모두 JWT 발행 시 필요한 것들이면서 유출되면 안되는 정보이기에 현재 파일에 직접 쓰지 않고 my_settings.py에 변수로 저장하여 그 변수를 import 해온 것

2.

  • 이 부분을 제외한 나머지 코드는 회원가입 코드와 동일하다
  • 여기서부터는 좀 어려웠던 부분이라 좀 더 상세하게 코드 설명을 해봐야겠음

  • 먼저 bcrpyt 라이브러리의 hashpw()라는 메소드는 비밀번호와 salt 이 2가지를 인자로 받아서 암호화된 비밀번호를 생성해준다. 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())이고 이걸 변수에 담아준다. 이게 비밀번호를 해쉬한 것

  • 근데 decode를 하는 이유는? 디코드를 해주지 않으면 DB에 해쉬된 비밀번호가 bytes화 된 상태로 들어가기 때문이다. b가 붙은 상태로 DB에 저장되기 때문에 이것도 같이 비번으로 인식됨

3. 비번 암호화 전체 코드

JWT 코드 작성

users/views.py 토큰 발급(JWT) 코드

1. 기존 로그인 코드 전체

  • 기존의 로그인 코드에서 달라지는 몇 부분이 있다

2.

  • 먼저 로그인하려는 이메일이 기존에 있는 이메일인지 확인하고 아니면 에러메세지와 상태코드를 반환하는 부분은 똑같다
  • 달라지는 부분은 두번째 if문에서 bcrypt.checkpw(A,B) 메소드를 사용한다는 것

    checkpw(password, hashedPassword) : boolean 타입으로 비밀번호와 암호화된 비밀번호를 인자로 받아 같을 경우 true, 다를 경우 false를 반환. 로그인시 패스워드 확인할 때 사용. 인자1 = 사용자가 입력한 패스워드. 인자2 = 해시된 값

  • bcrypt.checkpw(A,B) A와 B를 비교할건데 A에는 데이터로 받은 비번을 인코딩한 값이 오고 B에는 로그인 하려는 email과 같은 인스턴스의 password 키의 값을 인코딩한 값이 온다. not이 붙어있기 때문에 이 둘을 비교해서 다르면 설정해놓은 에러메세지와 상태코드를 반환하고 같으면 다음으로 넘어간다

3.

  • 이제 이메일과 비번이 통과되었기 때문에 로그인이 성공한 것이고 토큰을 발행해주면 된다.
  • jwt.encode({'id' : user.id}, SECRET_KEY, algorithm=ALGORITHM) ✍🏼
  • 로그인에 성공하면 access_token을 발급하고 JsonResponse에 담아서 보낸다

4. 로그인 JWT 적용 전체 코드

통신

1. access_token 발급 성공

2. 이메일이 틀렸을 때

3. 비밀번호가 틀렸을 때

profile
개발자로서의 삶은 https://velog.io/@maxminos 에서 기록하고 있습니다 😀

0개의 댓글