20191029 TIL - 1차 프로젝트 2일차, 에러핸들링 / JWT에 exp추가

박경연 (돌진어흥이)·2019년 11월 3일
0
post-custom-banner

1. 에러핸들링

  • Views.py를 설계할 때, 도착하는 http요청에 의해서 발생하는 에러들은 최대한 백엔드 개발자가 의도한 것이어야 하며, 500에러를 최대한 지양하는 방향으로 설계되는 것이 바람직하다.

  • 내가 지금 설계중인 account앱에서의 에러핸들링

    	```python
    	class SignupView(View):

    def post(self, request):
    data = json.loads(request.body)
    emvalidator = re.search('[a-zA-Z0-9._+-]+@[a-zA-Z0-9.-]+(.[a-zA-Z]{2,4})', data["email"])
    ##추후 이메일이 형식에 맞게 판단하기위한 벨리데이터, 자세한 내용은 밑에 설명하겠다.
    try:
    user_data = Account.objects.get(email = data["email"])
    return JsonResponse({"message" : "EMAIL_ALREADY_EXISTS"}, status = 400)
    ##기본적으로 이메일 주소가 DB에서 찾아지면 회원 가입이 불가능하므로 Bad Request Error리턴
    except KeyError:
    return JsonResponse({"message" : "WRONG_KEY"}, status = 400)
    ##프론트에서 키가 잘못넘어왔을 경우를 대비한 키에러 핸들링
    except Account.DoesNotExist:
    ##위의 에러에 걸리지 않았을 경우 이메일 형식과 패스워드 길이가 충족되면 가입
    if not emvalidator :
    return JsonResponse ({"message" : "WRONG_EMAIL_FORMAT"}, status = 400)
    ##이메일 포멧이 맞지않으면 Bad Request Error 리턴
    elif len(data["password"]) < 7:
    return JsonResponse ({"message" : "PASSWORD_TOO_SHORT"}, status = 400)

            	## 패스워드가 6자를 넘지 않으면 Bad Request Error 리턴
          else :
              byted_pw = bytes(data["password"], encoding="utf-8")
              hashed_pw = bcrypt.hashpw(byted_pw, bcrypt.gensalt())
              decoded_pw = hashed_pw.decode("utf-8")
              Account(
                  email = data["email"],
                  password = decoded_pw,
                  ).save()
              return JsonResponse({"message" : "SIGNUP_SUCCESS"}, status = 200)
              ##이 모든 조건에 걸리지 않았을때만 회원가입 가능하도록 함
    
    	```
  • 다만 이 로직에서 걸리는 것은 메인로직?에서 회원가입을 처리하고 그 와중에 예외들이 발생했을 경우 에러 메시지가 리턴되는것이아니라 이런저런 예외를 모두 걸러낸 후 회원가입이 이루어지는식의 코드가 짜여졌다는 점인데, 이부분에 대해서는 리뷰 후에 개선이 이루어지면 포스팅하도록 하겠음.

2. JWT에 exp(만료시각)추가

  • JWT에 만료시각을 추가해주는것은 생각보다 간단하다.
    JWT의 Payloa의 JSON에 exp값만 추가해주면 된다.
    ```python
    payload = {
    "user_id" : user_data.id,
    "exp" : WINFOR_SECRET['exp_time']
    }
    ```
  • 필자는 다른 비공개 세팅파일에서 시간정보를 불러오기때문에 그것을 가져다 썼다.
    	```python
    	from datetime import datetime, timedelta
    	WINFOR_SECRET = {
    'exp_time': datetime.now() + timedelta(seconds = 60 60 24),
    }
    	```
  • 위와같이 발급시각에서 하루가 지나면 토큰이 만료되도록 설정해놓았다.(시크릿 키부분은 지웠음)
  • 만약 JWT가 무리없이 발행되었다면, http://jwt.io에서 자신의 토큰이 유효한지 알아볼 수 있다.

스크린샷, 2019-10-30 11-27-44.png

  • 여기서 주의할점은, VERIFY SIGNATURE부분에 각자가 설정해놓은 시크릿 키를 넣어줘야만 화면 하단에 보이는 Invalid Signature가 Signature Verified로 바뀌며 검증이 끝난다는점.
profile
Back-end Developer, pursuing to be a steadily improving person.
post-custom-banner

0개의 댓글