코딩/🟢 DJANGO

[DJANGO] 인증과 인가(1) : 회원가입 구현하기

개발을 하게 되. 2021. 8. 26. 20:30

웹사이트 관점에서 회원가입이란? 

이렇게 간단한 회원가입에 컴퓨터는 다양한 예외처리를 해야한다...ㅜ

웹사이트 사용자가 아닌 웹사이트 관점에서 회원가입을 생각해보자. 

회원가입이란 간단하게 생각하면 데이터 통신흐름 끝에 데이터베이스에 저장하는 과정을 말한다. 

물론 데이터베이스에 데이터를 집어넣을때 보안을 위해 비밀번호는 암호화하는 작업이 필요하다.

과연 회원가입 구현을 위해선 어떤 로직이 필요하고 어떤 것이 필요할까? 

회원가입을 할때 인스타그램을 생각하면서 어떤 로직이 필요할지 생각해보자 

 

1.  필요한 데이터 틀 만들고, 데이터베이스에 알리기 

1) 우선 어떤 데이터들을 받고 있는지 확인하는 과정이 필요하다 

회원가입을 하기 위해선 휴대폰번호 또는 이메일, 사용자 성, 사용자 이름, 비밀번호가 필요한 것을 알 수 있다. 

제일 중요한건 이메일과 비밀번호이니깐 나머지는 연습을 위해서 다양한 값을 받아보자. 

이러한 데이터틀을 짰다면

westagram 장고프로젝트 - users 앱 - model 에서 작성해서 데이터 틀을 만들자 

from django.db import models

# Create your models here.
class User(models.Model):
    name         = models.CharField(max_length=45)
    phone_number = models.CharField(max_length=45)
    gender       = models.CharField(max_length=45)
    address      = models.CharField(max_length=200)
    birth        = models.DateField()
    email        = models.CharField(max_length=100)
    password     = models.CharField(max_length=150)

2) 이제 이렇게 만든 모델이 만들었다면

makemigration (설계도 만들고) migrate(확정)을 해서 Mysql에 있는 westagram에 연결하자 

 

2. Request 내용 파악과 View 경로 설정 

Client(프론트엔드) 에서 요청(request)의 body가 보내진다.

요청을 처리할 수 있도록 view에 정확히 도착해야하는데 경로설정이 없는 상태이다.

요청경로는 베이스url.py에서 westagram 장고프로젝트 안에 있는 사용자관리를 하기위해 만든 users앱으로 들어올 수 있게 설정하자.

from django.urls import path, include

urlpatterns = [
	path('users',include('users.urls')),
]

 

3. View 로직 처리 (users-views)

1 . 필요한 import 생각하기 

어떤 것이 핵심인지 파악하자 . 

우선 필요한 것이 무엇인지 생각하자.

당연히 요청을 보낼때 json을 사용하니 JsonResponse를 사용하고 

정규표현식으로 데이터를 형식에 맞게 처리하기 위해 정규표현식이 필요하다 

view를 상속받기 위해 import view는 필수

마지막으로 모델에 대한 데이터를 처리하기 위해 모델을 불러오자. 

(나중에 데이터가공을 위해 적절한 import할게 있으면 그때그때 추가하도록 하자) 

import json
import re 

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

from users.models import User

 

2.  로직 생각하기 
1) json data load     2) 조건식으로 데이터 예외처리    3) 데이터 생성 

 

0) 로직생각하기 

회원가입이니 post 메소드를 받자.

올바른 경로로 들어온 request 정보는 { 딕셔너리 } 형태로 들어와 있다. 

이러한 데이터에 대해 조건식을 부여 데이터 형식을 정규표현식으로 잡아두고 형식에 맞지 않은 것은 예외처리를 통해 해결하자

예외처리란 try와 except 구문을 통한 데이터처리를 말한다. 

여기서 중요한 것이 예외처리를 못하게 된다면 서버가 바로 닫히기 때문에 가능한 세세한 예외처리를 하는 것이 중요하다! 

물론 애초에 예외처리가 아닌 get을 통한 예외처리가 있다. (이번 TIL에서는 예외처리만 볼 것이다.) 

이렇게 예외처리가 모두 끝난 데이터는 무사히 데이터 베이스에 데이터를 넣게하자. 

더보기

data.get('user_name')  user_name을 가져와라 없으면 none 처리 -> 서버가 Keyerror가 뜨면서 터지지 않는다. 

data.get('user_name' , '없어요') -> user_name을 가져와라 없으면 '없어요' 처리

class Signup(View):
    def post(self, request):        
        try: 
            data = json.loads(request.body)
            
            name          = data['name']
            phone_number  = data['phone_number']
            gender        = data['gender']
            address       = data['address']
            birth         = data['birth']
            email         = data['email']
            password      = data['password']

            if not re.match('^\d{3}-\d{3,4}-\d{4}$', phone_number):
                return JsonResponse({"MESSAGE": "INVALID_PHONE_NUMBER"}, status=400)

            if not re.match('^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', email):
                return JsonResponse({"MESSAGE": "INVALID_EMAIL"}, status=400)

            if len(password) < 8:
                return JsonResponse({"MESSAGE":"INVALID_PASSWORD"}, status=400)
           
            if User.objects.filter(email = email).exists():
                return JsonResponse({"MESSAGE":"EMAIL_EXIST"})
            
            User.objects.create(
                name          = data['name'],
                phone_number  = data['phone_number'],
                gender        = data['gender'],
                address       = data['address'],
                birth         = data['birth'],
                email         = data['email'],
                password      = data['password']
            return JsonResponse({"MESSAGE":"SUCCESS"}, status=201) 
          
        except KeyError:
            JsonResponse({"MESSAGE":"KEY_ERROR"}, status=400)
            
        except ValueError:
            JsonResponse({"MESSAGE":"VALUE_ERROR"}, status=400)

1) 데이터 json load 

 

2) 예외처리 

(1)  정규표현식을 이용해 데이터 형식을 만들어주고 이에 맞지 않는 형식이 들어올 시 에러와 함께 메세지를 함께 리턴할 수 있도록 했다.

(2)  password 부분에서는  정규표현식을 적용시키지 않고  길이에 대한 제한만 주었다.

(3)  특히 이미 존재하고 있는 이메일에 대한 중복에러를 처리하는 것이 중요하다. 

 

Q . 효율적으로 어떻게 중복에러를 뜨게 할까?

A.  email에 해당하는 것만 필터링하여 불러와서 존재할 시 중복에러를 발생시키자.
이때, 필요한 것이 filter 와 exists() 이다.filter로 이메일에 해당하는 것을 찾고 exists로 지정한 경로에 디렉토리/파일 구분없이 존재하는지를 확인하는 것이다 

웹 어플리케이션이 느려지는 대표적인 이유가 직접 DB에 접근해서 쿼리를 전달하고 받는 과정에서 발생한다고 한다.
이때 for문으로 쿼리셋을 순회까지 하게 되면서 속도가 늦춰져 통신과정에서 불필요한 통신흐름이 발생한다고 한다.
자세한 쿼리셋에 대한 설명은  여기 를 참고해서 살펴보자.

 

(4) status 에는 400과 201 값을 주었다. 

400은 잘못된 문법으로 인하여 서버가 요청하여 이해할 수 없음을 의미
201은 요청이 성공적이었으며 그 결과로 새로운 리소스가 생성되었음을 의미 

대표적인 사이트 에러 있어서 에러에 대한 자세한 글은 참고하자.

(5) KeyError 와 ValueError 의 차이 

KeyError : request.body로 들어오는 데이터이름과 view에서 로드한 데이터 이름이 다를때 생기는 오류 
view.py 에서 이메일에 대한 정보를 받아들일때 선언에서 오타가 나서 email 이 아닌 emil로 되었다면 통신과정에서 오류가 난다.

ValueError : request.body에서 데이터를 받을떄 데이터 값이 허용한 데이터의 범위나 형식 등 데이터가 model 틀과 다를 경우 생기는 오류

 

3) 데이터 생성 

httpie로 데이터를 한번 보내고 MySQL에 담기는 것을 확인하자. 

이때 보내는 데이터 순서도 중요하니 지키면서 보내자. 

 

BIG FAULT!!🔥🔥🔥

이와 같은 데이터에서 가장 큰 문제점이 있다.

바로! 비밀번호가 암호화가 안되었다는 점 bcrypt를 이용한 암호화가 필요하다. 

다음챕터를 통해서 살펴보자. 

 

[DJANGO] 인증과 인가 : 비밀번호 암호화

비밀번호를 그대로 데이터베이스에 저장시 개인정보가 유출되는 문제점이 생긴다. 비밀번호를 암호화과정이 필요한데, 암호화 과정에 앞서서 살펴봐야할 개념이 있다. 바로 인증과 인가 개

gouache-studio.tistory.com