ASP.NET Core 응답 압축Response compression in ASP.NET Core

작성자: Luke LathamBy Luke Latham

예제 코드 살펴보기 및 다운로드 (다운로드 방법)View or download sample code (how to download)

네트워크 대역폭은 제한 된 리소스입니다.Network bandwidth is a limited resource. 응답 크기를 줄이면 일반적으로 앱의 응답성이 크게 향상 됩니다.Reducing the size of the response usually increases the responsiveness of an app, often dramatically. 페이로드 크기를 줄이는 한 가지 방법은 앱의 응답을 압축 하는 것입니다.One way to reduce payload sizes is to compress an app's responses.

응답 압축 미들웨어를 사용 하는 경우When to use Response Compression Middleware

IIS, Apache 또는 Nginx에서 서버 기반 응답 압축 기술을 사용 합니다.Use server-based response compression technologies in IIS, Apache, or Nginx. 미들웨어의 성능은 서버 모듈의 성능과 일치 하지 않을 수 있습니다.The performance of the middleware probably won't match that of the server modules. Http.sys 서버 서버와 kestrel 서버는 현재 기본 제공 압축 지원을 제공 하지 않습니다.HTTP.sys server server and Kestrel server don't currently offer built-in compression support.

응답 압축 미들웨어를 사용 하는 경우:Use Response Compression Middleware when you're:

응답 압축Response compression

일반적으로 기본적으로 압축 되지 않은 모든 응답은 응답 압축의 이점을 누릴 수 있습니다.Usually, any response not natively compressed can benefit from response compression. 기본적으로 압축 되지 않은 응답은 일반적으로 CSS, JavaScript, HTML, XML 및 JSON을 포함 합니다.Responses not natively compressed typically include: CSS, JavaScript, HTML, XML, and JSON. PNG 파일과 같이 기본적으로 압축 된 자산은 압축 해서는 안 됩니다.You shouldn't compress natively compressed assets, such as PNG files. 고유 하 게 압축 된 응답을 추가로 압축 하려는 경우 크기 및 전송 시간의 작은 추가 감소는 압축을 처리 하는 데 걸린 시간을 overshadowed 수 있습니다.If you attempt to further compress a natively compressed response, any small additional reduction in size and transmission time will likely be overshadowed by the time it took to process the compression. 파일의 내용과 압축 효율성에 따라 약 150-1000 바이트 보다 작은 파일은 압축 하지 않습니다.Don't compress files smaller than about 150-1000 bytes (depending on the file's content and the efficiency of compression). 작은 파일을 압축 하는 오버 헤드로 인해 압축 되지 않은 파일 보다 큰 압축 된 파일이 생성 될 수 있습니다.The overhead of compressing small files may produce a compressed file larger than the uncompressed file.

클라이언트가 압축 된 콘텐츠를 처리할 수 있는 경우 클라이언트는 요청과 함께 Accept-Encoding 헤더를 전송 하 여 해당 기능을 서버에 알려야 합니다.When a client can process compressed content, the client must inform the server of its capabilities by sending the Accept-Encoding header with the request. 서버는 압축 된 콘텐츠를 보낼 때 압축 된 응답을 인코딩하는 방법에 대 한 정보를 Content-Encoding 헤더에 포함 해야 합니다.When a server sends compressed content, it must include information in the Content-Encoding header on how the compressed response is encoded. 미들웨어에서 지 원하는 콘텐츠 인코딩 명칭은 다음 표에 나와 있습니다.Content encoding designations supported by the middleware are shown in the following table.

Accept-Encoding 헤더 값Accept-Encoding header values 미들웨어 지원Middleware Supported 설명Description
br 예(기본값)Yes (default) Brotli 압축 된 데이터 형식Brotli compressed data format
deflate 아니요No DEFLATE 압축 데이터 형식DEFLATE compressed data format
exi 아니요No W3C 효율적인 XML 교환W3C Efficient XML Interchange
gzip Yes Gzip 파일 형식Gzip file format
identity Yes "인코딩 안 함" 식별자: 응답은 인코딩되지 않아야 합니다."No encoding" identifier: The response must not be encoded.
pack200-gzip 아니요No Java 보관을 위한 네트워크 전송 형식Network Transfer Format for Java Archives
* Yes 명시적으로 요청 되지 않은 모든 사용 가능한 콘텐츠 인코딩입니다.Any available content encoding not explicitly requested
Accept-Encoding 헤더 값Accept-Encoding header values 미들웨어 지원Middleware Supported 설명Description
br 아니요No Brotli 압축 된 데이터 형식Brotli compressed data format
deflate 아니요No DEFLATE 압축 데이터 형식DEFLATE compressed data format
exi 아니요No W3C 효율적인 XML 교환W3C Efficient XML Interchange
gzip 예(기본값)Yes (default) Gzip 파일 형식Gzip file format
identity Yes "인코딩 안 함" 식별자: 응답은 인코딩되지 않아야 합니다."No encoding" identifier: The response must not be encoded.
pack200-gzip 아니요No Java 보관을 위한 네트워크 전송 형식Network Transfer Format for Java Archives
* Yes 명시적으로 요청 되지 않은 모든 사용 가능한 콘텐츠 인코딩입니다.Any available content encoding not explicitly requested

자세한 내용은 IANA 공식 콘텐츠 코딩 목록을 참조 하세요.For more information, see the IANA Official Content Coding List.

미들웨어를 사용 하면 사용자 지정 Accept-Encoding 헤더 값에 대 한 추가 압축 공급자를 추가할 수 있습니다.The middleware allows you to add additional compression providers for custom Accept-Encoding header values. 자세한 내용은 아래의 사용자 지정 공급자 를 참조 하세요.For more information, see Custom Providers below.

미들웨어는 압축 체계의 우선 순위를 지정 하기 위해 클라이언트에서 보낼 때 품질 값 (qvalue, q) 가중치에 대응 시킬 수 있습니다.The middleware is capable of reacting to quality value (qvalue, q) weighting when sent by the client to prioritize compression schemes. 자세한 내용은 RFC 7231: 수락-인코딩을 참조 하세요.For more information, see RFC 7231: Accept-Encoding.

압축 알고리즘은 압축 속도와 압축의 효율성 사이의 균형을 적용 합니다.Compression algorithms are subject to a tradeoff between compression speed and the effectiveness of the compression. 이 컨텍스트의 효과 는 압축 후 출력의 크기를 나타냅니다.Effectiveness in this context refers to the size of the output after compression. 가장 작은 크기는 가장 최적 압축을 통해 달성 됩니다.The smallest size is achieved by the most optimal compression.

다음 표에서는 압축 된 콘텐츠 요청, 송신, 캐싱 및 수신에 관련 된 헤더에 대해 설명 합니다.The headers involved in requesting, sending, caching, and receiving compressed content are described in the table below.

HeaderHeader RoleRole
Accept-Encoding 클라이언트에서 서버로 전송 되어 클라이언트에 허용 되는 콘텐츠 인코딩 스키마를 표시 합니다.Sent from the client to the server to indicate the content encoding schemes acceptable to the client.
Content-Encoding 페이로드에 있는 콘텐츠의 인코딩을 나타내기 위해 서버에서 클라이언트로 전송 됩니다.Sent from the server to the client to indicate the encoding of the content in the payload.
Content-Length 압축이 발생 하면 응답이 압축 될 때 본문 내용이 변경 되기 때문에 Content-Length 헤더가 제거 됩니다.When compression occurs, the Content-Length header is removed, since the body content changes when the response is compressed.
Content-MD5 압축이 발생 하면 본문 내용이 변경 되 고 해시가 더 이상 유효 하지 않기 때문에 Content-MD5 헤더가 제거 됩니다.When compression occurs, the Content-MD5 header is removed, since the body content has changed and the hash is no longer valid.
Content-Type 콘텐츠의 MIME 형식을 지정 합니다.Specifies the MIME type of the content. 모든 응답은 해당 Content-Type을 지정 해야 합니다.Every response should specify its Content-Type. 미들웨어는이 값을 확인 하 여 응답이 압축 되어야 하는지 확인 합니다.The middleware checks this value to determine if the response should be compressed. 미들웨어는 인코딩할 수 있는 기본 MIME 형식의 집합을 지정 하지만 mime 형식을 바꾸거나 추가할 수 있습니다.The middleware specifies a set of default MIME types that it can encode, but you can replace or add MIME types.
Vary 클라이언트 및 프록시에 Accept-Encoding 값을 사용 하 여 서버에서 보낸 경우 Vary 헤더는 요청의 Accept-Encoding 헤더 값을 기준으로 응답을 캐시 (vary) 해야 함을 클라이언트 또는 프록시에 나타냅니다.When sent by the server with a value of Accept-Encoding to clients and proxies, the Vary header indicates to the client or proxy that it should cache (vary) responses based on the value of the Accept-Encoding header of the request. Vary: Accept-Encoding 헤더를 사용 하 여 콘텐츠를 반환한 결과는 압축 된 응답과 압축 되지 않은 응답이 모두 개별적으로 캐시 된다는 것입니다.The result of returning content with the Vary: Accept-Encoding header is that both compressed and uncompressed responses are cached separately.

샘플 앱을 사용 하 여 응답 압축 미들웨어의 기능을 탐색 합니다.Explore the features of the Response Compression Middleware with the sample app. 샘플은 다음을 보여 줍니다.The sample illustrates:

  • Gzip 및 사용자 지정 압축 공급자를 사용 하 여 앱 응답을 압축 합니다.The compression of app responses using Gzip and custom compression providers.
  • Mime 형식을 압축을 위한 MIME 형식의 기본 목록에 추가 하는 방법입니다.How to add a MIME type to the default list of MIME types for compression.

PackagePackage

응답 압축 미들웨어는 ASP.NET Core 앱에 암시적으로 포함 되는 ResponseCompression 패키지에서 제공 됩니다.Response Compression Middleware is provided by the Microsoft.AspNetCore.ResponseCompression package, which is implicitly included in ASP.NET Core apps.

프로젝트에 미들웨어를 포함 하려면 ResponseCompression 패키지를 포함 하는 AspNetCore 메타 패키지에 대 한 참조를 추가 합니다.To include the middleware in a project, add a reference to the Microsoft.AspNetCore.App metapackage, which includes the Microsoft.AspNetCore.ResponseCompression package.

구성Configuration

다음 코드에서는 기본 MIME 형식 및 압축 공급자 (BrotliGzip)에 대 한 응답 압축 미들웨어를 사용 하도록 설정 하는 방법을 보여 줍니다.The following code shows how to enable the Response Compression Middleware for default MIME types and compression providers (Brotli and Gzip):

다음 코드에서는 기본 MIME 형식 및 Gzip 압축 공급자에 대해 응답 압축 미들웨어를 사용 하도록 설정 하는 방법을 보여 줍니다.The following code shows how to enable the Response Compression Middleware for default MIME types and the Gzip Compression Provider:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddResponseCompression();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseResponseCompression();
    }
}

참고:Notes:

  • app.UseResponseCompression app.UseMvc전에 호출 해야 합니다.app.UseResponseCompression must be called before app.UseMvc.
  • Fiddler, Firebug또는 postman 과 같은 도구를 사용 하 여 Accept-Encoding 요청 헤더를 설정 하 고 응답 헤더, 크기 및 본문을 연구 합니다.Use a tool such as Fiddler, Firebug, or Postman to set the Accept-Encoding request header and study the response headers, size, and body.

Accept-Encoding 헤더를 제외 하 고 샘플 앱에 요청을 제출 하 고 응답이 압축 되지 않은 상태 인지 확인 합니다.Submit a request to the sample app without the Accept-Encoding header and observe that the response is uncompressed. Content-EncodingVary 헤더가 응답에 없습니다.The Content-Encoding and Vary headers aren't present on the response.

수락 인코딩 헤더가 없는 요청 결과를 보여 주는 Fiddler 창

Accept-Encoding: br 헤더 (Brotli 압축)를 사용 하 여 샘플 앱에 요청을 제출 하 고 응답이 압축 되는지 확인 합니다.Submit a request to the sample app with the Accept-Encoding: br header (Brotli compression) and observe that the response is compressed. Content-EncodingVary 헤더가 응답에 표시 됩니다.The Content-Encoding and Vary headers are present on the response.

허용 인코딩 헤더와 값이 br 인 요청 결과를 보여 주는 Fiddler 창입니다.

Accept-Encoding: gzip 헤더를 사용 하 여 샘플 앱에 요청을 제출 하 고 응답이 압축 되는지 확인 합니다.Submit a request to the sample app with the Accept-Encoding: gzip header and observe that the response is compressed. Content-EncodingVary 헤더가 응답에 표시 됩니다.The Content-Encoding and Vary headers are present on the response.

허용 인코딩 헤더와 값이 포함 된 요청의 결과를 보여 주는 Fiddler 창입니다.

공급자Providers

Brotli 압축 공급자Brotli Compression Provider

BrotliCompressionProvider를 사용 하 여 Brotli 압축 된 데이터 형식의응답을 압축 합니다.Use the BrotliCompressionProvider to compress responses with the Brotli compressed data format.

CompressionProviderCollection에 명시적으로 추가 된 압축 공급자가 없으면:If no compression providers are explicitly added to the CompressionProviderCollection:

  • Brotli 압축 공급자는 기본적으로 Gzip 압축 공급자와 함께 압축 공급자 배열에 추가 됩니다.The Brotli Compression Provider is added by default to the array of compression providers along with the Gzip compression provider.
  • 클라이언트에서 Brotli 압축 데이터 형식이 지원 되는 경우 압축의 기본값은 Brotli 압축입니다.Compression defaults to Brotli compression when the Brotli compressed data format is supported by the client. 클라이언트에서 Brotli을 지원 하지 않는 경우 클라이언트에서 Gzip 압축을 지 원하는 경우 압축의 기본값은 Gzip입니다.If Brotli isn't supported by the client, compression defaults to Gzip when the client supports Gzip compression.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

압축 공급자가 명시적으로 추가 되 면 Brotoli 압축 공급자를 추가 해야 합니다.The Brotoli Compression Provider must be added when any compression providers are explicitly added:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

BrotliCompressionProviderOptions압축 수준을 설정 합니다.Set the compression level with BrotliCompressionProviderOptions. Brotli 압축 공급자는 기본적으로 가장 빠른 압축 수준 (CompressionLevel)으로 설정 되며,이는 가장 효율적인 압축을 생성 하지 않을 수 있습니다.The Brotli Compression Provider defaults to the fastest compression level (CompressionLevel.Fastest), which might not produce the most efficient compression. 가장 효율적인 압축이 필요한 경우 최적의 압축을 위해 미들웨어를 구성 합니다.If the most efficient compression is desired, configure the middleware for optimal compression.

압축 수준Compression Level 설명Description
CompressionLevel.FastestCompressionLevel.Fastest 결과 출력이 최적으로 압축 되지 않은 경우에도 압축이 최대한 빨리 완료 되어야 합니다.Compression should complete as quickly as possible, even if the resulting output isn't optimally compressed.
CompressionLevel.NoCompressionCompressionLevel.NoCompression 압축을 수행할 수 없습니다.No compression should be performed.
CompressionLevel.OptimalCompressionLevel.Optimal 압축을 완료 하는 데 더 많은 시간이 소요 되는 경우에도 응답은 최적으로 압축 되어야 합니다.Responses should be optimally compressed, even if the compression takes more time to complete.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<BrotliCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

Gzip 압축 공급자Gzip Compression Provider

GzipCompressionProvider를 사용 하 여 Gzip 파일 형식으로 응답을 압축 합니다.Use the GzipCompressionProvider to compress responses with the Gzip file format.

CompressionProviderCollection에 명시적으로 추가 된 압축 공급자가 없으면:If no compression providers are explicitly added to the CompressionProviderCollection:

  • Gzip 압축 공급자는 기본적으로 Brotli 압축공급자와 함께 압축 공급자 배열에 추가 됩니다.The Gzip Compression Provider is added by default to the array of compression providers along with the Brotli Compression Provider.
  • 클라이언트에서 Brotli 압축 데이터 형식이 지원 되는 경우 압축의 기본값은 Brotli 압축입니다.Compression defaults to Brotli compression when the Brotli compressed data format is supported by the client. 클라이언트에서 Brotli을 지원 하지 않는 경우 클라이언트에서 Gzip 압축을 지 원하는 경우 압축의 기본값은 Gzip입니다.If Brotli isn't supported by the client, compression defaults to Gzip when the client supports Gzip compression.
  • Gzip 압축 공급자는 기본적으로 압축 공급자 배열에 추가 됩니다.The Gzip Compression Provider is added by default to the array of compression providers.
  • 클라이언트에서 Gzip 압축을 지 원하는 경우 압축의 기본값은 Gzip입니다.Compression defaults to Gzip when the client supports Gzip compression.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();
}

모든 압축 공급자가 명시적으로 추가 되 면 Gzip 압축 공급자를 추가 해야 합니다.The Gzip Compression Provider must be added when any compression providers are explicitly added:

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

GzipCompressionProviderOptions압축 수준을 설정 합니다.Set the compression level with GzipCompressionProviderOptions. Gzip 압축 공급자는 기본적으로 가장 빠른 압축 수준 (CompressionLevel)으로 설정 되며이는 가장 효율적인 압축을 생성 하지 않을 수 있습니다.The Gzip Compression Provider defaults to the fastest compression level (CompressionLevel.Fastest), which might not produce the most efficient compression. 가장 효율적인 압축이 필요한 경우 최적의 압축을 위해 미들웨어를 구성 합니다.If the most efficient compression is desired, configure the middleware for optimal compression.

압축 수준Compression Level 설명Description
CompressionLevel.FastestCompressionLevel.Fastest 결과 출력이 최적으로 압축 되지 않은 경우에도 압축이 최대한 빨리 완료 되어야 합니다.Compression should complete as quickly as possible, even if the resulting output isn't optimally compressed.
CompressionLevel.NoCompressionCompressionLevel.NoCompression 압축을 수행할 수 없습니다.No compression should be performed.
CompressionLevel.OptimalCompressionLevel.Optimal 압축을 완료 하는 데 더 많은 시간이 소요 되는 경우에도 응답은 최적으로 압축 되어야 합니다.Responses should be optimally compressed, even if the compression takes more time to complete.
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression();

    services.Configure<GzipCompressionProviderOptions>(options => 
    {
        options.Level = CompressionLevel.Fastest;
    });
}

사용자 지정 공급자Custom providers

ICompressionProvider를 사용 하 여 사용자 지정 압축 구현을 만듭니다.Create custom compression implementations with ICompressionProvider. EncodingName는이 ICompressionProvider 생성 하는 콘텐츠 인코딩을 나타냅니다.The EncodingName represents the content encoding that this ICompressionProvider produces. 미들웨어는이 정보를 사용 하 여 요청의 Accept-Encoding 헤더에 지정 된 목록에 따라 공급자를 선택 합니다.The middleware uses this information to choose the provider based on the list specified in the Accept-Encoding header of the request.

클라이언트는 샘플 앱을 사용 하 여 Accept-Encoding: mycustomcompression 헤더를 사용 하 여 요청을 제출 합니다.Using the sample app, the client submits a request with the Accept-Encoding: mycustomcompression header. 미들웨어는 사용자 지정 압축 구현을 사용 하 고 Content-Encoding: mycustomcompression 헤더가 포함 된 응답을 반환 합니다.The middleware uses the custom compression implementation and returns the response with a Content-Encoding: mycustomcompression header. 클라이언트는 사용자 지정 압축 구현이 작동 하기 위해 사용자 지정 인코딩의 압축을 해제할 수 있어야 합니다.The client must be able to decompress the custom encoding in order for a custom compression implementation to work.

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Create a custom compression stream wrapper here
        return outputStream;
    }
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public class CustomCompressionProvider : ICompressionProvider
{
    public string EncodingName => "mycustomcompression";
    public bool SupportsFlush => true;

    public Stream CreateStream(Stream outputStream)
    {
        // Create a custom compression stream wrapper here
        return outputStream;
    }
}

Accept-Encoding: mycustomcompression 헤더를 사용 하 여 샘플 앱에 요청을 제출 하 고 응답 헤더를 관찰 합니다.Submit a request to the sample app with the Accept-Encoding: mycustomcompression header and observe the response headers. VaryContent-Encoding 헤더가 응답에 표시 됩니다.The Vary and Content-Encoding headers are present on the response. 응답 본문 (표시 되지 않음)은 샘플에 의해 압축 되지 않습니다.The response body (not shown) isn't compressed by the sample. 샘플의 CustomCompressionProvider 클래스에는 압축 구현이 없습니다.There isn't a compression implementation in the CustomCompressionProvider class of the sample. 그러나이 샘플에서는 이러한 압축 알고리즘을 구현 하는 위치를 보여 줍니다.However, the sample shows where you would implement such a compression algorithm.

Fiddler 헤더를 포함 하는 요청 결과와 mycustomcompression 값을 보여 주는 창

MIME 형식MIME types

미들웨어는 압축을 위한 기본 MIME 형식 집합을 지정 합니다.The middleware specifies a default set of MIME types for compression:

  • application/javascript
  • application/json
  • application/xml
  • text/css
  • text/html
  • text/json
  • text/plain
  • text/xml

MIME 형식을 응답 압축 미들웨어 옵션으로 바꾸거나 추가 합니다.Replace or append MIME types with the Response Compression Middleware options. text/*와 같은 와일드 카드 MIME 형식은 지원 되지 않습니다.Note that wildcard MIME types, such as text/* aren't supported. 샘플 앱은 image/svg+xml에 대 한 MIME 형식을 추가 하 고 압축 하 여 ASP.NET Core 배너 이미지 (배너나)를 제공 합니다.The sample app adds a MIME type for image/svg+xml and compresses and serves the ASP.NET Core banner image (banner.svg).

public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}
public void ConfigureServices(IServiceCollection services)
{
    services.AddResponseCompression(options =>
    {
        options.Providers.Add<BrotliCompressionProvider>();
        options.Providers.Add<GzipCompressionProvider>();
        options.Providers.Add<CustomCompressionProvider>();
        options.MimeTypes = 
            ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "image/svg+xml" });
    });
}

보안 프로토콜을 사용한 압축Compression with secure protocol

보안 연결을 통한 압축 된 응답은 기본적으로 사용 하지 않도록 설정 된 EnableForHttps 옵션을 사용 하 여 제어할 수 있습니다.Compressed responses over secure connections can be controlled with the EnableForHttps option, which is disabled by default. 동적으로 생성 된 페이지에서 압축을 사용 하면 범죄위반 공격과 같은 보안 문제가 발생할 수 있습니다.Using compression with dynamically generated pages can lead to security problems such as the CRIME and BREACH attacks.

Vary 헤더 추가Adding the Vary header

Accept-Encoding 헤더를 기반으로 응답을 압축 하는 경우 여러 압축 버전의 응답 및 압축 되지 않은 버전이 있을 수 있습니다.When compressing responses based on the Accept-Encoding header, there are potentially multiple compressed versions of the response and an uncompressed version. 여러 버전이 존재 하 고 저장 해야 함을 클라이언트 및 프록시 캐시에 지시 하기 위해 Vary 헤더가 Accept-Encoding 값으로 추가 됩니다.In order to instruct client and proxy caches that multiple versions exist and should be stored, the Vary header is added with an Accept-Encoding value. ASP.NET Core 2.0 이상에서 미들웨어는 응답이 압축 될 때 Vary 헤더를 자동으로 추가 합니다.In ASP.NET Core 2.0 or later, the middleware adds the Vary header automatically when the response is compressed.

Nginx 역방향 프록시 뒤에 있는 미들웨어 문제Middleware issue when behind an Nginx reverse proxy

Nginx에서 요청을 프록시 하는 경우에는 Accept-Encoding 헤더가 제거 됩니다.When a request is proxied by Nginx, the Accept-Encoding header is removed. Accept-Encoding 헤더를 제거 하면 미들웨어가 응답을 압축 하지 않습니다.Removal of the Accept-Encoding header prevents the middleware from compressing the response. 자세한 내용은 NGINX: 압축 및압축 해제를 참조 하세요.For more information, see NGINX: Compression and Decompression. 이 문제는 Nginx (aspnet/BasicMiddleware #123)에 대 한 통과 압축을 통해 추적 됩니다.This issue is tracked by Figure out pass-through compression for Nginx (aspnet/BasicMiddleware #123).

IIS 동적 압축 사용Working with IIS dynamic compression

앱에 대해 사용 하지 않도록 설정할 서버 수준에서 활성 IIS 동적 압축 모듈이 구성 된 경우 web.config 파일에 추가 하 여 모듈을 사용 하지 않도록 설정 합니다.If you have an active IIS Dynamic Compression Module configured at the server level that you would like to disable for an app, disable the module with an addition to the web.config file. 보다 자세한 내용은 IIS 모듈 비활성화를 참고하시기 바랍니다.For more information, see Disabling IIS modules.

문제 해결Troubleshooting

Accept-Encoding 요청 헤더를 설정 하 고 응답 헤더, 크기 및 본문을 학습할 수 있는 Fiddler, Firebug또는 postman과 같은 도구를 사용 합니다.Use a tool like Fiddler, Firebug, or Postman, which allow you to set the Accept-Encoding request header and study the response headers, size, and body. 기본적으로 응답 압축 미들웨어는 다음 조건을 충족 하는 응답을 압축 합니다.By default, Response Compression Middleware compresses responses that meet the following conditions:

  • Accept-Encoding 헤더는 설정 된 사용자 지정 압축 공급자와 일치 하는 br, gzip, *또는 사용자 지정 인코딩의 값과 함께 제공 됩니다.The Accept-Encoding header is present with a value of br, gzip, *, or custom encoding that matches a custom compression provider that you've established. 값을 identity 하거나 품질 값 (qvalue, q)을 0 (영)으로 설정 하지 않아야 합니다.The value must not be identity or have a quality value (qvalue, q) setting of 0 (zero).
  • MIME 형식 (Content-Type)을 설정 하 고 ResponseCompressionOptions에 구성 된 MIME 형식과 일치 해야 합니다.The MIME type (Content-Type) must be set and must match a MIME type configured on the ResponseCompressionOptions.
  • 요청은 Content-Range 헤더를 포함 하지 않아야 합니다.The request must not include the Content-Range header.
  • 응답 압축 미들웨어 옵션에 보안 프로토콜 (https)이 구성 되지 않은 경우 요청은 안전 하지 않은 프로토콜 (http)을 사용 해야 합니다.The request must use insecure protocol (http), unless secure protocol (https) is configured in the Response Compression Middleware options. 보안 콘텐츠 압축을 사용 하도록 설정할 때 위에서 설명한 위험에 유의 하십시오.Note the danger described above when enabling secure content compression.
  • 설정 된 사용자 지정 압축 공급자와 일치 하는 gzip, *또는 사용자 지정 인코딩의 값이 Accept-Encoding 헤더가 있습니다.The Accept-Encoding header is present with a value of gzip, *, or custom encoding that matches a custom compression provider that you've established. 값을 identity 하거나 품질 값 (qvalue, q)을 0 (영)으로 설정 하지 않아야 합니다.The value must not be identity or have a quality value (qvalue, q) setting of 0 (zero).
  • MIME 형식 (Content-Type)을 설정 하 고 ResponseCompressionOptions에 구성 된 MIME 형식과 일치 해야 합니다.The MIME type (Content-Type) must be set and must match a MIME type configured on the ResponseCompressionOptions.
  • 요청은 Content-Range 헤더를 포함 하지 않아야 합니다.The request must not include the Content-Range header.
  • 응답 압축 미들웨어 옵션에 보안 프로토콜 (https)이 구성 되지 않은 경우 요청은 안전 하지 않은 프로토콜 (http)을 사용 해야 합니다.The request must use insecure protocol (http), unless secure protocol (https) is configured in the Response Compression Middleware options. 보안 콘텐츠 압축을 사용 하도록 설정할 때 위에서 설명한 위험에 유의 하십시오.Note the danger described above when enabling secure content compression.

추가 자료Additional resources