로그인을 구현하면서 로그인 실패 경우에 따른 고민이었다. 먼저 로그인을 실패하는 경우는 총 세 가지가 있다.
- 로그인 request 자체가 잘못된 경우 (아이디나 비밀번호를 쓰지 않은 경우 등.. )
- 아이디가 가입 되어있지 않은 경우
- 비밀번호가 틀린 경우
일단 1번의 경우는 400 (BAD_REQUEST)
Status code를 사용해서 응답한다.
2,3번의 경우는 어떻게 할지 좀 찾아봤는데 이에 대해 참고할 만한 곳이 이 두 개 정도 있었다.
1 ) RESTful Login Failure: Return 401 or Custom Response
2 ) 인증 실패시 http status code
나는 처음에 2번과 3번 각 경우에 대해 다 다른 status code를 사용해야 프론트 측에서 구분이 편리할 것이라고 생각했다. 그런데 위 토의 내용 중에서 2,3번 경우를 status code로 구분하는 것은 보안 상 이슈로 옳지 않다는 관점이 있었다. 만약 비밀번호가 틀렸다는 (3번 경우) status code가 따로 제공된다면, 해당 아이디에 대해 지속적으로 로그인을 시도할 수 있기 때문이다. 이런 의견을 보니 웹 사이트들에서 로그인할 때 비밀번호를 틀린 횟수를 카운트 하는 이유가 이런 부분인가 싶었다.
그래서 일단 2,3번 경우를 하나의 status code로 묶는 건 대다수가 인정한 부분이었고, 401 (UNAUTHORIZED)
또는 403 (FORBIDDEN)
을 사용한다는 의견이 있었다. 이에 대해서는 투표자의 절반 이상이 401 (UNAUTHORIZED)
를 사용하는 것이 적절하다고 했다.
The
401 (Unauthorized)
status code indicates that the request has not been applied because it lacks valid authentication credentials for the target resource.
The403 Forbidden
error indicates that the server understands the request but can't provide additional access. This means that the web page you're trying to open in your browser is a resource that you're not allowed to access.
실제 401 status와 403 status의 개념이다. 내가 고민하는 상황에서는 로그인을 실패해서 인증이 없다고 생각하면 401을 적용하는 것이 맞겠다고 판단했다. 그래서 나는 status code로 401 (UNAUTHORIZED)
를 사용했다.
내가 프론트는 모르지만, 아마 2,3번의 경우는 response로 401 status가 왔을 때를 걸러서 error로 전달된 "가입되지 않은 아이디 입니다." 또는 "비밀번호가 틀렸습니다."의 내용을 띄워주는 방식으로 설계되지 않을까 싶다.