HTTP 403 Forbidden
접근 거부: 서버는 요청을 이해했지만 의도적으로 이행을 거부합니다.
HTTP 403의 의미
HTTP 403 Forbidden은 서버가 요청 내용을 이해했지만 거부한다는 의미입니다. 401과 달리 (다시) 인증한다고 해서 해결되지 않습니다 — 이 거부는 신원이 아니라 권한이나 정책에 관한 문제입니다.
원인은 서버의 파일 시스템 권한부터 지역/IP 차단, 요청이 악의적으로 보인다고 판단한 웹 애플리케이션 방화벽까지 다양합니다. 일부 사이트는 리소스의 존재 여부를 숨기기 위해 404 대신 403을 반환하기도 합니다.
403 오류의 일반적인 원인
- 권한 부족: 계정에 해당 역할이 없거나 서버의 파일에 읽기 권한이 없는 경우(chmod/소유자 설정).
- IP 주소, 국가, 사용자 에이전트가 서버, CDN 또는 WAF 규칙에 의해 차단된 경우.
- autoindex가 비활성화된 상태에서 디렉터리 목록을 요청한 경우(폴더에 index.html이 없음).
- 핫링크 방지 기능이 외부 Referer를 가진 요청을 거부하는 경우.
- Cloudflare 등 WAF 챌린지에 실패한 경우 — 자동화된 트래픽에서 흔히 403이 발생합니다.
사용자로서 해결하는 방법
- 실제로 접근 권한이 있는 계정으로 로그인되어 있는지 확인하세요.
- VPN이나 프록시 없이 시도해 보세요 — 사용 중인 출구 IP가 차단되었을 수 있습니다.
- 콘텐츠 소유자라면 재시도하기보다 파일 권한과 .htaccess/WAF 규칙을 확인하세요.
개발자로서 해결하는 방법
- 일반적인 웹 서버 기준으로 파일 소유권과 권한을 확인하세요(예: 파일 644 / 디렉터리 755).
- 거부 규칙을 검토하세요: .htaccess, nginx의 deny 지시어, 보안 플러그인, WAF 관리형 규칙.
- 인덱스 문서가 존재하는지 확인하거나 디렉터리 목록 표시 여부를 의도한 대로 명시적으로 설정하세요.
- API의 경우, 클라이언트가 정책 문제와 인증 실패를 구분할 수 있도록 기계가 읽을 수 있는 이유와 함께 403을 반환하세요.
응답 예시
HTTP/1.1 403 Forbidden
Content-Type: application/json
{"error":"forbidden","reason":"account lacks role: admin"}자주 묻는 질문
403과 401의 차이는 무엇인가요?
401은 인증을 요구하지만, 403은 인증한다고 해서 답이 달라지지 않는다는 뜻입니다 — 그저 허용되지 않은 것입니다.
브라우저는 정상 작동하는데 왜 봇이나 스크립트는 403을 받나요?
WAF나 봇 차단 계층이 브라우저가 아닌 트래픽을 필터링하고 있는 경우입니다. 자신을 올바르게 식별하거나 사이트의 공식 API를 사용하세요.
404 대신 403을 반환할 수도 있나요?
예 — 일부 서버는 인가되지 않은 모든 요청에 대해 일률적으로 403(또는 404)을 반환해 리소스의 존재 여부를 숨깁니다.