본문 바로가기

서버,OS, DB(인프라)/WEB,WAS

[WEB-WAS]청크 전송 인코딩(Chunked Transfer Encoding)

아파치설정

SetEnv Proxy-sendchunks 1
RequestHeader unset Proxy early
<IfModule mod_deflate.c>
SetEnv no-gzip 1
</IfModule>
<IfModule http2_module>
H2ProtocolOff
</IfModule>
 

아파치 항목 설명

  1. SetEnv Proxy-sendchunks 1
    • SetEnv: 환경 변수를 설정합니다.
    • Proxy-sendchunks: 이 변수는 HTTP 프록시 모듈 (mod_proxy)가 클라이언트에게 청크 전송 인코딩을 사용하여 응답을 보내도록 지시합니다.
    • 청크 전송 인코딩: 응답을 여러 개의 청크로 나누어 전송하는 방법입니다. 이 방법은 응답의 전체 크기를 미리 알 수 없는 경우에 유용합니다.
       
       
  2. RequestHeader unset Proxy early
    • RequestHeader: 요청 헤더를 수정합니다.
    • unset Proxy: "Proxy"라는 이름의 요청 헤더를 제거합니다.
    • early: 요청이 프록시 서버로 전달되기 전에 이 작업을 수행하도록 지시합니다. 이는 헤더가 프록시 서버에서 처리되기 전에 제거되어야 할 때 유용합니다.
  3. <IfModule mod_deflate.c> SetEnv no-gzip 1 </IfModule>
    • <IfModule mod_deflate.c>: mod_deflate 모듈이 로드된 경우에만 포함된 지시문을 실행합니다.
    • SetEnv no-gzip 1: no-gzip 환경 변수를 설정하여 응답의 gzip 압축을 비활성화합니다. 이는 특정 상황에서 gzip 압축이 원치 않거나 문제가 있을 때 사용됩니다.
  4. <IfModule http2_module> H2ProtocolOff </IfModule>
    • <IfModule http2_module>: http2_module이 로드된 경우에만 포함된 지시문을 실행합니다.
    • H2ProtocolOff: HTTP/2 프로토콜을 비활성화합니다. 이는 HTTP/2와의 호환성 문제를 해결하거나 HTTP/1.1만 사용하도록 강제해야 할 때 유용합니다.

 

청크 전송 인코딩(Chunked Transfer Encoding)

청크 전송 인코딩은 HTTP 프로토콜에서 응답 본문을 여러 개의 청크로 나누어 전송하는 방법입니다. 각 청크는 크기를 명시하는 16진수 숫자로 시작하며, 마지막 청크는 크기가 0입니다. 이 방법은 전체 응답의 크기를 미리 알 수 없거나 동적으로 생성된 콘텐츠를 전송할 때 유용합니다.

예를 들어, 큰 파일을 스트리밍하거나 실시간 데이터를 전송할 때 청크 전송 인코딩이 사용될 수 있습니다. 클라이언트는 청크를 순차적으로 받으며, 전체 응답을 모두 받을 때까지 대기할 필요가 없습니다.

청크 전송 인코딩(Chunked Transfer Encoding)은 실시간 데이터 전송 시 데이터 손실을 방지하고 효율적인 전송을 가능하게 하는 방법 중 하나입니다. 특히, 전체 응답 크기를 미리 알 수 없거나 동적으로 생성된 데이터를 전송할 때 유용합니다 이를 통해 클라이언트가 데이터를 점진적으로 받을 수 있어 응답 시간을 줄이고, 서버와 클라이언트 간의 데이터 흐름을 효율적으로 관리할 수 있습니다.

 

  • 실시간 스트리밍: 청크 전송 인코딩은 실시간 스트리밍 데이터(예: 비디오 스트리밍, 라이브 피드 등)에 적합합니다. 데이터가 생성됨에 따라 클라이언트에게 청크로 전송되므로 클라이언트는 전체 데이터가 전송될 때까지 기다릴 필요가 없습니다.
  • 큰 파일 전송: 큰 파일을 전송할 때 전체 파일을 한 번에 보내지 않고 청크 단위로 나누어 전송할 수 있어 메모리 사용을 최적화하고 전송 중에 데이터 손실을 방지할 수 있습니다.
  • 연결 유지: 클라이언트와 서버 간의 연결을 유지하면서 데이터 전송을 지속할 수 있습니다. 이는 특히 장시간 지속되는 연결에서 유용합니다.

 

Apache 설정의 목적

제공해주신 설정은 특정 상황에서 서버와 클라이언트 간의 데이터 전송을 최적화하거나 문제를 해결하기 위해 사용됩니다. 예를 들어:

  • 청크 전송 인코딩을 활성화하여 응답 데이터를 청크로 나누어 전송함으로써 스트리밍을 최적화합니다.
  • 프록시 서버로 전달되는 요청 헤더를 조정하여 불필요하거나 원치 않는 헤더를 제거합니다.
  • gzip 압축을 비활성화하여 특정 콘텐츠에서 압축을 사용하지 않도록 설정합니다.
  • HTTP/2를 비활성화하여 특정 환경에서 발생할 수 있는 호환성 문제를 방지합니다.

청크 전송 인코딩을 사용하려면 HTTP/2를 비활성화하는 것이 좋습니다. HTTP/2를 비활성화하면 청크 전송 인코딩과의 충돌을 방지할 수 있습니다.

 

JBOSS 설정

<subsystem xmlns="urn:jboss:domain:undertow:...">
<server name="default-server">
<http-listener name="default" socket-binding="http" enable-http2="false"/>
<https-listener name="https" socket-binding="https" ssl-context="applicationSSC" enable-http2="false"/>
<host name="default-host" alias="localhost">
<location name="/" handler="file-handler"/>
</host>
</server>
<handlers>
<file name="file-handler" path="${jboss.server.base.dir}/welcome-content" directory-listing="true"/>
</handlers>
</subsystem>
 

청크 전송 인코딩을 사용하려면 HTTP/2를 비활성화하는 것이 좋습니다. HTTP/2를 비활성화하면 청크 전송 인코딩과의 충돌을 방지할 수 있습니다.

 

필터설정

<subsystem xmlns="urn:jboss:domain:undertow:...">
<server name="default-server">
<http-listener name="default" socket-binding="http" enable-http2="false"/>
<https-listener name="https" socket-binding="https" ssl-context="applicationSSC" enable-http2="false"/>
<host name="default-host" alias="localhost">
<location name="/" handler="file-handler"/>
<filter-ref name="response-header"/>
</host>
</server>
<handlers>
<file name="file-handler" path="${jboss.server.base.dir}/welcome-content" directory-listing="true"/>
</handlers>
<filters>
<response-header name="response-header" header-name="Transfer-Encoding" header-value="chunked"/>
</filters>
</subsystem>

 

설정은 응답 헤더에 Transfer-Encoding: chunked를 추가하여 청크 전송 인코딩을 명시적으로 활성화합니다.