웹 개발을 하다 보면 401 Unauthorized와 403 Forbidden 에러를 마주할 때가 많습니다. 두 상태 코드 모두 "접근 불가"와 관련된 것처럼 보이지만, 실제 의미는 다릅니다. 이 글에서는 401과 403의 차이점을 명확하게 정리하고, 개발할 때 어떻게 처리하면 좋을지 알아보겠습니다.
401 상태 코드는 클라이언트가 인증되지 않았거나, 잘못된 인증 정보를 제공했을 때 발생합니다.
즉, 서버는 요청을 받았지만 "너 누구야?" 라고 묻는 상황입니다.
예시(JWT 인증)
GET /api/user/profile HTTP/1.1
Host: example.com
Authorization: Bearer invalid_token
응답 (401 Unauthorized)
{
"error": "Unauthorized",
"message": "Invalid or missing token"
}
--> 올바른 Authorization 토큰을 제공하면 해결됩니다.
403 상태 코드는 클라이언트가 인증되었더라도 해당 리소스에 접근할 권한이 없을 때 발생합니다.
즉, 서버는 클라이언트가 누군지는 알지만, 접근할 권한이 없다고 차단하는 것입니다.
예시(권한 부족)
GET /admin/dashboard HTTP/1.1
Host: example.com
Authorization: Bearer valid_user_token
응답 (403 Forbidden)
{
"error": "Forbidden",
"message": "You do not have permission to access this resource"
}
--> 관리자 계정으로 로그인해야 접근할 수 있습니다.

if (response.status === 401) {
alert("로그인이 필요합니다.");
window.location.href = "/login";
}
if (response.status === 403) {
alert("접근 권한이 없습니다.");
}