이번에는 Instagram Sign In View를 만들고 복습할 겸 적어보려고 합니다!
아직 많이 배우지 않은 상태로 SSL과 관계 없이 GET과 POST 둘 중 하나를 선택해야 하는 상황에서 정리 해봤습니다!
사실 처음 Log In 구현 시 GET을 사용하면 될 것 같은데 POST를 왜 사용해야 하는지 정확히는 알지 못했다!
GET을 사용해도 어짜피 정보 자체는 보내줄 수 있고 로그인 시 토큰은 받을 수 있으니 되는 것 아닌가? 라는 생각을 하다가 일단 남들이 하니까 POST를 사용하긴 했는데 이유가 궁금해서 찾아보게 됐다
GET은 POST보다 약간 덜 안전함
GET을 사용하려면 Client의 데이터를 URL에 넣어서 보내게 됨
ex) www.httplearn.com?email=getorpost@hl.com&password=q1w2e3r4t5
Parameter들이 URL의 일부분이기 때문에 결국 Browser History에서도 내용을 확인 가능함
위 내용 말고도 정말 여러가지 내용들이 있는데 현재 필요한 정보들만 정리 해 봤습니다!
추가 정보 링크 >
링크1
링크2
Sign up View를 구현하는 것보단 쉬웠던 것 같습니다!
class SigninView(View):
def post(self, request):
data = json.loads(request.body)
try:
user = User.objects.get(email=data['email'])
if bcrypt.checkpw(
data['password'].encode('utf-8'),
user.password.encode('utf-8')
):
encoded_jwt = jwt.encode(
{
'user_id' : user.pk,
'exp' :
timezone.localtime() + timezone.timedelta(days=3)
},
SECRET_KEY,
algorithm='HS256'
)
return JsonResponse({'MESSAGE':'SUCCESS', 'ACCESS_TOKEN':encoded_jwt}, status=200)
return JsonResponse({'MESSAGE':'INVALID_USER'}, status=401)
except MultipleObjectsReturned:
return JsonResponse({'MESSAGE':'INVALID_USER'}, status=401)
except User.DoesNotExist:
return JsonResponse({'MESSAGE':'INVALID_USER'}, status=401)
except KeyError:
return JsonResponse({'MESSAGE':'KEY_ERROR'}, status=400)
✅ bcrypt
를 사용하여 Password
유효성 체크
✅ Email
과 Password
로 로그인
✅ JWT
를 사용하여 사용자 토큰 생성
✅ 로그인 성공 시 200 SUCCESS
✅ 로그인 실패 시 각종 오류 메세지 Return
Password
와 암호화 되어 DB에 저장되어있는 Password
를 bcrypt
로 비교SUCCESS
와 JWT
토큰 ReturnPassword
가 맞지 않으면 401 Return저번 포스팅에 작성한 것처럼 Password
에 decode
를 따로 하지 않고 넣으면 안된다는 것을 Sign in 과정 진행중에 확인해서 수정하게 됐다!
JWT Token
에 만료시간을 추가하여 시간이 지나면 토큰이 만료되게 설정했다!
모든 통신은
postman
으로 진행했습니다!
정상적으로 토큰이 반환된 것을 확인할 수 있다!
키가 문제있을 때
KEY ERROR
Return
Password
가 잘못 입력 시INVALID USER
Return
Sign up view를 작성할 때 보단 좀 더 가벼워서 좋았지만 이 부분은 직접적으로 토큰을 받고 그 토큰으로 인가 받고 여러 가지를 할 수 있기 때문에 정말 보안상으로 중요한 부분이라서 예외처리 및 다른 문제가 발생하지 않게 신경써서 해야하는 부분이다!
내가 만들어서 그런지 되게 허술할 것 같은데 현업에서는 이런것을 어떻게 처리하는지 너무 궁금하다... 부족한 부분들이 어떤 것이 있을 지 생각을 좀 더 해봐야겠다!
다음은 게시물 작성하는 부분 포스팅 예정✍🏻
⛔문제 있는 부분은 언제든지 댓글로 FEEDBACK 부탁드립니다!