圧縮
必須の依存関係: 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 を参照してください。
