압축
필수 의존성: io.ktor:ktor-server-compression
코드 예시: compression
Ktor는 Compression 플러그인을 사용하여 응답 본문을 압축하고 요청 본문을 압축 해제하는 기능을 제공합니다. gzip
및 deflate
를 포함한 다양한 압축 알고리즘을 사용할 수 있으며, 데이터 압축에 필요한 조건(예: 콘텐츠 유형 또는 응답 크기)을 지정하거나, 특정 요청 매개변수에 따라 데이터를 압축할 수도 있습니다.
Compression
플러그인은 현재SSE
응답을 지원하지 않습니다.
Ktor에서 미리 압축된 정적 파일을 제공하는 방법을 알아보려면 미리 압축된 파일을 참조하세요.
의존성 추가
Compression
을 사용하려면 빌드 스크립트에 ktor-server-compression
아티팩트를 포함해야 합니다:
Compression 설치
애플리케이션에 Compression
플러그인을 설치하려면, 지정된
install
함수에 전달하세요. 아래 코드 스니펫은 Compression
을 설치하는 방법을 보여줍니다... - ...
embeddedServer
함수 호출 내에서. - ...
Application
클래스의 확장 함수인 명시적으로 정의된module
내에서.
이렇게 하면 서버에서 gzip
, deflate
, identity
인코더가 활성화됩니다. 다음 장에서는 특정 인코더만 활성화하고 데이터 압축 조건을 구성하는 방법을 살펴보겠습니다. 추가된 모든 인코더는 필요한 경우 요청 본문을 압축 해제하는 데 사용됩니다.
압축 설정 구성
압축은 여러 가지 방법으로 구성할 수 있습니다: 특정 인코더만 활성화하거나, 우선순위를 지정하거나, 특정 콘텐츠 유형만 압축하는 등.
특정 인코더 추가
특정 인코더만 활성화하려면 해당 확장 함수를 호출합니다. 예를 들어:
install(Compression) {
gzip()
deflate()
}
각 압축 알고리즘의 우선순위는 priority
속성을 설정하여 지정할 수 있습니다.
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
를 사용하여 모든 텍스트 하위 유형을 압축하는 방법을 보여줍니다.
install(Compression) {
gzip {
matchContentType(
ContentType.Application.JavaScript
)
}
deflate {
matchContentType(
ContentType.Text.Any
)
}
}
전체 예시는 다음에서 찾을 수 있습니다: compression.
응답 크기 구성
Compression
플러그인을 사용하면 지정된 값을 초과하지 않는 응답에 대한 압축을 비활성화할 수 있습니다. 이렇게 하려면 minimumSize
함수에 원하는 값(바이트 단위)을 전달합니다.
install(Compression) {
deflate {
minimumSize(1024)
}
}
사용자 정의 조건 지정
필요한 경우 condition
함수를 사용하여 사용자 정의 조건을 제공하고 특정 요청 매개변수에 따라 데이터를 압축할 수 있습니다. 아래 코드 스니펫은 지정된 URI에 대한 요청을 압축하는 방법을 보여줍니다.
install(Compression) {
gzip {
condition {
request.uri == "/orders"
}
}
}
HTTPS 보안
압축이 활성화된 HTTPS는 BREACH 공격에 취약합니다. 이 공격을 완화하기 위해 다양한 방법을 사용할 수 있습니다. 예를 들어, 리퍼러 헤더가 교차 사이트 요청을 나타낼 때마다 압축을 비활성화할 수 있습니다. Ktor에서는 리퍼러 헤더 값을 확인하여 이를 수행할 수 있습니다.
install(Compression) {
gzip {
condition {
request.headers[HttpHeaders.Referrer]?.startsWith("https://my.domain/") == true
}
}
}
사용자 정의 인코더 구현
필요한 경우 ContentEncoder 인터페이스를 구현하여 사용자 고유의 인코더를 제공할 수 있습니다. 구현 예시는 GzipEncoder를 참조하세요.