HTTPQUERY
한국어

403 Forbidden

사용법

403 Forbidden 오류가 도착하면 클라이언트에게 해당 리소스에 접근할 충분한 권한이 없다는 뜻입니다. 이는 요청이 허용되지 않음을 알리는 흔하고 일반적인 오류입니다. 이 상태는 클라이언트가 다시 인증하고 요청을 재전송해도 오류가 계속된다는 점에서 401 Unauthorized와 다릅니다. 더 구체적인 405 Method Not Allowed 상태는 리소스는 존재하지만 해당 HTTP 메서드가 허용되지 않음을 나타냅니다.

보안적 선택으로서의 403과 404

서버는 리소스가 존재한다는 사실을 숨기기 위해 의도적으로 403 대신 404를 반환하기도 합니다. 403으로 응답하는 것은 리소스가 존재하지만 접근이 제한되었음을 확인해 주는 셈이며, 민감한 경로에서는 바람직하지 않습니다. 403과 404 중 무엇을 고를지는 의도적인 보안 설계 결정입니다.

SEO 영향

Google 같은 검색 엔진은 403 상태를 반환하는 URL을 색인하지 않습니다. 이전에 색인되었다가 이 상태 코드를 반환하는 URL은 검색 결과에서 제거됩니다. 이 코드를 반환하는 페이지는 크롤 예산을 낭비하지 않습니다. Googlebot의 속도를 늦추는 용도로 403을 사용하지 마세요. 크롤링 속도를 줄이는 것은 429뿐입니다.

예시

클라이언트가 보호된 리소스를 요청하고, 서버는 클라이언트에게 접근 권한이 없음을 알리기 위해 403 Forbidden으로 응답합니다. 응답 본문은 그 제한을 설명합니다.

요청

GET /tech-news/confidential.pdf HTTP/1.1
Host: example.com

응답

HTTP/1.1 403 Forbidden
Content-Type: text/html
Content-Length: 154

<html>
  <head>
    <title>Access Denied</title>
  </head>
  <body>
    <p>Permission to access this resource is
    restricted.</p>
  </body>
</html>

해결 방법

403 Forbidden은 서버가 요청을 이해했지만 그 동작을 인가하기를 거부한다는 뜻입니다.

서버의 파일 및 디렉터리 권한을 확인하세요. Linux에서는 ls -la로 소유권과 권한 비트를 확인하세요. 웹 서버 프로세스(보통 www-data나 nginx로 실행)에는 요청된 파일에 대한 읽기 권한이 필요합니다. 표준 권한은 디렉터리 755, 파일 644입니다. 재귀적으로 고치려면 다음과 같이 합니다.

find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/html

nginx는 또한 /부터 제공되는 파일까지 경로상의 모든 상위 디렉터리에 실행 권한을 요구합니다.

.htaccess나 서버 설정에 거부 규칙이 있는지 점검하세요. Apache의 Require 지시문, nginx의 deny 규칙, 또는 유사한 접근 제어가 특정 경로나 IP 대역을 차단합니다. Apache에서는 .htaccess나 블록에 Require all denied 또는 Deny from all이 있는지 확인하세요. nginx에서는 location 블록 안의 deny all;을 확인하세요. 관련 설정 파일을 검토하고 오류 로그에서 구체적인 거부 사유를 확인하세요.

요청 IP가 차단되지 않았는지 확인하세요. 방화벽, 웹 애플리케이션 방화벽(WAF), 지역 차단 규칙이 제한된 주소의 요청을 거부합니다. 서버의 접근 로그에서 거부 항목을 확인하세요. Cloudflare, AWS WAF, mod_security 모두 규칙이 발동하면 403 응답을 만듭니다. WAF 대시보드나 감사 로그를 살펴 차단 규칙을 찾아내세요.

인증된 사용자가 필요한 역할이나 스코프를 갖고 있는지 확인하세요. 인증이 유효하더라도 계정에는 올바른 권한 수준이 필요합니다. 애플리케이션의 접근 제어 시스템에서 역할 할당을 확인하세요. API 엔드포인트는 토큰에 필요한 OAuth 스코프가 없을 때 403을 자주 반환합니다.

폴더를 요청하는 경우 디렉터리 인덱스 설정을 확인하세요. 기본 인덱스 파일(예: index.html)이 없는 디렉터리를 요청하면 디렉터리 목록이 비활성화되어 있을 때 403이 반환됩니다. 인덱스 파일을 추가하거나 목록 표시를 켜세요. nginx에서는 다음과 같습니다.

location /files/ {
    autoindex on;
}

Apache에서는 해당 디렉터리 설정에 Options +Indexes를 추가합니다. 운영 서버에서 디렉터리 목록을 켜는 것은 보안 위험이 있습니다.

SELinux나 AppArmor 정책을 점검하세요. RHEL/CentOS 시스템에서는 Unix 권한상 읽기가 허용되더라도 SELinux가 예상 경로 밖의 파일에 대한 웹 서버 접근을 거부합니다. sestatus로 SELinux 모드를 확인하고 /var/log/audit/audit.log에서 거부 항목을 살펴보세요. restorecon -Rv /var/www/html로 파일 레이블을 다시 지정하거나 chcon으로 올바른 컨텍스트를 설정하세요.

SSL/TLS 클라이언트 인증서 요구 사항을 점검하세요. 상호 TLS로 구성된 서버는 클라이언트가 유효한 인증서를 제시하지 않으면 403을 반환합니다. nginx의 ssl_verify_client 지시문이나 Apache의 SSLVerifyClient 지시문을 확인하세요.

코드 참고

.NET

HttpStatusCode.Forbidden

Rust

http::StatusCode::FORBIDDEN

Rails

:forbidden

Go

http.StatusForbidden

Symfony

Response::HTTP_FORBIDDEN

Python3.5+

http.HTTPStatus.FORBIDDEN

Java

java.net.HttpURLConnection.HTTP_FORBIDDEN

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_FORBIDDEN

Angular

@angular/common/http/HttpStatusCode.Forbidden