티스토리 뷰

회원 로그인 구현

이전에 작성한 회원가입 구현에 이어 간단한 회원 로그인을 구현해봤다.

 

먼저 회원 로그인 구현 시 중요한 점은 로그인 또한 사용자의 정보를 받는 것이기 때문에 보안이 필요하다. POST 방식은 GET방식과 다르게 URL에 붙여서 보내지 않고 HTTP BODY에 정보를 넣어 보내기 때문에 POST 방식으로 만들어야 한다.

 

또한, 중요 사용자의 비밀번호는 암호화해서 db에 저장해야 하는데 이전 포스팅과 이 포스팅에는 적용하지 않았다.

암호화는 이후 공부하며 다시 재 포스팅하는 것으로 ^^...

그리고 마찬가지로 사전에 설치한 HTTPIE를 이용해 서버에 요청을 보내고 그에 따른 작업을 수행하고 요청에 맞는 응답을 보내도록 노력했다...

 

models.py

모델링 조건

→ 이름, 이메일, 비밀번호, 연락처 정보를 클라이언트에게서 받음

→ 이메일 로그인 방식을 사용하기 위해 회원가입 시 입력받은 이메일은 unique 속성 부여하여 중복 저장 방지

→ 비밀번호는 추후 암호화 작업을 하기 위해 max_length 길이를 200자로 변경

→ 데이터 이력 관리를 위해 created_at, updated_at column 추가

# users/models.py

from django.db import models

class StoreUser(models.Model) :
    name         = models.CharField(max_length = 20)
    email        = models.EmailField(max_length = 50, unique = True)
    password     = models.CharField(max_length = 200)
    phone_number = models.CharField(max_length = 50)
    created_at   = models.DateTimeField(auto_now_add = True)
    updated_at   = models.DateTimeField(auto_now = True)
    
    class Meta :
        db_table = 'stores_users'

 

views.py

새로 SignInView 클래스를 만들어 'post' 방식의 로그인 코드를 작성해 보았다. 이렇게 보면 간단하지만 ㅠㅜ 계속 500 코드가 반환돼서 어려웠다.....

 

로그인 조건

→ 클라이언트로부터 회원가입 시 입력받은 이메일, 비밀번호 받음

→ 클라이언트로부터 이메일이나 비밀번호 키가 전달되지 않았을 경우 400 반환

→ 등록된 이메일이 아닌 경우 401 반환

→ 비밀번호 오류인 경우 401 반환

→ 회원 로그인 성공 시 200 반환

# users/views.py

class SignInView(View):
    def post(self, request):
        data = json.loads(request.body)
        try: 
            # StoreUser 테이블에 저장된 이메일 데이터와 일치하지 않는 이메일이라면 401 반환
            if not StoreUser.objects.filter(email=data['email']).exists() :
                return JsonResponse({"message": "INVALID_USER_NOT MATCH"}, status = 401)   
	    # StoreUser 테이블에 저장된 이메일 데이터와 일치하면 내부 if문으로 비밀번호가 일치하는지 확인
            # 패스워드가 일치하지 않으면 else문으로 이동
            if StoreUser.objects.filter(email=data['email']):
                if StoreUser.objects.filter(password = data['password']):
                    return JsonResponse({"message": "SUCCESS"}, status = 200) 
                else:
                    return JsonResponse({"message": "INVALID_USER_password error"}, status = 401) 
	    # 클라이언트에서 받아온 데이터의 키값이 오류 또는 전해지지 않았다면 key error 400 반환
        except KeyError :
            return JsonResponse({"message": "KEY_ERROR"}, status = 400)

 

회원 로그인 성공 시

→ 회원 로그인 성공으로 200 코드 반환

http -v post 127.0.0.1:8000/users/signin email='w@naver.com'  password='000000a!00'
POST /users/signin HTTP/1.1
Accept: application/json, */*;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 50
Content-Type: application/json
Host: 127.0.0.1:8000
User-Agent: HTTPie/3.2.1
{
    "email": "w@naver.com",
    "password": "000000a!00"
}
HTTP/1.1 200 OK
Content-Length: 22
Content-Type: application/json
Cross-Origin-Opener-Policy: same-origin
Date: Sun, 10 Jul 2022 13:55:30 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.8.13
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
{
    "message": "SUCCESS"
}

KEY ERROR 발생 시

 http 서버 요청에 key값 오류 시  key error 400 코드 반환

http -v post 127.0.0.1:8000/users/signin email='w@naver.com'  passwored='000000a!00'
POST /users/signin HTTP/1.1
Accept: application/json, */*;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 51
Content-Type: application/json
Host: 127.0.0.1:8000
User-Agent: HTTPie/3.2.1
{
    "email": "w@naver.com",
    "passwored": "000000a!00"
}
HTTP/1.1 400 Bad Request
Content-Length: 24
Content-Type: application/json
Cross-Origin-Opener-Policy: same-origin
Date: Sun, 10 Jul 2022 13:56:59 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.8.13
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
{
    "message": "KEY_ERROR"
}

 

등록되지 않은 이메일로 로그인 시도 시

→ 미등록 이메일 오류로 401 코드 반환

http -v post 127.0.0.1:8000/users/signin email='wwe@naver.com'  password='000000a!00'
POST /users/signin HTTP/1.1
Accept: application/json, */*;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 52
Content-Type: application/json
Host: 127.0.0.1:8000
User-Agent: HTTPie/3.2.1
{
    "email": "wwe@naver.com",
    "password": "000000a!00"
}
HTTP/1.1 401 Unauthorized
Content-Length: 37
Content-Type: application/json
Cross-Origin-Opener-Policy: same-origin
Date: Sun, 10 Jul 2022 13:57:44 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.8.13
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
{
    "message": "INVALID_USER_NOT MATCH"
}

비밀번호 오류 시

→ 비밀 번호 오류로 401 코드 반환

http -v post 127.0.0.1:8000/users/signin email='w@naver.com'  password='000000a!'
POST /users/signin HTTP/1.1
Accept: application/json, */*;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 48
Content-Type: application/json
Host: 127.0.0.1:8000
User-Agent: HTTPie/3.2.1
{
    "email": "w@naver.com",
    "password": "000000a!"
}
HTTP/1.1 401 Unauthorized
Content-Length: 42
Content-Type: application/json
Cross-Origin-Opener-Policy: same-origin
Date: Sun, 10 Jul 2022 13:59:14 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.8.13
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
{
    "message": "INVALID_USER_password error"
}

'study > Django' 카테고리의 다른 글

Django - JWT 발급  (0) 2022.07.13
Django - 암호화 (bcrypy)  (0) 2022.07.12
Django - 회원가입 구현  (0) 2022.07.10
Django - QuerySet 다루기 (초보)  (0) 2022.07.09
Django - MtoM Field 없이 구현  (0) 2022.07.06
댓글