Apache httpd에서 특정 method 제한

요약

HTTP request method 중 GET이랑 POST만 주로 사용되고, 다른 메소드들은 막고 싶다. Apache httpd에서 GET과 POST만 받고 나머지 method들을 받지 않게 하려면 어떻게 해야 할까?

TL;DR

httpd.conf에 아래와 같이 limitexcept를 건다. 2.4 버전 기준

# root로 오는 전체 요청에 대하여
<Location />
# GETPOST를 제외하고
<LimitExcept GET POST >
# 전체 차단
Order deny,all
Deny from all
</LimitExcept>
</Location>

LimitExcept

LimitExcept는 Apache Httpd가 허용하는 Request Method를 명시하는 Directive 이다. Limit으로 쓰지 않는 DELETE와 같은 Method 들을 하나하나 차단할 수도 있지만 알게 모르게 새는 구멍이 생길 수 있으므로 새는 구멍이 생길 수도 있다. 그러므로 그냥 GET과 POST만 허용하게 명시할 수 있는 LimitExcept가 더 좋아보인다.

Context

directory(location과 files포함), .htaccess라고 공식 문서에는 나와 있지만 Location도 동작하며, 전체 차단을 위해서는 최상단(/)에서 막는게 좋아보인다. httpd 자체가 특정 메소드만 쓸 수 있게 글로벌 설정을 거는 것은 불가능하며 directory, location 등 서비스 별로 별도 설정이 필요하다.

모듈

core모듈에 포함되므로 추가 모듈 로딩 필요 없다. 그런데 allow/deny와 같이 사용하게 될 것이므로 mod_authz_host는 끼고 간다고 봐야 할 것 같다. 하지만 mod_authz_host를 안땡기는 경우는 없으므로 의미가 없다고 봐도 될 것 같다. 그런데와 하지만 두번의 반전!

Response

  • 허용한 경우(GET POST) : 정상 응답
  • 허용하지 않은 경우 : 403 Forbidden

끝.

참조

[1] HTTP request methods : https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods [2] LimitExcept Driective : https://httpd.apache.org/docs/2.4/mod/core.html#limitexcept [3] mod_authz_host(apache module) : https://httpd.apache.org/docs/2.2/ko/mod/mod_authz_host.html