상세내용은 지난 인증/인가 포스팅 참고(인증/인가)
회원가입과 로그인 시에 고객이 입력한 비밀번호는 절대로 유출되면 안되는 핵심요소로 다음과 같은 절차가 필요
위의 내용을 토대로 기존의 로그인/패스워드 뷰를 수정
bctypt는 패스워드 암호화에 특화된 함수로, 암호화를 진행하기 위해 bcrypt를 import
bcrypt.hashpw
현재 입력된 패스워드의 인코딩(이진화) 후 Salting을 하여 Key stretching을 진행
데이터베이스에 저장하기 위해 암호화된 패스워드의 디코딩(이진화 해제)을 진행
import json
hashed_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
bcrypt.checkpw
현재 입력된 패스워드와 데이터베이스에 저장된 패스워드를 서로 인코딩하여 비교
비교값이 True일 경우 access token을 발행
PyJWT
pip install pyJWT
import jwt
jwt.encode(payload, key, algorithm)
payload : 개인을 식별하는 정보로 암호화 되는 것이 아니라 단순히 이진화되는 과정이기 때문에 아이디, 패스워드와 같은 개인정보로 payload를 설정하는 것은 매우 부적절(보통은 id를 지정)
key : 시크릿 키를 지정(settings.py의 SETRET_KEY 등)
algorithm : 현재 주로 사용하는 HS256을 설정하면 무난함
if bcrypt.checkpw(data['password'].encode('utf-8'), user.password.encode('utf-8')):
access_token = jwt.encode({'id' : user.id}, 'secret', algorithm = 'HS256')
return JsonResponse({"access-token" : access_token.decode('utf-8')}, status=200)