일요일, 9월 30, 2007

HTTP Compression

HTTP Compresssion
요즘과 같이 네트웍이 빨라진 시대에 HTTP 압축이 무슨 도움이 될까? 하는 생각도 하겠지만, 실상은 여전히 유용하다고 볼 수 있다. google.com이나, yahoo.com 혹은 유수한 포털의 Http Header 정보를 보게되면, HTTP 압축을 사용하고 있는 것만 보더라도 그것을 입증해 준다.

이 글로 HTTP Compression을 어떻게 사용하는지, 설정은 어떻게 하는지 알아 보자.
우선 HTTP 압축을 위해서는 Web Server와 Web Client(Browser) 두 영역에서 압축을 지원해 주어야 한다. 오늘날 대부분의 WEB Server(IIS, Apache, Tomcat...)는 이 HTTP 압축을 지원하고 있고, 클라이언트인 IE 나, FireFox 또한 기본적으로 압축을 지원하고 있어 HTTP 압축을 쉽게 사용할 수 있다.


HTTP Compression Activity

일단 HTTP 압축을 사용하기 위해 Client 와 Server 간에 어떤 행위가 일어나는지 살펴보자.
HTTP 압축을 사용하기 위해 Client가 해야 할 행위는 HTTP Header 에

Accept-Encoding: gzip, deflate

위 속성을 정의해 주면 끝이다. 이것
은 하나의 약속으로, 클라이언트가 압축을 받아들일 준비가 되어있다는 의미이다. 즉, 브라우저에 압축을 해제할 수 있는 모듈이 탑재되어 있어, 서버가 HTTP 를 압축해서 던저줘도 된다고 선언하는 것이다.
오늘날 대부분의 클라이언트(IE, FireFox)는 이를 자동으로 설정한다.

그리고 나서, 서버가 할 행위는, 요청을 받아 들이고 처리해서 그 내용을 gzip 을 통해 압축해서 다시 클라이언트에 전송해주는 일이다. 이때 Server 는 HTTP Header에

Content-Encoding: gzip

을 설정해서 client 로 보내주며, client 는 이에 대응하는 압축해제를 하게된다.


HTTP Compression Configur
ation

여기에서, HTTP Compression 설정은 IIS 6.0기준으로 설명하기로 하며, Apache나 Tomcat, Was에 대한 설정은 별도로 수행해 보라.

IIS에서 HTTP 압축은 설정은 "인터넷 정보서비스(IIS) 관리"에서 설정할 수있다.

"IIS 관리"에서 --> "웹사이트"를 선택하고, 속성(properties) 선택 --> "웹사이트 등록정보" 화면창에서 "서비스" 탭을 선택한다. 다음과 같은 화면이다.

















하단에 HTTP 압축 항목이 보인다.
두가지 체크박스가 있는데, "정적 파일 압축"은 확장자가 html, htm, txt 같은 정적파일을 압축하는데 사용되며, "응용 프로그램 압축"은 기본적으로 asp, dll, exe 파일을 압축하는데 사용된다.
이 U.I 에서 설정된 정보는(다른 IIS 설정정보도 마찬가지겠지만..) %windir%\system32\inetsrv\MetaBase.xml 파일에 저장된다.

사용하고자 하는 항목을 체크하고 "확인"을 선택하면 이제부터 HTTP 압축을 사용할 수가 있다.이것이 끝이 아니다, 지금부터는 안좋은 소식이다.
ASP.NET 사이트를 운영하고 있고 Fildder 같은 유틸로 오고가는 HTTP Header를 보면 IIS에서 HTTP 압축을 설정했지만 여전히 내용이 압축되지 않는다는 사실을 알게된다. 정말 당혹스럽다.왜그럴까?
위에서 잠깐 언급해지만, "응용프로그램 압축" 의 기본 확장자가 asp, dll, exe 임을 주목하자.
맞다. 참으로 어처구니 없게도 aspx 가 제외되어 있다.
버그인지... 그들의 의도를 알수 없는 대목이다. 어쨋든 인간이 하는일에 있어 완벽한 일이 어디 있겠는가? 실수라고 생각하자. 그러는 것이 건강한 이성을 유지하는 길이다.

어쨌든, 원인을 알았으니 해결할 수 있다. 지금 부터는 손의 수고가 필요하다(사실 결정적인 상황에서 손이 필요한 경우가 종종있다.)
위에서 IIS 설정값이
%windir%\system32\inetsrv\MetaBase.xml 에 저장된다고 했다.
이 파일을 열어 다음과 같은 엘러먼트를 찾는다.



어트리뷰트중 HcScriptFileExtensions aspx 확장자를 추가한다. 내 경우는 다음과 같다.



그리고 한가지 더,
HcDynamicCompressionLevel 이란 속성이 있는데, 이것은 압축 수준을 결정한다.
0~10 까지 설정할 수있다. 압축율이 높다면, 응답성능이 조금 떨어지는 것은 당연하다.


XMLHTTP 와 HTTP Compression

XMLHTTP 는 크게 두가지로 나뉜다.
wininet.dll을 사용하는 XMLHTTP, winhttp.dll을 사용하는 ServerXMLHTTP이다.
차이점은 차후에 알아 보기로 하고, 서버에서 사용하는 ServerXMLHTTP는
HTTP Header를 설정할 수 없기에 압축을 지원하지 않는다.