圧縮
必須の依存関係: 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 ヘッダー内の 品質値 (quality values) を確認し、その後に指定された優先度を考慮することに注意してください。
コンテンツタイプの構成
デフォルトでは、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 を参照してください。