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

これにより、サーバー上で gzipdeflateidentity エンコーダーが有効になります。 次の章では、特定のエンコーダーのみを有効にし、データを圧縮するための条件を構成する方法について説明します。 追加されたすべてのエンコーダーは、必要に応じてリクエストボディを解凍するために使用されることに注意してください。

圧縮設定の構成

圧縮は複数の方法で構成できます。特定のエンコーダーのみを有効にしたり、その優先順位を指定したり、特定のコンテンツタイプのみを圧縮したりできます。

特定のエンコーダーの追加

特定のエンコーダーのみを有効にするには、対応する拡張関数を呼び出します。例えば、次のようになります。

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

各圧縮アルゴリズムの優先度は、priority プロパティを設定することで指定できます。

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

上記の例では、deflate の方が高い優先度値を持つため、gzip よりも優先されます。サーバーはまず Accept-Encoding ヘッダー内の 品質値 (quality values) を確認し、その後に指定された優先度を考慮することに注意してください。

コンテンツタイプの構成

デフォルトでは、Ktor は audiovideoimagetext/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 を参照してください。