[Westagram] -5

김가람휘·2022년 2월 23일
0

Westagram

목록 보기
5/9

[Mission 5] 회원가입 비밀번호 암호화 적용

1. 암호화 적용

# users/views.py
import json
import bcrypt

from django.http  import JsonResponse
from django.views import View

from users.validation import validate_email, validate_password
from users.models     import User

class SignUpView(View):
    def post(self, request):
        data = json.loads(request.body)
        try:
        	# get으로 데이터를 받아오면 key를 잘못입력해도 빈쿼리를 반환하기 때문에 keyerror가 발생하지 않습니다. 
            # 그리고 get의 두번째 인수에 default를 선언할 수 있습니다.
            username         = data.get('username')
            email            = data.get('email')
            password         = data.get('password')
            contact          = data.get('contact', "")
            hashed_password  = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')

            if validate_email(email) == False:
                return JsonResponse({'message':'INVALID EMAIL'}, status=400) 

            if validate_password(password) == False:
                return JsonResponse({'message':'INVALID PASSWORD'}, status=400) 

            if User.objects.filter(email = email).exists():
                return JsonResponse({'message':'EXISTING USER'}, status=400)
                
            User.objects.create(
                username = username,
                email    = email,
                password = hashed_password, # 암호화된 비밀번호로 DB에 저장
                contact  = contact,
            )
            
            return JsonResponse({'message':'SUCCESS'}, status=201) 
    
        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'},status=400)
hashed_password  = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
  • hashpw : 비밀번호와 salt를 인자로 받아 암호화된 비밀번호를 생성한다.
  • password.encode('utf-8') : 패스워드 문자를 bytes로 인코딩합니다.
    -> bcrypt 인자는 bytes로 입력을 받는다.
  • bcrypt.gensalt() : salt 값을 생성한다.
    -> salt : 해시 함수에서 암호화된 비밀번호를 생성할 때 추가되는 bytes 단위의 임의의 문자열입니다.
  • .decode('utf-8') : hashed_password를 DB에 저장하기 위해 bytes 형식을 문자 형식으로 디코딩합니다.

2. Database 확인


0개의 댓글