컨텐츠 바로가기

GET, POST외 HTTP의 기본 method들에 대해...

http://dialup.egloos.com/139627

웹 프로그래밍을 하는 개발자라면 HTTP규약에 정의된 메소드중에 GET, POST에 대해서는 대부분
들어보았을 것이다. 그런데 그 이외에 다른 method들이 있다는 것을 아는 사람은 그중에 몇 %일까?


우연히 DELETE라고 하는 method가 있다는 것을 어디선가 보고 나서 RFC2068(HTTP1.1)를 확인했다.
GET과 POST외에도 아래와 같은 method가 있었다.

-----------------------------------
OPTIONS
HEAD
PUT
DELETE
TRACE
-----------------------------------


각 method에 대해서 간략하게 테스트를 해보았다.


☞ 테스트방법은? telnet을 사용하여 특정 웹서버로 접근 한 다음 각 method에 맞는 전문을 주고 받는 방법을 취했다.

*주)아래에서 CRLF는 문자열이 아니라 CR(0x0D)와 LF(0x0A)를 뜻한다.  당연히 라인이 구분된 내용들의 뒤에도 CRLF는 있다. ^^


1. OPTIONS : 현재 웹서버에서 지원하는 method가 어떤 것들이 있는지를 알려준다.
[connect]
telnet www.naver.com 80

[request]
OPTIONS / HTTP/1.0
CRLF

[response]
HTTP/1.1 200 OK
Date: Mon, 10 Mar 2008 11:03:06 GMT
Server: Apache
Cache-control: no-cache, no-store, must-revalidate
Pragma: no-cache
P3P: CP="CAO DSP CURa ADMa TAIa PSAa OUR LAW STP PHY ONL UNI PUR FIN COM NAV INT DEM STA PRE"
Cache-control: no-cache, no-store, must-revalidate
Pragma: no-cache
Allow: GET,HEAD,POST,OPTIONS
Vary: Accept-Encoding,User-Agent
Content-Length: 0
Connection: close
Content-Type: text/html; charset=euc-kr


*www.naver.com은 GET,HEAD,POST,OPTIONS를 지원한다.
!이상하게도 OPTIONS메소드에 HTTP버전을 1.1로 하면 400(Bad Request) 에러가 발생한다.
!www.yahoo.com의 경우 확장 많은 method를 지원한다.
---------------------------------------------------------------
HTTP/1.1 200 OK
Date: Mon, 10 Mar 2008 11:15:58 GMT
Cache-Control: private
Vary: User-Agent
X-XRDS-Location: http://open.login.yahooapis.com/openid20/www.yahoo.com/xrds
Content-Length: 0
Allow: GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK
Connection: close
---------------------------------------------------------------


2. HEAD : 웹서버가 응답시 리소스의 내용은 보내지 않고 HEADER만 보낸다. 즉, 해당 Resource가 존재하는지?
             혹은 문제가 없이 제대로 처리가 되는지를 확인할 수 있을것 같다.
[connect]
telnet www.egloos.com 80

[request]
HEAD /egloo/insert.php HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)
Host: www.egloos.com
CRLF
CRLF

[response]
HTTP/1.1 200 OK
Date: Mon, 10 Mar 2008 11:11:57 GMT
Server: Apache
P3P: CP="NOI DSP CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Set-Cookie: isplf=deleted; expires=Sun, 11-Mar-2007 11:11:56 GMT; path=/; domain=.egloos.com
Set-Cookie: isplf=1; expires=Thu, 05-Mar-2009 11:11:57 GMT; path=/; domain=.egloos.com
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=utf-8
Content-Language: ko

*200(OK) 코드가 반환된 것으로 보아 요청한 리소스는 존재한다. ^^

3. PUT : 지정된 URL에 전달된 자료를 저장한다.
[connect]
telnet www.yahoo.com 80

[request]
PUT /test.txt HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)
Host: www.yahoo.com
CRLF
test test test
CRLF
CRLF

[response]
HTTP/1.1 405 Method Not Allowed
Date: Mon, 10 Mar 2008 11:18:37 GMT
Set-Cookie: B=1kb3gp13ta68d&b=3&s=n6; expires=Tue, 02-Jun-2037 20:00:00 GMT; pat
h=/; domain=.yahoo.com
P3P: policyref="http://p3p.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Allow: GET, HEAD, OPTIONS
Cache-Control: private
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1

*www.yahoo.com의 경우 OPTIONS의 응답은 PUT이 지원된다고 되어 있는데 직접 호출해 보면 405에러가 발생한다. T.T
*PUT method를 호출할 때 data들을 어떻게 전달해야 하는지는 모르나 위와 같이 나름 작성해 봤다. ^^
 RFC2086에는 8.2 Message Transmission Requirements 에 있는 규약을 지켜야 한다고 되어 있다.

4. DELETE : 지정한 리소스를 삭제한다.
[connect]
telnet kr.gugi.yahoo.com 80

[request]
DELETE /magazine/magazine.php HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)
Host: kr.gugi.yahoo.com
CRLF
CRLF

[response]
HTTP/1.1 200 OK
Set-Cookie: B=2928s253ta6q9&b=3&s=ha; expires=Tue, 02-Jun-2037 20:00:00 GMT; path=/; domain=.yahoo.com
P3P: policyref="http://p3p.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo TPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=EUC-KR

a364
<body id="maz">
<!-- universal header -->
....

*kr.gugi.yahoo.com의 경우 DELETE를 보냈음에도 GET이 요청된 것처럼 응답을 보내왔다.
 DELETE가 정상 처리되었을 경우는 202 코드가 와야 정상이다.


5. TRACE : 클라이언트가 송신한 request를 그대로 return한다.
TRACE를 지원하는 웹서버를 찾지 못하였으며 이에 대해서는 잘 설명된 블로그 문서가 있어서 링크한다.


http://cafe.naver.com/realdice/588

가끔 심심하다면 RFC를 뒤져보자. ^^

*애석하게도 상기 cafe는 공개되어 있지 않아, 직접 열람이 불가하다 그래서 문제가 있기는 하지만 좋은 자료를 공유한다는 차원에서 불펌했다.(양해 부탁드립니다.)
>>출처 : naver 서원대학교 정보통신공학과 동문회


TraceEnable<?XML:NAMESPACE PREFIX = O />

 

TraceEnable」는 Apache 디폴트로 허가되어 있는 Trace」메소드의 온오프를 설정하는 옵션으로 Apache 1.3.34 2.0.55부터 서포트되고 있다.
Trace
메소드는 클라이언트가 송신한 리퀘스트를 그대로 반환하는 것이다.
예를 들어「Host: www.test.com」라는 문자열을 송신한 경우.

 

telnet 192.168.0.201 80
TRACE / HTTP/1.0
Host: www.pentest.com

 

HTTP/1.1 200 OK

Date: Tue, 25 Jul 2006 01:39:23 GMT

Server: Apache

Transfer-Encoding: chunked

Content-Type: message/http

 

25

TRACE / HTTP/1.1

Host: www.pentest.com


리퀘스트에 송신한 문자열 Host: www.test.com」이 그대로 반환되었다.

왜 이 메소드가 문제가 되는가 하면 Trace메소드를 사용한 공격 방법에 XST(Cross-Site Tracing)」이라는 것이 있기 때문이다.

다운로드: http://www.cgisecurity.com/lib/WH-WhitePaper_XST_ebook.pdf


이것은 공격자가 클라이언트에 TRACE메소드를 발행하도록 하여, 레스폰스를 취득하는 것으로 Basic인증의 패스워드를 착취하는데 사용되는 공격이다.

이런 이유로 Trace메소드를 무효로 것을 권장하고 있는 것이다.
또한, 취약성 스캐너로 Trace메소드가 유효로 되어 있는 서버를 스캔하면 대부분 리스크로 보고하므로, 대책을 취하는 것이 좋다.

 

그럼 실제로 httpd.conf 변경해 보자. 실제로는 매우 간단하다.

httpd.conf 적당한 부분에 다음을 기술하고 Apache를 재기동한다.

 

TraceEnable Off




TraceEnable Off」를 기술하기 전과 후의 Apache 반응을 OPTIONS」메소드를 사용하여 비교해 보자.

 

적용

telnet 192.168.0.201 80
OPTIONS / HTTP/1.0

 

HTTP/1.1 200 OK
Date: Sun, 12 Mar 2006 17:27:26 GMT
Server: Apache/1.3.34 (Unix)
Content-Length: 0
Allow: GET, HEAD, OPTIONS, TRACE
Connection: close


적용

telnet 192.168.0.201 80
OPTIONS / HTTP/1.0

 

HTTP/1.1 200 OK
Date: Sun, 12 Mar 2006 17:28:28 GMT
Server: Apache/1.3.34 (Unix)
Content-Length: 0
Allow: GET, HEAD, OPTIONS
Connection: close

 

「적용 후」에는 Allow」부분에 TRACE」가 삭제되어 있다.
이것으로 대책이 완료되었다.

 

추가
Apache 1.3.34
2.0.55에는 TraceEnable」가 서포트되고 있어 상기와 같이 간단히 TRACE메소드를 무효로 있지만, 이전 버전(1.3.33 2.0.54) 사용하고 있는 경우에는「mod_rewire」를 사용하는 방법이 있다.

방법은 TraceEnable」과는 달리 TRACE메소드가 허가되고 있는 것처럼 보이지만, 내부 처리에 의해 무효화하는 방법이다.

 

우선, mod_rewrite」가 유효하게 되어 있는지 확인한다. 무효로 되어 있다면 유효하게 .
다음의 항목이 httpd.conf 들어 있으면 된다.

 

LoadModule rewrite_module libexec/mod_rewrite.so
AddModule mod_rewrite.c

 

위의 부분이 확인되었다면, 적당한 부분에

 

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^TRACE
RewriteRule .* - [F]
</IfModule>


같이 기술하고, Apache 재기동한다.

이것으로 TRACE메소드는 유효하게 되어 있지만, 클라이언트로부터 송신할 없게 된다.

 

예를 들어 TRACE메소드를 송신한 경우

 

적용

telnet 192.168.0.201 80
TRACE / HTTP/1.1

Host:localhost

 

HTTP/1.1 200 OK

Date: Tue, 11 Jul 2006 10:57:30 GMT

Server: Apache/1.3.12 (Unix)

Transfer-Encoding: chunked

Content-Type: message/http

 

TRACE / HTTP/1.1

Host: localhost


적용

telnet 192.168.0.201 80
TRACE / HTTP/1.1

Host: localhost

 

HTTP/1.1 403 Forbidden

Date: Tue, 11 Jul 2006 10:55:04 GMT

Server: Apache/1.3.12 (Unix)

Transfer-Encoding: chunked

Content-Type: text/html; charset=iso-8859-1

 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<HTML><HEAD>

<TITLE>403 Forbidden</TITLE>

</HEAD><BODY>

<H1>Forbidden</H1>

You don't have permission to access /

on this server.<P>

<HR>

<ADDRESS>Apache/1.3.12 Server at localhost.localdomain Port 80</ADDRESS>

</BODY></HTML> 

 

「적용 후」를 보면 있듯이 TRACE메소드를 송신할 없게 되어 있다.

 

IIS(Intenet Information Service) 경우

IIS Lockdown툴에 포함되어 있는 URLScan 사용한다.

1. IIS Lockdown Tool 설치한다.

2. IIS Lockdown Tool 포함되어 있는 URLScan 설치한다.

3. urlscan.ini 다음의 내용을 추가한다.

UseAllowVerbs=1 지정한 경우

 [options]

 UseAllowVerbs=1

 

 [AllowVerbs]

 GET

 HEAD

 POST

 

UseAllowVerbs=0 지정한 경우

 [options]

 UseAllowVerbs=0

 

 [DenyVerbs]

 TRACE

 TRACK

 

[2] IIS Lockdown Wizard

http://www.microsoft.com/korea/technet/security/tools/locktool.asp

 

[3] URLScan 보안

http://www.microsoft.com/korea/technet/security/URLScan.asp

 

[4] KB326444 - URLScan 툴의 구성 방법

http://support.microsoft.com/kb/326444/ko

 

Sun One WebServer (iPlanet6.0SP2이후 버전)

1. /config/obj.conf Default오브젝트안에 다음의 기술을 추가한다.

 

 <Client method=""TRACE"">

   AuthTrans fn=""set-variable""

   remove-headers=""transfer-encoding""

   set-headers=""content-length: -1""

   error=""501""

 </Client>

 

2. 서버를 재기동한다.

 

[5] Sun ONE/iPlanet Web Server Enable HTTP TRACE Method by Default to Emulate the CERT VU

http://sunsolve.sun.com/search/document.do?assetkey=1-26-50603-1


덧글|덧글 쓰기|신고