티스토리 뷰
회원 로그인 구현
이전에 작성한 회원가입 구현에 이어 간단한 회원 로그인을 구현해봤다.
먼저 회원 로그인 구현 시 중요한 점은 로그인 또한 사용자의 정보를 받는 것이기 때문에 보안이 필요하다. 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 |
- Total
- Today
- Yesterday
- 디자인 패턴
- 회원가입
- git공부
- error: failed to push some refs to 'https://github.com/
- Python
- django-environ
- API
- 환경 변수 설정
- 혼자 공부하는 파이썬
- 암호화
- Magazine K
- authenticate()
- Django tutorial
- 커맨드 객체
- 톰캣
- 한글 형태소 분석기
- 배열
- 회원 로그인
- 검색 결과 내 페이지네이션
- 면접을 위한 CS 전공 지식 노트
- Spring
- git
- 웹페이지
- path variable
- python3
- django.contrib.auth
- musma
- django
- git 공부
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |