(TIL) 로그인/회원가입 암호화

SooHyung Kim·2020년 5월 3일
0

django

목록 보기
5/5

암호화 및 토큰 관련 함수 import

  • 암호화를 위한 bcrypt와 토큰 발행을 위한 jwt를 import

import json
import bcrypt
import jwt

비밀번호 암호화

  • 입력받은 비밀번호를 해쉬 함수로 전환하기 위해 bcrypt.hashpw 진행

    • 입력된 패스워드를 이진화하고 Salting 시행

    • 데이터베이스에는 이진화된 해쉬 비밀번호를 디코딩하여 저장

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

from .models import User

class UserView(View):
    def post(self, request):
        data = json.loads(request.body)
        try:
            if User.objects.filter(user_id = data['user_id']).exists() :
                return JsonResponse({"message" : "USER_ALREADY_EXIST"}, status = 401)
            hashed_password = bcrypt.hashpw(data['password'].encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
            User(
                user_id     = data['user_id'],
                email       = data['email'],
                password    = hashed_password
            ).save()
            return HttpResponse(status = 200)
        except KeyError:
            return JsonResponse({'message' : "INVALID_KEYS"}, status = 400)

로그인 시 토큰 발행

  • 로그인 시 입력된 패스워드와 데이터베이스 내에 저장된 패스워드를 bcrypt.checkpw를 통해 비교 실시

    • checkpw의 로직에 이미 데이터베이스 내 해쉬화된 비밀번호와 현재 비밀번호를 비교하는 로직이 담겨있어 현재 입력된 비밀번호를 굳이 해쉬화하지 않아도 비교가 가능함
  • 비교한 두 값이 일치할 경우 payload, secret key, algorithm을 입력하여 JsonResponse로 토큰을 발행

class LoginView(View):
    def post(self, request):
        data = json.loads(request.body)
        try:
            if User.objects.filter(user_id = data['user_id']).exists() :
                user = User.objects.get(user_id = data['user_id'])
                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)
                return HttpResponse(status=401)
            return HttpResponse(status=401)
        except KeyError:
            return JsonResponse({'message' : "INVALID_KEYS"}, status = 400)
            
profile
Slow and steady win the race

0개의 댓글