[Network] HTTP 응답 코드 401 vs 403

개요

토이프로젝트를 진행하며 REST API 인증에 관련한 코드들을 구현하고 있었고, 여러가지 상황에서 어떤 응답 코드를 반환해야 가장 적절한가에 대한 고민이 들었다.

  • 회원가입, 로그인 → 회원이 아니라면? 비밀번호가 틀렸다면?? 401을 반환해야 하는가? 403을 반환해야 하는가?
  • 토큰이 들어왔을 때, 토큰이 이상하면?, 유효기간이 만료되었으면????

우선 4xx는 클라이언트 오류이기 때문에 클라이언트가 인증을 안했거나, 잘못 했으니까 라고 생각을 해서.. 401과 403을 비교하며 공부하게 되었다.

RFC 2616및 여러 참고 사이트를 통해 공부를 하며 이해한 내용을 간단하게 정리하고자 작성하게 되었다.

401 Unauthorized

Unauthorized 라는 말에서 볼 수 있듯이 401은 “인가” 즉, 권한이 없는 상태이다. 따라서 “인증”을 통해 인가를 획득해야 한다고 알려주는 응답 코드이다. 따라서 서버측에서는 응답에 무조건 WWW-Authenticate 헤더 필드에 어떻게 올바르게 권한을 얻을 수 있는지 포함해야 한다.

만약 클라이언트 요청에 이미 인가가 포함되어 있다면, 해당 인가가 잘못되었음을 뜻한다. 예를 들어, 비밀번호가 틀렸다거나, 토큰이 유효하지 않은 경우를 뜻한다.

403 Forbidden

Forbidden도 단어 자체에서 볼 수 있듯이 금지된, 제한된 것이다. 즉, 서버는 해당 요청을 이해 했지만, 실행을 거부한다는 응답 코드이다. 예를 들어, 무료 회원이, 유료 회원 서비스에는 절대로 접근을 할 수 없는 내용과 유사하다. 혹은, 일반 사용자가 Admin 리소스에 권한 요청을 하거나.

403 코드를 클라이언트가 받았을 때, 권한(Authorization)을 부여하는 것은 전혀 도움이 되지 않는다. 그리고 같은 요청이 반복되서는 안된다.

서버는 403을 반환하기 위해서는 거부의 이유를 엔티티 바디에 기재해서 클라이언트로 보낸다. 만약 이유를 반환하기 싫으면, 404 Not Found로 대체해서 보내는 방안도 있다.

401 vs 403

그렇다면 다시 프로젝트로 돌아와서..

  • 회원가입도 안되어있는 상태 → 인증이 필요하다, 회원가입 후, 로그인 하라고 알려줘야 함 → 401
  • 회원가입은 되어있다. 그러나 로그인이 안되어 있는 상태 → 마찬가지로 인증이 필요하다. 로그인 하라고 알려줘야 함 → 401
  • 회원가입은 되어있다. 비밀번호가 틀렸다 or 토큰이 유효하지 않다. → 너의 credential은 알겠으나 잘못되었다. 올바른 비밀번호 or 올바른 토큰을 달라고 요청해야 한다 → 401
  • 로그인이 되어있다. 그런데 접근 권한이 없다(일반 사용자가 Admin 권한 리소스에 접근하려함) → 403

419 Authentication Timeout

그러면 토큰이 만료 되었을 때는??? 어떻게 해야 할까?

JWT 방식으로 서버를 구현하다보면 Access Token은 자주 만료되도록 설계한다. 따라서 이에 따라 Access Token을 재발급 받으라는 응답 코드가 필요해서 추가된 것으로 보인다. 401과 구분하기 위함인 듯 하다.

419 응답 코드는 RFC 2616에 없다

  • 토큰 유효기간이 지났다 → 토큰 기한 만료 되었다. 419

결론

간단히 요약을 하자면,

  • 401: 아직 인증을 안함, 기회 있음.
  • 403: 인증을 했는데 평생 절대 No, 그니까 요청 똑같이 하지마라.

응답 코드에 대한 큰 그림을 가져가고 세부적인 것은 명세를 살펴보며 그때그때 확고히 해야겠다.

참고자료 링크

  • 401 vs 403?

RESTful Login Failure: Return 401 or Custom Response

  • RFC 2616 - HTTP 1.1

RFC 2616 - (rfc2616)

  • 419 status code

419 status code

태그:

카테고리:

업데이트: