HTTP 405 Method Not Allowed
주소는 맞지만 메서드가 틀림: 리소스는 존재하지만 이 HTTP 메서드를 허용하지 않습니다.
HTTP 405의 의미
HTTP 405 Method Not Allowed는 서버가 URL은 인식하지만 해당 URL에서 GET, POST, PUT, DELETE와 같은 HTTP 메서드를 지원하지 않는다는 의미입니다. 응답에는 지원되는 메서드를 나열하는 Allow 헤더가 반드시 포함되어야 합니다.
이는 거의 항상 클라이언트와 API 간의 불일치 때문입니다. 페이지 라우트로 POST를 보내는 폼, API가 PATCH를 기대하는데 PUT을 보내는 스크립트, 또는 잘못된 메서드로 설정된 웹훅 등이 원인입니다.
405 오류의 일반적인 원인
- GET만 처리하는 엔드포인트에 POST를 보낸 경우(혹은 그 반대)로, API 예제를 복사해서 붙여넣은 후 흔히 발생합니다.
- 요청이 엔드포인트에 도달하기 전에 리다이렉트(301/302)가 POST를 GET으로 바꿔버렸습니다.
- 웹 서버가 앱은 PUT/DELETE를 기대하는데도 이런 메서드를 전역적으로 차단하고 있습니다.
- 잘못된 라우트: 의도한 엔드포인트는 /api/items(POST)이지만 요청이 /items로 전달되었습니다.
개발자로서 해결하는 방법
- Allow 응답 헤더를 확인하세요. 해당 URL이 정확히 어떤 메서드를 허용하는지 나열되어 있습니다.
- 올바른 메서드와 경로 조합은 API 문서에서 확인하세요.
- 경로 중간에 리다이렉트가 있다면 메서드가 유지되도록 307/308을 사용하세요.
- 서버 측에서는 프레임워크 라우트가 해당 메서드를 선언하고 있는지, 프록시가 이를 제거하지 않는지 확인하세요.
응답 예시
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD
Content-Type: application/json
{"error":"method_not_allowed"}자주 묻는 질문
URL이 어떤 메서드를 지원하는지 어떻게 확인하나요?
405 응답의 Allow 헤더를 확인하거나 해당 URL에 OPTIONS 요청을 보내세요.
왜 제 POST가 GET으로 바뀌었나요?
중간에 있는 301이나 302 리다이렉트가 클라이언트의 메서드를 바꿔버릴 수 있습니다. POST를 허용해야 하는 엔드포인트에는 307/308 리다이렉트를 사용하세요.
405는 클라이언트 문제인가요, 서버 문제인가요?
형식적으로는 클라이언트 오류지만, 실제로는 서버 설정 오류를 드러내는 경우가 많습니다. 메서드가 누락된 라우트나 특정 verb를 차단하는 프록시가 원인일 수 있습니다.