ASP.NET Core에서 HTTP.sys 웹 서버 구현HTTP.sys web server implementation in ASP.NET Core

작성자: Tom Dykstra, Chris Ross, Luke LathamBy Tom Dykstra, Chris Ross, and Luke Latham

참고

이 주제는 ASP.NET Core 2.0 이상에 적용됩니다.This topic applies to ASP.NET Core 2.0 or later. 이전 버전의 ASP.NET Core에서 HTTP.sys는 WebListener라고 합니다.In earlier versions of ASP.NET Core, HTTP.sys is named WebListener.

HTTP.sys는 Windows에서만 실행되는 ASP.NET Core에 대한 웹 서버입니다.HTTP.sys is a web server for ASP.NET Core that only runs on Windows. HTTP.sys는 Kestrel에 대한 대안이며 Kestel이 제공하지 않는 일부 기능을 제공합니다.HTTP.sys is an alternative to Kestrel and offers some features that Kestrel doesn't provide.

중요

HTTP.sys는 ASP.NET Core 모듈과 호환되지 않으므로 IIS 또는 IIS Express와 함께 사용될 수 없습니다.HTTP.sys is incompatible with the ASP.NET Core Module and can't be used with IIS or IIS Express.

HTTP.sys는 다음과 같은 기능을 지원합니다.HTTP.sys supports the following features:

  • Windows 인증Windows Authentication
  • 포트 공유Port sharing
  • SNI를 사용하는 HTTPSHTTPS with SNI
  • TLS를 통한 HTTP/2(Windows 10 이상)HTTP/2 over TLS (Windows 10 or later)
  • 직접 파일 전송Direct file transmission
  • 응답 캐싱Response caching
  • WebSockets(Windows 8 이상)WebSockets (Windows 8 or later)

지원되는 Windows 버전:Supported Windows versions:

  • Windows 7 이상Windows 7 or later
  • Windows Server 2008 R2 이상Windows Server 2008 R2 or later

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

HTTP.sys를 사용하는 경우When to use HTTP.sys

HTTP.sys는 다음과 같은 배포에 유용합니다.HTTP.sys is useful for deployments where:

  • IIS를 사용하지 않고 인터넷에 서버를 직접 노출해야 하는 경우There's a need to expose the server directly to the Internet without using IIS.

    HTTP.sys는 인터넷과 직접 통신합니다.

  • 내부 배포에는 Windows 인증처럼 Kestrel에서 사용할 수 없는 기능이 필요합니다.An internal deployment requires a feature not available in Kestrel, such as Windows Authentication.

    HTTP.sys는 내부 네트워크와 직접 통신합니다.

HTTP.sys는 많은 유형의 공격으로부터 보호하고 모든 기능을 갖춘 웹 서버의 견고성, 보안 및 확장성을 제공하는 완성도 높은 기술입니다.HTTP.sys is mature technology that protects against many types of attacks and provides the robustness, security, and scalability of a full-featured web server. IIS 자체는 HTTP.sys 위에 HTTP 수신기로 실행됩니다.IIS itself runs as an HTTP listener on top of HTTP.sys.

HTTP.sys 사용 방법How to use HTTP.sys

HTTP.sys를 사용하도록 ASP.NET Core 앱 구성Configure the ASP.NET Core app to use HTTP.sys

  1. Microsoft.AspNetCore.All 메타패키지(nuget.org)(ASP.NET Core 2.0 이상)를 사용할 경우 프로젝트 파일의 패키지 참조가 필요하지 않습니다.A package reference in the project file isn't required when using the Microsoft.AspNetCore.All metapackage (nuget.org) (ASP.NET Core 2.0 or later). Microsoft.AspNetCore.All 메타패키지를 사용하지 않는 경우 Microsoft.AspNetCore.Server.HttpSys에 패키지 참조를 추가합니다.When not using the Microsoft.AspNetCore.All metapackage, add a package reference to Microsoft.AspNetCore.Server.HttpSys.

  2. 웹 호스트를 빌드할 때 UseHttpSys 확장 메서드를 호출하여 필요한 HTTP.sys 옵션을 지정합니다.Call the UseHttpSys extension method when building the web host, specifying any required HTTP.sys options:

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseHttpSys(options =>
            {
                // The following options are set to default values.
                options.Authentication.Schemes = AuthenticationSchemes.None;
                options.Authentication.AllowAnonymous = true;
                options.MaxConnections = null;
                options.MaxRequestBodySize = 30000000;
                options.UrlPrefixes.Add("http://localhost:5000");
            });
    

    추가 HTTP.sys 구성은 레지스트리 설정을 통해 처리됩니다.Additional HTTP.sys configuration is handled through registry settings.

    HTTP.sys 옵션HTTP.sys options

    속성Property 설명Description 기본Default
    AllowSynchronousIOAllowSynchronousIO HttpContext.Request.BodyHttpContext.Response.Body에 대해 동기 입력/출력이 허용되는지 여부를 제어합니다.Control whether synchronous input/output is allowed for the HttpContext.Request.Body and HttpContext.Response.Body. true
    Authentication.AllowAnonymousAuthentication.AllowAnonymous 익명 요청을 허용합니다.Allow anonymous requests. true
    Authentication.SchemesAuthentication.Schemes 허용되는 인증 체계를 지정합니다.Specify the allowed authentication schemes. 수신기를 삭제하기 전에 언제든지 수정할 수 있습니다.May be modified at any time prior to disposing the listener. 값은 AuthenticationSchemes 열거형: Basic, Kerberos, Negotiate, None, NTLM에서 제공됩니다.Values are provided by the AuthenticationSchemes enum: Basic, Kerberos, Negotiate, None, and NTLM. None
    EnableResponseCachingEnableResponseCaching 적합한 헤더가 있는 응답에 대해 커널 모드 캐싱을 시도합니다.Attempt kernel-mode caching for responses with eligible headers. 응답에 Set-Cookie, Vary 또는 Pragma 헤더가 포함될 수 없습니다.The response may not include Set-Cookie, Vary, or Pragma headers. publicshared-max-age 또는 max-age 값인 Cache-Control 헤더나 Expires 헤더가 포함되어야 합니다.It must include a Cache-Control header that's public and either a shared-max-age or max-age value, or an Expires header. true
    MaxAcceptsMaxAccepts 최대 동시 승인 수입니다.The maximum number of concurrent accepts. 5 × Environment.
    ProcessorCount
    5 × Environment.
    ProcessorCount
    MaxConnectionsMaxConnections 허용되는 최대 동시 연결 수입니다.The maximum number of concurrent connections to accept. 무한의 경우 -1을 사용합니다.Use -1 for infinite. 레지스트리의 시스템 수준 설정을 사용하려면 null을 사용합니다.Use null to use the registry's machine-wide setting. null
    (제한 없음)(unlimited)
    MaxRequestBodySizeMaxRequestBodySize MaxRequestBodySize 섹션을 참조하세요.See the MaxRequestBodySize section. 30000000바이트30000000 bytes
    (~28.6MB)(~28.6 MB)
    RequestQueueLimitRequestQueueLimit 큐에 대기할 수 있는 최대 요청 수입니다.The maximum number of requests that can be queued. 10001000
    ThrowWriteExceptionsThrowWriteExceptions 클라이언트 연결 해제로 인해 실패한 응답 본문 쓰기가 예외를 throw하거나 정상적으로 완료되어야 하는지 여부를 나타납니다.Indicate if response body writes that fail due to client disconnects should throw exceptions or complete normally. false
    (정상적으로 완료)(complete normally)
    TimeoutsTimeouts 레지스트리에 구성될 수도 있는 HTTP.sys TimeoutManager 구성을 표시합니다.Expose the HTTP.sys TimeoutManager configuration, which may also be configured in the registry. API 링크를 따라 기본값을 포함하여 각 설정에 대해 자세히 알아보세요.Follow the API links to learn more about each setting, including default values:
    UrlPrefixesUrlPrefixes UrlPrefixCollection을 지정하여 HTTP.sys를 등록합니다.Specify the UrlPrefixCollection to register with HTTP.sys. 컬렉션에 접두사를 추가하는 데 사용되는 UrlPrefixCollection.Add가 가장 유용합니다.The most useful is UrlPrefixCollection.Add, which is used to add a prefix to the collection. 이러한 API는 수신기를 삭제하기 전에 언제든지 수정할 수 있습니다.These may be modified at any time prior to disposing the listener.

    MaxRequestBodySizeMaxRequestBodySize

    요청 본문에 대해 허용되는 최대 크기(바이트)입니다.The maximum allowed size of any request body in bytes. null로 설정하면 최대 요청 본문 크기는 무제한입니다.When set to null, the maximum request body size is unlimited. 항상 무제한인 업그레이드된 연결에는 이 제한이 영향을 미치지 않습니다.This limit has no effect on upgraded connections, which are always unlimited.

    단일 IActionResult에 대해 ASP.NET Core MVC 앱에서 제한을 재정의할 때는 작업 메서드에서 RequestSizeLimitAttribute 특성을 사용하는 방법이 좋습니다.The recommended method to override the limit in an ASP.NET Core MVC app for a single IActionResult is to use the RequestSizeLimitAttribute attribute on an action method:

    [RequestSizeLimit(100000000)]
    public IActionResult MyActionMethod()
    

    앱에서 요청을 읽기 시작한 후 요청에 대한 제한을 구성하려고 하면 예외가 throw됩니다.An exception is thrown if the app attempts to configure the limit on a request after the app has started reading the request. IsReadOnly 속성을 사용하여 MaxRequestBodySize 속성이 제한을 구성하기에 너무 늦은, 읽기 전용 상태인지를 나타낼 수 있습니다.An IsReadOnly property can be used to indicate if the MaxRequestBodySize property is in a read-only state, meaning it's too late to configure the limit.

    앱에서 요청별로 MaxRequestBodySize를 재정의해야 하는 경우 IHttpMaxRequestBodySizeFeature를 사용합니다.If the app should override MaxRequestBodySize per-request, use the IHttpMaxRequestBodySizeFeature:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
        ILogger<Startup> logger)
    {
        app.Use(async (context, next) =>
        {
            context.Features.Get<IHttpMaxRequestBodySizeFeature>()
                .MaxRequestBodySize = 10 * 1024;
    
            var serverAddressesFeature = app.ServerFeatures.Get<IServerAddressesFeature>();
            var addresses = string.Join(", ", serverAddressesFeature?.Addresses);
    
            logger.LogInformation($"Addresses: {addresses}");
    
            await next.Invoke();
        });
    
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }
    
        // Enable HTTPS Redirection Middleware when hosting the app securely.
        //app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseMvc();
    }
    
  3. Visual Studio를 사용하는 경우 앱이 IIS 또는 IIS Express를 실행하도록 구성되지 않았는지 확인합니다.If using Visual Studio, make sure the app isn't configured to run IIS or IIS Express.

    Visual Studio에서 기본 실행 프로필은 IIS Express용입니다.In Visual Studio, the default launch profile is for IIS Express. 프로젝트를 콘솔 앱으로 실행하려면 다음 스크린샷에 표시된 것처럼 선택한 프로필을 수동으로 변경합니다.To run the project as a console app, manually change the selected profile, as shown in the following screen shot:

    콘솔 앱 프로필 선택

Windows Server 구성Configure Windows Server

  1. 앱이 프레임워크 종속 배포인 경우 .NET Core, .NET Framework 또는 둘 다(앱이 NET Framework를 대상으로 하는 .NET Core 앱인 경우)를 설치합니다.If the app is a framework-dependent deployment, install .NET Core, .NET Framework, or both (if the app is a .NET Core app targeting the .NET Framework).

    • .NET Core – 앱에 .NET Core가 필요한 경우 .NET 모든 다운로드에서 .NET Core 설치 관리자를 가져와 실행합니다..NET Core – If the app requires .NET Core, obtain and run the .NET Core installer from .NET All Downloads.
    • .NET Framework – 앱에 .NET Framework가 필요한 경우 .NET Framework: 설치 가이드를 참조하여 설치 지침을 확인합니다..NET Framework – If the app requires .NET Framework, see .NET Framework: Installation guide to find installation instructions. 필수 .NET Framework를 설치합니다.Install the required .NET Framework. 최신 .NET Framework의 설치 관리자는 .NET 모든 다운로드에서 찾을 수 있습니다.The installer for the latest .NET Framework can be found at .NET All Downloads.
  2. 앱에 대한 URL 및 포트를 구성합니다.Configure URLs and ports for the app.

    기본적으로 ASP.NET Core는 http://localhost:5000으로 바인딩합니다.By default, ASP.NET Core binds to http://localhost:5000. URL 접두사 및 포트를 구성하려면 다음을 사용하는 옵션이 포함됩니다.To configure URL prefixes and ports, options include using:

    다음 코드 예제에서는 UrlPrefixes를 사용하는 방법을 보여줍니다.The following code example shows how to use UrlPrefixes:

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseHttpSys(options =>
            {
                // The following options are set to default values.
                options.Authentication.Schemes = AuthenticationSchemes.None;
                options.Authentication.AllowAnonymous = true;
                options.MaxConnections = null;
                options.MaxRequestBodySize = 30000000;
                options.UrlPrefixes.Add("http://localhost:5000");
            });
    

    UrlPrefixes의 장점은 형식이 잘못된 접두사에 대해 오류 메시지가 즉시 생성된다는 점입니다.An advantage of UrlPrefixes is that an error message is generated immediately for improperly formatted prefixes.

    UrlPrefixes의 설정은 UseUrls/urls/ASPNETCORE_URLS 설정을 재정의합니다.The settings in UrlPrefixes override UseUrls/urls/ASPNETCORE_URLS settings. 따라서 UseUrls, urlsASPNETCORE_URLS 환경 변수의 장점은 Kestrel과 HTTP.sys 간을 쉽게 전환할 수 있다는 점입니다.Therefore, an advantage of UseUrls, urls, and the ASPNETCORE_URLS environment variable is that it's easier to switch between Kestrel and HTTP.sys. UseUrls, urlsASPNETCORE_URLS에 대한 자세한 내용은 ASP.NET Core의 호스트 항목을 참조하세요.For more information on UseUrls, urls, and ASPNETCORE_URLS, see the Host in ASP.NET Core topic.

    HTTP.sys는 HTTP Server API UrlPrefix 문자열 형식을 사용합니다.HTTP.sys uses the HTTP Server API UrlPrefix string formats.

    경고

    최상위 와일드카드 바인딩(http://*:80/http://+:80)을 사용하지 않아야 합니다.Top-level wildcard bindings (http://*:80/ and http://+:80) should not be used. 최상위 와일드카드 바인딩은 보안 취약점에 앱을 노출시킬 수 있습니다.Top-level wildcard bindings can open up your app to security vulnerabilities. 강력한 와일드카드와 약한 와일드카드 모두에 적용됩니다.This applies to both strong and weak wildcards. 와일드카드보다는 명시적 호스트 이름을 사용합니다.Use explicit host names rather than wildcards. 전체 부모 도메인을 제어하는 경우 하위 도메인 와일드카드 바인딩(예: *.mysub.com)에는 이러한 보안 위험이 없습니다(취약한 *.com과 반대임).Subdomain wildcard binding (for example, *.mysub.com) doesn't have this security risk if you control the entire parent domain (as opposed to *.com, which is vulnerable). 자세한 내용은 rfc7230 섹션-5.4를 참조하세요.See rfc7230 section-5.4 for more information.

  3. URL 접두사를 미리 등록하여 HTTP.sys에 대해 바인딩하고 x.509 인증서를 설정합니다.Preregister URL prefixes to bind to HTTP.sys and set up x.509 certificates.

    URL 접두사가 Windows에 미리 등록되어 있지 않은 경우 관리자 권한으로 앱을 실행합니다.If URL prefixes aren't preregistered in Windows, run the app with administrator privileges. 1024보다 큰 포트 번호로 HTTP(HTTPS 아님)를 사용하여 localhost에 바인딩하는 경우에만The only exception is when binding to localhost using HTTP (not HTTPS) with a port number greater than 1024. 관리자 권한이 필요하지 않습니다.In that case, administrator privileges aren't required.

    1. HTTP.sys 구성에 대한 기본 제공 도구는 netsh.exe입니다.The built-in tool for configuring HTTP.sys is netsh.exe. netsh.exe는 URL 접두사를 예약하고 X.509 인증서를 할당하는 데 사용됩니다.netsh.exe is used to reserve URL prefixes and assign X.509 certificates. 도구를 사용하려면 관리자 권한이 필요합니다.The tool requires administrator privileges.

      다음 예제에서는 포트 80 및 443에 대해 URL 접두사를 예약하는 명령을 보여줍니다.The following example shows the commands to reserve URL prefixes for ports 80 and 443:

      netsh http add urlacl url=http://+:80/ user=Users
      netsh http add urlacl url=https://+:443/ user=Users
      

      다음 예제에서는 X.509 인증서를 할당하는 방법을 보여줍니다.The following example shows how to assign an X.509 certificate:

      netsh http add sslcert ipport=0.0.0.0:443 certhash=MyCertHash_Here appid="{00000000-0000-0000-0000-000000000000}"
      

      netsh.exe에 대한 참조 문서입니다.Reference documentation for netsh.exe:

    2. 필요한 경우, 자체 서명 X.509 인증서를 생성합니다.Create self-signed X.509 certificates, if required.

      Windows에서 자체 서명된 인증서는 New-SelfSignedCertificate PowerShell cmdlet을 사용하여 만들 수 있습니다. 지원되지 않는 예는 UpdateIISExpressSSLForChrome.ps1을 참조하세요.

      macOS, Linux 및 Windows에서는 OpenSSL을 사용하여 인증서를 만들 수 있습니다.

  4. 방화벽 포트를 열어 HTTP.sys에 도달하는 트래픽을 허용합니다.Open firewall ports to allow traffic to reach HTTP.sys. netsh.exe 또는 PowerShell cmdlet을 사용합니다.Use netsh.exe or PowerShell cmdlets.

프록시 서버 및 부하 분산 장치 시나리오Proxy server and load balancer scenarios

인터넷 또는 회사 네트워크의 요청과 상호 작용하는 HTTP.sys에서 호스팅하는 앱의 경우, 프록시 서버 및 부하 분산 장치 뒤에서 호스팅할 때 추가 구성이 필요할 수 있습니다.For apps hosted by HTTP.sys that interact with requests from the Internet or a corporate network, additional configuration might be required when hosting behind proxy servers and load balancers. 자세한 내용은 프록시 서버 및 부하 분산 장치를 사용하도록 ASP.NET Core 구성을 참조하세요.For more information, see Configure ASP.NET Core to work with proxy servers and load balancers.

추가 자료Additional resources