개발자가 애플리케이션을 만들때 염두해야하는 부분이 있다면 "성능"이 아닐까 싶습니다.
라디오에서 3초의 정적이 긴 시간인 만큼 사용자는 묵묵부답의 애플리케이션을 답답해하기 때문이죠.
HTTP에서는 성능향상을 위해 어떤 방법을 이용하고 있을까요?
CONTENT-TYPE? ACCEPT-ENCODING?
- HTTP 메시지를 압축하기 위한 헤더로서, 클라이언트와 서버가 어떤 알고리즘으로 압축할 것인지 상대방에게 알리는 용도로 사용됩니다.
- 클라이언트가 압축된 컨텐츠를 받아 압축을 해제할 수 있는 알고리즘을 서버에 알리는 용도로 사용하는 헤더가 ACCEPT-ENCODING 헤더입니다.
- 웹 서버가 HTTP 응답메시지를 어떤 알고리즘으로 압축했는지 CONTENT-ENCODING 헤더를 통해 명시하게 됩니다.
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 |