본문 바로가기
wecode/TIL 정리

위코드 Foundation - Bcrypt, JWT 테스트

by 왕거 2020. 8. 12.

Bcrypt

  • 현재 진행 중인 파이썬 장고 기반의 백엔드 서버 개발에서 사용하기로 결정한 함수
  • pip를 사용해서 설치를 진행했다.  -> Conda 환경에서 뭔가 에러가 나는데 뭐가 문제인지는 추후 알아볼 것
    • ex) pip3 install bcrypt
# bcrypt_test.py

import bcrypt		#모듈 임포트

password = 'password1234'
hash_pw = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())	# 해시 진행

input_pw = 'password1234'
wrong_pw = 'password123'

if bcrypt.checkpw(input_pw.encode('utf-8'), hash_pw):	# checkpw는 bcrypt에서 지원하는 비교용 메소드 일치하면 True, 불일치하면 False 반환
	print('CHECK')
else:
	print('FAIL')
    
if bcrypt.checkpw(wrong_pw.encode('utf-8'), hash_pw):
	print('CHECK')
else:
	print('FAIL')

bcrypt_test.py 실행 결과

 

JWT

  • 로그인 성공 시 클라이언트로 전달할 Access Token 발행을 위한 방법
  • pip를 사용해서 설치를 진행함
    • ex) pip3 install pyjwt
# jwt_test.py

import jwt		# jwt 모듈 임포트

token = jwt.encode({'user_id' : 1}, 'Salt', algorithm = 'HS256')	# 토큰 발행을 위해서 필요한 인자들 1.암호화할 평문, 2.함께 포함시켜 해시를 진행할 임의의 데이터, 3.사용할 알고리즘

print(token)

decrypt = jwt.decode(token, 'Salt', algorithm = 'HS256')	# 올바른 복호화 과정을 위해서는 주어진 토큰을 생성한 것과 같은 Salt(해싱시 포함된 임의의 데이터)와 알고리즘을 사용해서 복호화해야 성공 가능

print(decrypt)

fail = jwt.decode(token, 'Wrong', algorithm = 'HS256')		# 실패할 때에는 어떻게 동작하는지 확인 위한 테스트

print(fail)

jwt_test.py 실행 결과

  • 실행 결과 분석
    • 첫번째 출력문은 발행된 토큰을 의미한다.
      • bytes 타입이며 장고에서 JsonResponse를 사용해서 클라이언트로 전달하려면 utf-8 포맷으로 디코딩을 진행해야 한다.
    • 두번째 출력문은 발행된 토큰을 동일한 Salt값과 알고리즘을 사용하여 복호화했을 때의 결과를 출력한 것
    • 세번째부터는 일부러 토큰 생성에 사용된 Salt값이 아닌 데이터를 사용해 복호화를 시도한 것
      • InvalidSignatureError Exception이 발생한다.
        • try - exception 문으로 핸들링 가능할 것 같다.
      • HS256이 아닌 RS256을 사용해서 복호화를 진행해봤는데 이럴 때에는 복호화가 제대로 진행됐다.
        • 왜 되는지 모르겠다. 알고리즘이 다르면 실패해야 하는 게 정상 동작이라고 생각하는데 좀 더 알아봐야 함