본문으로 바로가기
링크허브 공식블로그

연동이 쉬워진다

링크허브 공식블로그

현대리가 생각하는 IT

HTTP에서의 압축

개발자가 애플리케이션을 만들때 염두해야하는 부분이 있다면 "성능"이 아닐까 싶습니다.

라디오에서 3초의 정적이 긴 시간인 만큼 사용자는 묵묵부답의 애플리케이션을 답답해하기 때문이죠.

HTTP에서는 성능향상을 위해 어떤 방법을 이용하고 있을까요?


CONTENT-TYPE? ACCEPT-ENCODING?

  • HTTP 메시지를 압축하기 위한 헤더로서, 클라이언트와 서버가 어떤 알고리즘으로 압축할 것인지 상대방에게 알리는 용도로 사용됩니다.
  • 클라이언트가 압축된 컨텐츠를 받아 압축을 해제할 수 있는 알고리즘을 서버에 알리는 용도로 사용하는 헤더가 ACCEPT-ENCODING 헤더입니다.
  • 웹 서버가 HTTP 응답메시지를 어떤 알고리즘으로 압축했는지 CONTENT-ENCODING 헤더를 통해 명시하게 됩니다.

HTTP MESSAGE 살펴보기
실제 HTTP MESSAGE를 살펴보기 위해 FIDDLER(피들러)를 이용하도록 하겠습니다.

CHROME 브라우저를 이용하여 링크허브 공식 블로그(linhub.tistory.com)을 접속했을때의 HTTP MESSAGE입니다.

위 헤더값 중에서 Accept-Encoding헤더를 보시면, CHROME브라우저가 gzip, deflate 인코딩이 가능하다고 서버에게 알리고 있는 것을 확인할 수 있습니다.

gzip, deflate 압축 알고리즘을 이해할 수 있으니, 두개의 알고리즘 중에서 하나로 압축해서 보내도 된다는 것을 알리고 있는 것입니다.

참고로, 알고리즘이 나열된 순서가 우선순위의 순서입니다.


클라이언트의 요청에 서버가 어떤 내용으로 응답을 했을지 살펴보겠습니다.

Content-Encoding 헤더값을 보니, HTTP RESPONSE는 gzip 압축 알고리즘으로 인코딩되었다는 것을 알 수 있습니다.

이렇게 서버는 RESPONSE를 압축했다면, 어떤 알고리즘을 선택해 압축했는지 Content-Encoding 헤더를 통해 명시해주고 있습니다.


그렇다면, 왜 압축을 해야할까요?

서버와 클라이언트가 압축 알고리즘을 결정하는 방법과 과정을 살펴보았는데요,

그렇다면 압축이 필요한 이유는 뭘까요?


요청메시지와 응답메시지 안에는 HTML, 스크립트 문서, 이미지 파일과 같이 용량이 큰 파일들이 존재합니다.

이런 데이터들을 압축하지 않고 보내게 되면, 많은 용량의 대역폭이 필요하게 되고 결과적으로는 성능저하의 원인이 됩니다.

압축정도와 데이터의 타입에 따라 다르겠지만, 압축을 하게되면 체감하는 속도가 향상된다고 합니다.

마치 용량이 큰 파일을 압축하여 전송했을때와 압축을 하지 않은 상태로 전송했을때의 차이만큼 속도가 차이나겠죠?

파일의 용량이 커질수록 속도의 차이는 더 커지겠구요.


압축 알고리즘을 명시하지 않는다면?

FIDDLER에서는 HTTP REQUEST를 생성할 수 있는 기능이 있습니다.

이 기능을 이용하여 압축 알고리즘을 명시하지 않은 HTTP REQUEST를 생성해보고자 합니다.

어떤 결과가 나올지 테스트해보도록 하겠습니다.

Composer 탭에서 아래와 같이 입력 후 Execute버튼을 눌러 HTTP REQUEST를 만들고 수행하도록 하였습니다.

수행된 후 결과를 살펴보면, Accept-Encoding과 Content-Encoding이 명시되지 않은것을 확인할 수 있습니다.

즉, 클라이언트가 압축 알고리즘을 명시하지 않았음으로 서버 역시 압축을 수행하지 않았음을 알 수 있습니다.


실무에서 적용하기

LINKHUB API 서비스에서도 압축 알고리즘을 명시하고 있습니다.

가장 일반적으로 사용하는 gzip과 deflate를 이용하고 있고, 아래 내용에서도 확인하실 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        $header = array();
 
        $header[] = 'Accept-Encoding: gzip,deflate';
        $header[] = 'Connection: close';
        if(is_null($CorpNum) == false) {
            $header[] = 'Authorization: Bearer '.$this->getsession_Token($CorpNum);
        }
        if(is_null($userID) == false) {
            $header[] = 'x-pb-userid: '.$userID;
        }
        if(is_null($action) == false) {
            $header[] = 'X-HTTP-Method-Override: '.$action;
        }
        if($isMultiPart == false) {
            if (is_null($contentsType) == false) {
                $header[] = 'Content-Type: '.$contentsType;
            } else {
            $header[] = 'Content-Type: Application/json';
            }
cs

<PHP HEADER SET>


PHP에서는 gzip으로 압축된 RESPONSE를 디코딩하는 과정이 있습니다.

압축파일인지 구분을 한 뒤, 압축파일이 맞다면 디코딩하게 됩니다.

1
2
3
4
5
6
$response = file_get_contents(($this->IsTest ? PopbillBase::ServiceURL_TEST : 
                               PopbillBase::ServiceURL_REAL).$uri, false, $ctx);
        $is_gzip = 0 === mb_strpos($response , "\x1f" . "\x8b" . "\x08");
        if($is_gzip){
            $response = $this->Linkhub->gzdecode($response);
        }
cs

<PHP RESPONSE DECODING>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    if(CorpNum <> ''then
    begin
        sessiontoken := getSession_Token(CorpNum);
        HTTP.setRequestHeader('Authorization''Bearer ' + sessiontoken);
    end;
    if(action <> ''then
    begin
        HTTP.setRequestHeader('X-HTTP-Method-Override',action);
    end;
 
    if(contentsType<> ''then
    begin
        HTTP.setRequestHeader('Content-Type',contentsType);
    end
    else
    begin 
        HTTP.setRequestHeader('Content-Type','Application/json ;');
    end;
 
    http.setRequestHeader('Accept-Encoding','gzip,deflate');
    HTTP.setRequestHeader('x-lh-version',APIVersion);
 
    if UserID <> '' then
    begin
        HTTP.setRequestHeader('x-pb-userid',UserID);
    end;
cs

<DELPHI HEADER SET>

'현대리가 생각하는 IT' 카테고리의 다른 글

CSS - Padding 과 Margin  (0) 2018.07.19
JSON (JavaScript Object Notation) 기초  (0) 2018.07.11
C# 데이터타입 및 Nullable 형식  (0) 2018.07.05
HTTP Request Header  (0) 2018.07.05
  • Today
  • Total