HTTPQUERY
한국어

405 Method Not Allowed

사용법

405 Method Not Allowed 오류가 도착하면 클라이언트는 리소스는 존재하지만 지정한 메서드가 허용되지 않음을 이해합니다. 서버는 응답의 일부로, 해당 리소스에 대해 현재 지원되는 메서드를 나열한 Allow 헤더를 보냅니다.

SEO 영향

Google 같은 검색 엔진은 405 상태를 반환하는 URL을 색인하지 않습니다. 이전에 색인되었다가 이 상태 코드를 반환하는 URL은 검색 결과에서 제거됩니다.

예시

클라이언트가 읽기 전용 리소스에 DELETE를 시도합니다. 서버는 405 Method Not Allowed로 응답하며, GET·HEAD·OPTIONS만 허용됨을 보여주는 Allow 헤더를 포함합니다.

요청

DELETE /policies.pdf HTTP/1.1
Host: example.com

응답

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS
Content-Type: text/html
Content-Length: 157

<html>
  <head>
    <title>Operation Not Permitted</title>
  </head>
  <body>
    <p>This resource is read-only and cannot be
    deleted.</p>
  </body>
</html>

해결 방법

405 Method Not Allowed는 리소스는 존재하지만 요청에 사용된 HTTP 메서드를 지원하지 않는다는 뜻입니다.

응답의 Allow 헤더를 확인하세요. 서버는 해당 리소스에 허용되는 모든 메서드를 나열한 이 헤더를 포함합니다. 나열된 메서드 중 하나로 바꾸세요. curl -I 이나 브라우저 개발자 도구의 Response Headers 섹션에서 이 헤더를 확인하세요.

올바른 메서드로 바꾸세요. 읽기 전용 엔드포인트에 POST를 보내거나 제출용 엔드포인트에 GET을 보내는 것이 흔한 실수입니다. API 문서에 기술된 작업에 메서드를 맞추세요. 폼 제출은 method 속성을 post로 설정하지 않는 한 기본적으로 GET을 사용합니다.

API 엔드포인트 문서를 확인하세요. REST API는 리소스 경로마다 특정 메서드를 정의합니다. 경로와 메서드의 조합이 유효한지 확인하세요. 많은 프레임워크에서 /api/users와 /api/users/의 끝 슬래시 차이는 서로 다른 핸들러로 라우팅되며, 한쪽 경로만 해당 메서드를 받아들이기도 합니다.

서버 설정에 메서드 제한이 있는지 점검하세요. 웹 서버 지시문은 location별로 허용 메서드를 제한합니다. Apache에서는 과 블록이 메서드별 접근을 제어합니다.

<LimitExcept GET HEAD OPTIONS>
    Require all denied
</LimitExcept>

nginx에서는 limit_except 지시문이 같은 역할을 합니다.

location /api {
    limit_except GET POST {
        deny all;
    }
}

의도한 메서드를 허용하도록 이 지시문들을 조정하세요.

CORS 프리플라이트 요청을 처리하세요. 교차 출처 요청은 실제 메서드에 앞서 OPTIONS 프리플라이트를 유발합니다. 서버는 허용 메서드를 나열한 올바른 Access-Control-Allow-Methods 헤더와 함께 OPTIONS에 응답해야 합니다. CORS 설정이 없거나 불완전하면 프리플라이트에 405가 반환됩니다. nginx에서는 다음과 같습니다.

add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";

애플리케이션 프레임워크의 라우팅을 검토하세요. 웹 프레임워크(Django, Rails, Express, Spring)는 명시적으로 선언된 메서드에 대해서만 라우트를 등록합니다. 요청된 메서드에 대한 라우트 데코레이터나 컨트롤러 액션이 없으면 405가 발생합니다. 라우트 정의가 의도한 HTTP 메서드와 일치하는지 확인하세요.

정적 파일 서버의 간섭이 없는지 확인하세요. nginx는 기본적으로 정적 파일을 제공하며 정적 리소스에 대한 POST 요청을 거부합니다. POST가 애플리케이션 백엔드를 향한 것이라면, 해당 location 블록이 요청을 정적 파일 핸들러가 아니라 업스트림 애플리케이션으로 라우팅하는지 확인하세요.

코드 참고

.NET

HttpStatusCode.MethodNotAllowed

Rust

http::StatusCode::METHOD_NOT_ALLOWED

Rails

:method_not_allowed

Go

http.StatusMethodNotAllowed

Symfony

Response::HTTP_METHOD_NOT_ALLOWED

Python3.5+

http.HTTPStatus.METHOD_NOT_ALLOWED

Java

java.net.HttpURLConnection.HTTP_BAD_METHOD

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_METHOD_NOT_ALLOWED

Angular

@angular/common/http/HttpStatusCode.MethodNotAllowed