TIL - Bcrypt, JWT

KDG·2020년 6월 20일
0

Bcrypt 사용

  1. pip install bcrypt
    bcrypt 설치

  2. python을 실행하고 import bcrypt를 한다.

  3. 만약 password '1234'라 하면, password를 해싱하기위해선 문자열 '1234'를 encode해서 bytes타입으로 변환시켜줘야 한다.
    ** 반대로 bytes타입을 decode하면 문자열로 변환된다.

password = '1234'
encode_password = password.encode('utf-8')
 # 문자열 '1234'를 bytes타입으로 변경
 
** decoded_password = encoded_password.decode('utf-8')
 # 인코드된 패스워드를 다시 decode하기
  1. 해싱
hashed_password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt() )
 # 인코드된 패스워드를 bcrypt로 해싱하기
  1. bcrypt.checkpw
  • 로그인 엔드포인트를 구현할때 password 비교시 사용
class SignInView(View):
    def post(self, request):
        data = json.loads(request.body)
        if Account.objects.filter(email = data['email']).exists():  
        ## 프론트엔드에게 전달받은 아이디 값이 데이터베이스에 존재하는지 확인하는 과정
           account = Account.objects.get(email = data['email'])
           if bcrypt.checkpw(data['password'].encode('utf-8'), account.password):
            ## 프론트엔드에게 전달받은 패스워드를 인코딩 한 것과 위에서 이메일이 맞으면 그 이메일과 함께 저장된 해싱패스워드를 확인하는 과정

JWT 사용

  • bcrypt는 단방향 해시 알고리즘이라서 salting하고 stretching하면 복호화가 거의 불가능
  • jwt는 복호화하면 payload에 암호화해서 담긴정보를 확인할 수 있음
    사용자가 로그인하면 백엔드 서버가 jwt토큰을 프론트엔드에게 발행
  • 프론트엔드가 API를 요청할 때 header에 access토큰을 넣어서 보내면 백엔드서버는 토큰에 담겨있는 header.payload.signature를 확인해서 인가방법을 제공
  • 로그인시 발행한 jwt 토큰을 사용하면 백엔드 서버에서는 이 토큰정보를 해석하는 데코레이터를 만들어서 인가가 필요한 엔드포인트를 사용할 수 있다.

JWT 생성

  1. pip install pyjwt
    jwt 설치

  2. python을 실행하고 import jwt 입력

token=jwt.encode({'id':account.id}, SECRET_KEY, algorithm='HS256')  
 ## account의 id를 jwt로 인코드하는 과정
return JsonResponse({'token':token.decode('utf-8')}, status=200)
 ## 토큰을 프론트엔드에게 보내줄때는 다시 decode해서 보내준다.

** 여기서 인코드할때 id값이 payload에 담기는데 payload에 password를 담으면 안된다. id값은 숫자로만 되어있고 이 id의 담긴 내용을 확인하기 위해서는 DB에 접속해서 내용을 확인해야 하기 때문에 id를 인코드하는 것이다.

0개의 댓글