Instagram Sign In

Junyoung Lee·2021년 7월 4일
0

Instagram Clonecoding

목록 보기
2/2

이번에는 Instagram Sign In View를 만들고 복습할 겸 적어보려고 합니다!


Log In시 GET 대신 POST를 사용하는 이유🤔

아직 많이 배우지 않은 상태로 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 in View

Sign up View를 구현하는 것보단 쉬웠던 것 같습니다!

SigninView 코드👇🏻

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 유효성 체크
EmailPassword로 로그인
JWT를 사용하여 사용자 토큰 생성
✅ 로그인 성공 시 200 SUCCESS
✅ 로그인 실패 시 각종 오류 메세지 Return

로그인 프로세스

  1. POST method로 Body에 json 담아서 dict로 변환
  2. 받은 Password와 암호화 되어 DB에 저장되어있는 Passwordbcrypt로 비교
  3. 데이터가 존재하면 SUCCESSJWT토큰 Return
  4. Password가 맞지 않으면 401 Return

구현 중 특이사항

  • 저번 포스팅에 작성한 것처럼 Passworddecode를 따로 하지 않고 넣으면 안된다는 것을 Sign in 과정 진행중에 확인해서 수정하게 됐다!

  • JWT Token에 만료시간을 추가하여 시간이 지나면 토큰이 만료되게 설정했다!


작동 모습🔌

모든 통신은 postman으로 진행했습니다!

정상 로그인 진행 ✅

정상적으로 토큰이 반환된 것을 확인할 수 있다!

오류 발생했을 경우

키가 문제있을 때 KEY ERROR Return

Email이나 Password가 잘못 입력 시 INVALID USER Return


완성 후기💬

Sign up view를 작성할 때 보단 좀 더 가벼워서 좋았지만 이 부분은 직접적으로 토큰을 받고 그 토큰으로 인가 받고 여러 가지를 할 수 있기 때문에 정말 보안상으로 중요한 부분이라서 예외처리 및 다른 문제가 발생하지 않게 신경써서 해야하는 부분이다!

내가 만들어서 그런지 되게 허술할 것 같은데 현업에서는 이런것을 어떻게 처리하는지 너무 궁금하다... 부족한 부분들이 어떤 것이 있을 지 생각을 좀 더 해봐야겠다!

다음은 게시물 작성하는 부분 포스팅 예정✍🏻


⛔문제 있는 부분은 언제든지 댓글로 FEEDBACK 부탁드립니다!

profile
🎹재즈를 사랑하는 백엔드 개발자 이준영입니다🎷

0개의 댓글