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

작성자: Tom DykstraChris RossBy Tom Dykstra and Chris Ross

참고

이 주제는 ASP.NET Core 2.0 이상에만 적용됩니다.This topic applies only to ASP.NET Core 2.0 and 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 runs only on Windows. Http.Sys 커널 모드 드라이버를 기반으로 합니다.It's built on the Http.Sys kernel mode driver. HTTP.sys는 Kestel이 하지 않는 일부 기능을 제공하는 Kestrel에 대한 대안입니다.HTTP.sys is an alternative to Kestrel that offers some features that Kestel doesn't. HTTP.sys는 ASP.NET Core 모듈과 호환되지 않으므로 IIS 또는 IIS Express와 함께 사용될 수 없습니다.HTTP.sys can't be used with IIS or IIS Express, as it's incompatible with the ASP.NET Core Module.

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)
  • 직접 파일 전송Direct file transmission
  • 응답 캐싱Response caching
  • WebSockets(Windows 8)WebSockets (Windows 8)

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

  • Windows 7 및 Windows Server 2008 R2 이상Windows 7 and Windows Server 2008 R2 and later

샘플 코드 보기 또는 다운로드(다운로드 방법)View or download sample code (how to download)

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

HTTP.sys는 IIS를 사용하지 않고 인터넷에 서버를 직접 노출해야 하는 배포에 유용합니다.HTTP.sys is useful for deployments where you need to expose the server directly to the Internet without using IIS.

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

Http.Sys를 기반으로 하기 때문에 HTTP.sys는 공격으로부터 보호하기 위한 역방향 프록시 서버가 필요하지 않습니다.Because it's built on Http.Sys, HTTP.sys doesn't require a reverse proxy server for protection against attacks. Http.Sys는 많은 유형의 공격으로부터 보호하고 모든 기능을 갖춘 웹 서버의 견고성, 보안 및 확장성을 제공하는 완성도 높은 기술입니다.Http.Sys is mature technology that protects against many kinds 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는 Windows 인증과 같이 Kestrel에서 사용할 수 없는 기능이 필요한 경우 내부 배포에 적합한 선택입니다.HTTP.sys is a good choice for internal deployments when you need a feature not available in Kestrel, such as Windows authentication.

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

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

호스트 OS 및 사용자의 ASP.NET Core 응용 프로그램에 대한 설치 작업의 개요입니다.Here's an overview of setup tasks for the host OS and your ASP.NET Core application.

Windows Server 구성Configure Windows Server

  • .NET Core 또는 .NET Framework와 같은 응용 프로그램에 필요한 .NET 버전을 설치합니다.Install the version of .NET that your application requires, such as .NET Core or .NET Framework.

  • HTTP.sys에 대해 바인딩하고 SSL 인증서를 설정하도록 URL 접두사 미리 등록Preregister URL prefixes to bind to HTTP.sys, and set up SSL certificates

    Windows에서 URL 접두사를 미리 등록하지 않은 경우 관리자 권한으로 응용 프로그램을 실행해야 합니다.If you don't preregister URL prefixes in Windows, you have to run your application with administrator privileges. 유일한 예외는 포트 번호가 1024보다 큰 HTTP(HTTPS 아님)를 사용하여 로컬 호스트에 바인딩하는 경우로, 이 경우 관리자 권한은 필요하지 않습니다.The only exception is if you bind to localhost using HTTP (not HTTPS) with a port number greater than 1024; in that case, administrator privileges aren't required.

    자세한 내용은 이 문서의 뒷부분에 나오는 접두사를 미리 등록하고 SSL을 구성하는 방법을 참조하세요.For details, see How to preregister prefixes and configure SSL later in this article.

  • 방화벽 포트를 열어 HTTP.sys에 도달하는 트래픽을 허용합니다.Open firewall ports to allow traffic to reach HTTP.sys.

    netsh.exe 또는 PowerShell cmdlet을 사용할 수 있습니다.You can use netsh.exe or PowerShell cmdlets.

Http.Sys 레지스트리 설정도 있습니다.There are also Http.Sys registry settings.

HTTP.sys를 사용하도록 ASP.NET Core 응용 프로그램 구성Configure your ASP.NET Core application to use HTTP.sys

  • Microsoft.AspNetCore.All 메타패키지를 사용하는 경우에는 패키지를 설치할 필요가 없습니다.No package install is needed if you use the Microsoft.AspNetCore.All metapackage. Microsoft.AspNetCore.Server.HttpSys 패키지는 메타패키지에 포함되어 있습니다.The Microsoft.AspNetCore.Server.HttpSys package is included in the metapackage.

  • 다음 예제와 같이 필요한 HTTP.sys 옵션을 지정하여 Main 메서드에서 WebHostBuilderUseHttpSys 확장 메서드를 호출합니다.Call the UseHttpSys extension method on WebHostBuilder in your Main method, specifying any HTTP.sys options that you need, as shown in the following example:

    public static void Main(string[] args)
    {
        Console.WriteLine("Running demo with HTTP.sys.");
    
        BuildWebHost(args).Run();
    }
    
    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseHttpSys(options =>
            {
                options.Authentication.Schemes = AuthenticationSchemes.None;
                options.Authentication.AllowAnonymous = true;
                options.MaxConnections = 100;
                options.MaxRequestBodySize = 30000000;
                options.UrlPrefixes.Add("http://localhost:5000");
            })
            .Build();
    

HTTP.sys 옵션 구성Configure HTTP.sys options

다음은 몇 가지 구성 가능한 HTTP.sys 설정 및 제한입니다.Here are some of the HTTP.sys settings and limits that you can configure.

최대 클라이언트 연결Maximum client connections

Program.cs의 다음 코드를 사용하여 전체 응용 프로그램에 대한 동시 개방 TCP 연결의 최대 수를 설정할 수 있습니다.The maximum number of concurrent open TCP connections can be set for the entire application with the following code in Program.cs:

.UseHttpSys(options =>
{
    options.Authentication.Schemes = AuthenticationSchemes.None;
    options.Authentication.AllowAnonymous = true;
    options.MaxConnections = 100;
    options.MaxRequestBodySize = 30000000;
    options.UrlPrefixes.Add("http://localhost:5000");
})

연결의 최대 수는 기본적으로 무제한(null)입니다.The maximum number of connections is unlimited (null) by default.

최대 요청 본문 크기Maximum request body size

기본 최대 요청 본문 크기는 약 28.6MB인 30,000,000바이트입니다.The default maximum request body size is 30,000,000 bytes, which is approximately 28.6MB.

ASP.NET Core MVC 앱에서 한도를 재정의할 때는 작업 메서드에서 RequestSizeLimit 특성을 사용하는 방법이 좋습니다.The recommended way to override the limit in an ASP.NET Core MVC app is to use the RequestSizeLimit attribute on an action method:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

다음 예제는 전체 응용 프로그램, 모든 요청에 대한 제약 조건을 구성하는 방법을 보여 줍니다.Here's an example that shows how to configure the constraint for the entire application, every request:

.UseHttpSys(options =>
{
    options.Authentication.Schemes = AuthenticationSchemes.None;
    options.Authentication.AllowAnonymous = true;
    options.MaxConnections = 100;
    options.MaxRequestBodySize = 30000000;
    options.UrlPrefixes.Add("http://localhost:5000");
})

Startup.cs에서 특정 요청에 대한 설정을 재정의할 수 있습니다.You can override the setting on a specific request in Startup.cs:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    var serverAddressesFeature = app.ServerFeatures.Get<IServerAddressesFeature>();

    app.UseStaticFiles();

    app.Run(async (context) =>
    {
        context.Features.Get<IHttpMaxRequestBodySizeFeature>()
            .MaxRequestBodySize = 10 * 1024;

        context.Response.ContentType = "text/html";
        await context.Response.WriteAsync("<p>Hosted by HTTP.sys</p>");

        if (serverAddressesFeature != null)
        {
            await context.Response.WriteAsync($"<p>Listening on the following addresses: {string.Join(", ", serverAddressesFeature.Addresses)}</p>");
        }

        await context.Response.WriteAsync($"<p>Request URL: {context.Request.GetDisplayUrl()}</p>");
    });
}

응용 프로그램에서 요청을 읽기 시작한 후 요청에 대한 제한을 구성하려고 하면 예외가 throw됩니다.An exception is thrown if you try to configure the limit on a request after the application has started reading the request. MaxRequestBodySize 속성이 제한을 구성하기에 너무 늦은, 읽기 전용 상태인지를 알려주는 IsReadOnly 속성이 있습니다.There's an IsReadOnly property that tells you if the MaxRequestBodySize property is in read-only state, meaning it's too late to configure the limit.

다른 HTTP.sys 옵션에 대한 정보는 HttpSysOptions를 참조하세요.For information about other HTTP.sys options, see HttpSysOptions.

수신 대기하는 URL 및 포트 구성Configure URLs and ports to listen on

기본적으로 ASP.NET Core는 http://localhost:5000으로 바인딩합니다.By default ASP.NET Core binds to http://localhost:5000. URL 접두사 및 포트를 구성하려면 HttpSysOptions에서 UseUrls 확장 메서드, urls 명령줄 인수, ASPNETCORE_URLS 환경 변수 또는 UrlPrefixes 속성을 사용할 수 있습니다.To configure URL prefixes and ports, you can use the UseUrls extension method, the urls command-line argument, the ASPNETCORE_URLS environment variable, or the UrlPrefixes property on HttpSysOptions. 다음 코드 예제에서는 UrlPrefixes를 사용합니다.The following code example uses UrlPrefixes.

public static void Main(string[] args)
{
    Console.WriteLine("Running demo with HTTP.sys.");

    BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseHttpSys(options =>
        {
            options.Authentication.Schemes = AuthenticationSchemes.None;
            options.Authentication.AllowAnonymous = true;
            options.MaxConnections = 100;
            options.MaxRequestBodySize = 30000000;
            options.UrlPrefixes.Add("http://localhost:5000");
        })
        .Build();

UrlPrefixes의 이점은 서식이 잘못 지정된 접두사를 추가하려고 하면 오류 메시지가 즉시 표시된다는 점입니다.An advantage of UrlPrefixes is that you get an error message immediately if you try to add a prefix that's formatted wrong. UseUrls(urls 및 ASPNETCORE_URLS과 공유)의 이점은 더 쉽게 Kestrel 및 HTTP.sys 간 전환이 가능하다는 점입니다.An advantage of UseUrls (shared with urls and ASPNETCORE_URLS) is that you can more easily switch between Kestrel and HTTP.sys.

UseUrls(또는 urls 또는 ASPNETCORE_URLS) 및 UrlPrefixes를 모두 사용하는 경우 UrlPrefixes의 설정은 UseUrls의 설정을 재정의합니다.If you use both UseUrls (or urls or ASPNETCORE_URLS) and UrlPrefixes, the settings in UrlPrefixes override the ones in UseUrls. 자세한 내용은 호스팅을 참조하세요.For more information, see Hosting.

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

참고

서버에서 미리 등록한 동일한 접두사 문자열을 UseUrls 또는 UrlPrefixes에서 지정했는지 확인합니다.Make sure that you specify the same prefix strings in UseUrls or UrlPrefixes that you preregister on the server.

IIS 사용 안 함Don't use IIS

응용 프로그램이 IIS 또는 IIS Express를 실행하도록 구성되지 않았는지 확인합니다.Make sure your application 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 application, manually change the selected profile, as shown in the following screen shot.

콘솔 앱 프로필 선택

URL 접두사 미리 등록 및 SSL 구성Preregister URL prefixes and configure SSL

IIS와 HTTP.sys는 모두 기본 Http.Sys 커널 모드 드라이버를 사용하여 요청을 수신하고 초기 처리를 수행합니다.Both IIS and HTTP.sys rely on the underlying Http.Sys kernel mode driver to listen for requests and do initial processing. IIS에서 관리 UI는 모든 항목을 구성하는 상대적으로 쉬운 방법을 제공합니다.In IIS, the management UI gives you a relatively easy way to configure everything. 그러나 Http.Sys는 직접 구성해야 합니다.However, you need to configure Http.Sys yourself. 작업 수행을 위한 기본 도구는 netsh.exe입니다.The built-in tool for doing that's netsh.exe.

netsh.exe를 사용하면 URL 접두사를 예약하고 SSL 인증서를 할당할 수 있습니다.With netsh.exe you can reserve URL prefixes and assign SSL certificates. 도구를 사용하려면 관리 권한이 있어야 합니다.The tool requires administrative privileges.

다음 예제에서는 포트 80 및 443에 대해 URL 접두사를 예약하는 데 필요한 최소한의 것을 보여 줍니다.The following example shows the minimum needed 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

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

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

다음은 netsh.exe에 대한 참조 문서입니다.Here is the reference documentation for netsh.exe:

다음 리소스는 여러 시나리오에 대한 자세한 지침을 제공합니다.The following resources provide detailed instructions for several scenarios. HttpListener를 참조하는 문서는 모두 Http.Sys를 기반으로 하므로 HTTP.sys에 동일하게 적용됩니다.Articles that refer to HttpListener apply equally to HTTP.sys, as both are based on Http.Sys.

다음은 netsh.exe 명령줄보다 쉽게 사용할 수 있는 몇 가지 타사 도구입니다.Here are some third-party tools that can be easier to use than the netsh.exe command line. 이러한 도구는 Microsoft에서 제공되거나 보증되지 않습니다.These are not provided by or endorsed by Microsoft. netsh.exe 자체는 관리자 권한이 필요하므로 도구는 기본적으로 관리자 권한으로 실행됩니다.The tools run as administrator by default, since netsh.exe itself requires administrator privileges.

  • http.sys 관리자는 SSL 인증서 및 옵션, 접두사 예약 및 인증서 신뢰 목록의 나열 및 구성을 위한 UI를 제공합니다.http.sys Manager provides UI for listing and configuring SSL certificates and options, prefix reservations, and certificate trust lists.
  • HttpConfig를 통해 SSL 인증서와 URL 접두사를 나열하거나 구성할 수 있습니다.HttpConfig lets you list or configure SSL certificates and URL prefixes. UI는 http.sys 관리자보다 성능이 우수하며 몇 가지 추가 구성 옵션을 노출하지만 그렇지 않은 경우 유사한 기능을 제공합니다.The UI is more refined than http.sys Manager and exposes a few more configuration options, but otherwise it provides similar functionality. 새 CTL(인증서 신뢰 목록)을 만들 수 없지만 기존 것을 할당할 수 있습니다.It cannot create a new certificate trust list (CTL), but can assign existing ones.

Windows에서 자체 서명 된 SSL 인증서를 생성 하기 위한 PowerShell cmdlet을 사용할 수 있습니다 New-selfsignedcertificate합니다.For generating self-signed SSL certificates on Windows, you can use the PowerShell cmdlet New-SelfSignedCertificate. 쉽게 자체 서명 된 인증서를 생성 하는 타사 도구에 대 한 참조 SelfCert합니다.For a third-party tool that makes it easier for you to generate self-signed certificates, see SelfCert.

MacOS 및 Linux에서 만들 수 있습니다를 사용 하 여 자체 서명 된 인증서를 OpenSSL합니다.On macOS and Linux you can create a self-signed certificate using OpenSSL.

다음 단계Next steps

자세한 내용은 다음 리소스를 참조하세요.For more information, see the following resources: