[HttpStatus] Forbidden 과 UnAuthorized의 차이점.
Http 프로토콜에는 여러가지 상태값이 존재합니다.
200은 대표적으로 성공적으로 http 통신에 성공했다는 의미이며,
404는 해당 주소를 찾지 못하여 http 통신을 할 수 없다는 의미이고,
500은 서버에서 에러가 발생하여 http 통신은 하였으나 원하는 결과를 얻지 못하였음을 의미할 것입니다.
그 중에서 401(Unauthorized)와 403(Forbidden)의 차이에 대해서는 모호한 점이 있어서 정리하는 겸 공유하고자 합니다.
스프링을 프로젝트를 생성해서 개발을 하다보면 스프링 시큐리티 프로젝트를 통해 인증과 허가에 대한 개념을 배울 것입니다.
로그인을 한 유저가 api를 호출했을 때, 인증 토큰 혹은 세션을 조회하여 허가받은 유저라면 원하는 결과를 얻어서 http 통신에 성공할 것입니다.
이 과정에서 2가지 Case가 갈려질 수 있습니다.
첫번째, 인증토큰 혹은 세션에 인증되지 않은 익명상태(Anonymous)의 유저인 경우
두번째, 인증토큰 혹은 세션에 인증되었지만 호출하는 api에 대한 권한이 없는 경우(주로 비즈니스 로직)
익명상태Anonymous의 유저인 경우
익명상태의 유저인 경우, 특정한 권한이 필요한 API를 호출하는 경우에 익명이기 때문에 Authorization을 요구하는 UnAuthorized 401 상태가 떨어져야 합니다.
간단히 설명하자면 게시판의 게시글을 작성해야하는데, 어떤 유저가 작성했는지를 알기 위해서는 로그인을 해야하는 법이죠. 인증이 되지 않았기 때문에 인증을 요구하는 것입니다.
호출하는 API에 대한 권한이 없는 유저인 경우 (Forbidden) : 403
게시판을 다시 예로 들어 설명하자면, 로그인을 A유저로 하였고, B유저의 게시글을 읽었는데, 내용이 이상해서 B유저의 게시글을 A가 수정하는 경우를 보면 어떨까요..? 매우 어색합니다.
A 유저가 작성한 게시글은 A유저만이 수정할 수 있는 것이 자연스럽고 B도 마찬가지입니다.
그런데 B 유저가 A유저의 게시글 id를 통해서 API를 호출하는 경우에는 Forbidden을 상태로 받게 됩니다. A유저의 게시글이므로 B 유저는 그에대한 권한이 없으므로, 인증은 하였으나(Authorization) 접근권한이 없는 상태입니다.(forbidden)
보통 api 서버를 개발할 때, 이러한 비즈니스에 따라 Forbidden과 UnAuthorized 상태에 대해서 헷갈리실만한 상황이 많으실 것 같아서 간단한 예와 함께 설명으로 포스팅해보았습니다.
감사합니다.