Skip to content
Server Plugin

압축

필수 의존성: io.ktor:ktor-server-compression

코드 예시: compression

네이티브 서버
Ktor는 Kotlin/Native를 지원하며 추가 런타임이나 가상 머신 없이 서버를 실행할 수 있게 합니다.
지원: ✖️

Ktor는 Compression 플러그인을 사용하여 응답 본문을 압축하고 요청 본문을 압축 해제하는 기능을 제공합니다. gzipdeflate를 포함한 다양한 압축 알고리즘을 사용할 수 있으며, 데이터 압축에 필요한 조건(예: 콘텐츠 유형 또는 응답 크기)을 지정하거나, 특정 요청 매개변수에 따라 데이터를 압축할 수도 있습니다.

Compression 플러그인은 현재 SSE 응답을 지원하지 않습니다.

Ktor에서 미리 압축된 정적 파일을 제공하는 방법을 알아보려면 미리 압축된 파일을 참조하세요.

의존성 추가

Compression을 사용하려면 빌드 스크립트에 ktor-server-compression 아티팩트를 포함해야 합니다:

Kotlin
Groovy
XML

Compression 설치

애플리케이션에 Compression 플러그인을 설치하려면, 지정된

모듈
모듈을 사용하면 경로를 그룹화하여 애플리케이션을 구조화할 수 있습니다.
install 함수에 전달하세요. 아래 코드 스니펫은 Compression을 설치하는 방법을 보여줍니다...

  • ... embeddedServer 함수 호출 내에서.
  • ... Application 클래스의 확장 함수인 명시적으로 정의된 module 내에서.
kotlin
kotlin

이렇게 하면 서버에서 gzip, deflate, identity 인코더가 활성화됩니다. 다음 장에서는 특정 인코더만 활성화하고 데이터 압축 조건을 구성하는 방법을 살펴보겠습니다. 추가된 모든 인코더는 필요한 경우 요청 본문을 압축 해제하는 데 사용됩니다.

압축 설정 구성

압축은 여러 가지 방법으로 구성할 수 있습니다: 특정 인코더만 활성화하거나, 우선순위를 지정하거나, 특정 콘텐츠 유형만 압축하는 등.

특정 인코더 추가

특정 인코더만 활성화하려면 해당 확장 함수를 호출합니다. 예를 들어:

kotlin
install(Compression) {
    gzip()
    deflate()
}

각 압축 알고리즘의 우선순위는 priority 속성을 설정하여 지정할 수 있습니다.

kotlin
install(Compression) {
    gzip {
        priority = 0.9
    }
    deflate {
        priority = 1.0
    }
}

위 예시에서는 deflate가 더 높은 우선순위 값을 가지며 gzip보다 우선합니다. 서버는 먼저 Accept-Encoding 헤더 내의 품질 값을 확인한 다음 지정된 우선순위를 고려합니다.

콘텐츠 유형 구성

기본적으로 Ktor는 audio, video, image, text/event-stream과 같은 특정 콘텐츠 유형을 압축하지 않습니다. matchContentType을 호출하여 압축할 콘텐츠 유형을 선택하거나, excludeContentType을 사용하여 원하는 미디어 유형을 압축에서 제외할 수 있습니다. 아래 코드 스니펫은 gzip을 사용하여 JavaScript 코드를 압축하고 deflate를 사용하여 모든 텍스트 하위 유형을 압축하는 방법을 보여줍니다.

kotlin
install(Compression) {
    gzip {
        matchContentType(
            ContentType.Application.JavaScript
        )
    }
    deflate {
        matchContentType(
            ContentType.Text.Any
        )
    }
}

전체 예시는 다음에서 찾을 수 있습니다: compression.

응답 크기 구성

Compression 플러그인을 사용하면 지정된 값을 초과하지 않는 응답에 대한 압축을 비활성화할 수 있습니다. 이렇게 하려면 minimumSize 함수에 원하는 값(바이트 단위)을 전달합니다.

kotlin
    install(Compression) {
        deflate {
            minimumSize(1024)
        }
    }

사용자 정의 조건 지정

필요한 경우 condition 함수를 사용하여 사용자 정의 조건을 제공하고 특정 요청 매개변수에 따라 데이터를 압축할 수 있습니다. 아래 코드 스니펫은 지정된 URI에 대한 요청을 압축하는 방법을 보여줍니다.

kotlin
install(Compression) {
    gzip {
        condition {
            request.uri == "/orders"
        }
    }
}

HTTPS 보안

압축이 활성화된 HTTPS는 BREACH 공격에 취약합니다. 이 공격을 완화하기 위해 다양한 방법을 사용할 수 있습니다. 예를 들어, 리퍼러 헤더가 교차 사이트 요청을 나타낼 때마다 압축을 비활성화할 수 있습니다. Ktor에서는 리퍼러 헤더 값을 확인하여 이를 수행할 수 있습니다.

kotlin
install(Compression) {
    gzip {
        condition {
            request.headers[HttpHeaders.Referrer]?.startsWith("https://my.domain/") == true
        }
    }
}

사용자 정의 인코더 구현

필요한 경우 ContentEncoder 인터페이스를 구현하여 사용자 고유의 인코더를 제공할 수 있습니다. 구현 예시는 GzipEncoder를 참조하세요.