"401 Unauthorized"응답 코드는 요청이 authentication credentials이 없다는 의미를 나타낸다. 즉 인가에 필요한 정보를 제공하지 않았다는 것이다.
"403 Forbidden"은 서버는 request를 이해했지만, 그것을 수행하는 것을 거절한다는 의미다.
서버가 401 코드를 응답할 땐, 클라이언트가 누구인지 인식할 수 없다는 의미를 나타낸다.
이는 인가 과정이 필요한 api에서, 인가가 실패했거나 인가에 필요한 정보가 제공되지 않았음을 나타낸다.
참고로, 401은 인가 정보를 제공하지 않았을 때 뿐아니라, 인가 정보가 incorrect하거나 jwt토큰의 액세스 토큰을 refresh해야 하는 상황에서도 사용 가능하다.
403은 클라이언트가 누구인지는 알지만, 클라이언트가 해당 api를 사용할 권한이 없음을 나타낸다.
admin api에 일반 유저가 접근하는 경우를 생각해볼 수 있다.
403의 경우, 허가(permission)은 항상 로그읺은 했지만 권한이 없는 경우에만 쓴다고 오해할 수 있다. 하지만, 익명 사용자(로그인 하지 않은 사용자)에게도 사용 가능하다. 가령, 오후 6시 이후로 사용 불가한 api에 익명 사용자가 접근할 때 403을 반환할 수 있는 것이다.
또는, 특정 주소에서만 접근 가능한 api가 있다고 해보자. 이때 허용된 ip주소가 아닌 곳에서 요청하면, 로그인 여부와 관계없이 403응답을 내린다.
특정 사이트들은 403 에러를 내리는 대신 404(not found)를 내리기도 한다.
이렇게 하는 이유는 "특정 리소스가 있지만, 접근 권한이 없다"라는 걸 유저에게 알리는 대신, 특저 리소스의 존재 자체를 숨기기 위해서이다.
403을 쓸 땐, 사용자가 권한 부족으로 작업이 금지됐음을 알아야 할 때/사용자가 이 정보로 필요한 권한을 요청할 수 있는 경우이다.
404를 쓸 땐, 리소스의 존재 여부 자체가 보안 위험이 될 경우이다 (비공개 문서, 민감한 api 엔드포인트)
출처
401 vs. 403 Error Codes: What's the Difference? When to Use Each? (Updated 2024)