2010년 1월 5일 화요일

HTTP 프로토콜 분석시 HTML 컨텐츠가 암호화 된것 같이 보이는 경우라면

웹 프로토콜은 HTTP 이고 포트번호는 기본적으로 80 번을 사용하고 있다.
패킷 덤프 프로그램을 통해 분석하다보면 HTML 내용이 제대로 보여야 하는데
이상한 문자열만 잔뜩 나타나는 경우가 있다. 분명 암호화 프로그램을 따로
쓰지도 않는데 말이다. 이런 경우는 HTTP 프로토콜에서 해당 컨텐츠 내용이
압축되어 있는 경우이다. HTTP 프로토콜 에서는 속도 향상을 위해 압축 방식을
지원하고 있는데, 지원 가능한 경우 HTTP 서버는 클라이언트에게 데이터를 보내주는 경우
gzip 으로 압축하여 전달하게 된다.

예를 들어, 일전에 "TCP 통신과정을 한눈에 쉽게 살펴보기" 라는 글에서
와이어샤크 사이트에 접속한 것은 HTML 출력내용이 모두 보였다. 하지만 이것은 필자가
보여주기 위해 수동으로 HTTP Request 를 한 것이므로 정상적으로 HTML 이 나타난 것이다.
만약 브라우저를 통해 요청하였다면 아래와 같이 보였을 것이다.

GET 요청을 하는 부분을 보면 Accept-Encoding 이라는 부분이 보인다. 여기에 gzip 이 나타나 있는데, 브라우저가 압축 방식의 컨텐츠를 지원하기 때문에 이렇게 요청한 것이다.

Accept-Encoding: gzip,deflate,sdch

그러면 HTTP 서버는 아래와 같이 컨텐츠가 gzip 으로 인코딩 되어 있다는 응답 헤더를 보내주고 실제 컨텐츠를 압축하여 전송한다.

Content-Encoding: gzip

실제 전송된 컨텐츠는 다음형태와 같이 압축되어 HTML 형태로 알아볼 수 없는 것이다.

Content-Type: text/html

...........Z.n.6....`. M....$Mj{\8.$5.8n.$-P..H.
m.THj.NQ`.f.l.d./.....v..#^........w.......F?..;F.._..........0<<
?.....A..>..7S*....b.,..\$...p...Y(...b.{.[{.

하지만, 이것은 브라우저의 지원 여부에 따라 달라지므로 요청시 gzip 인코딩을 요청하지 않으면 압축없이 정상적으로 HTML 컨텐츠를 바로 볼 수가 있다. 재밌는 것을 하나 보면 응답 헤더중에

X-Slogan: Be good. You never know who's running Wireshark nearby.

이라는 헤더가 보인다. 응답헤더에 X-Slogan 이라는 헤더를 추가하여 랜덤하게 슬로건 문구를
보여주고 있다. 와이어샤크 사이트! 재치가 있어 보인다 :-)

댓글 2개:

  1. 블로그 잘 보고 갑니다~ 근데 한 가지 질문이 있는데 브라우저에서 gzip 압축해서 보내달라고 요청한다고 하셨는데 gzip으로 압축해서 보내지 말고 그냥 보내달라고 요청하려면 브라우저에서 어떤 옵션을 설정해 주어야 하는건가요??

    답글삭제
  2. @진환 - 2010/10/02 15:21
    브라우저별로 가능 여부는 찾아봐야 할것 같은데,

    파이어폭스의 브라우저 경우 아래와 같이 하시면 됩니다.

    1. URL 입력창에서 about:config 를 입력

    2. 필터에서 encoding 입력

    3. network.http.accept-encoding 더블 클릭

    4. 디폴트 값 대신 gzip;q=0,deflate;q=0 입력



    사용하시는 브라우저에서 Gzip 기능이 disable 가능하신지 구글링이 필요할것 같습니다.

    답글삭제