ASP.NET Core의 WebListener 웹 서버 구현

등록일시: 2017-10-16 08:00,  수정일시: 2017-09-15 00:50
조회수: 6,203
이 문서는 ASP.NET Core 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.
본문에서는 ASP.NET Core 1.x 버전의 WebListener 웹 서버 구현에 관해서 살펴봅니다.
노트

본문의 내용은 ASP.NET Core 1.x에만 적용됩니다. ASP.NET Core 2.0에서는 WebListener의 이름이 HTTP.sys로 변경되었습니다.

WebListener는 Windows 전용 ASP.NET Core 웹 서버로, Http.Sys 커널 모드 드라이버를 기반으로 하고 있습니다. WebListener는 IIS를 역방향 프록시 서버로 사용하지 않고 인터넷에 직접 연결하는 경우 사용 가능한 Kestrel의 대안입니다. 사실, WebListener는 ASP.NET Core 모듈과 호환되지 않기 때문에 IIS 또는 IIS Express와 함께 사용할 수 없습니다.

비록 WebListener 자체는 ASP.NET Core를 위해서 개발됐지만, Microsoft.Net.Http.Server NuGet 패키지를 이용해서 .NET Core 또는 .NET Framework 응용 프로그램에서 직접 사용할 수도 있습니다.

WebListener는 다음의 기능들을 지원합니다:

  • Windows 인증
  • 포트 공유
  • SNI를 지원하는 HTTPS
  • TLS를 이용한 HTTP/2 (Windows 10)
  • 직접 파일 전송
  • 응답 캐싱
  • WebSockets (Windows 8)

지원되는 Windows 버전:

  • Windows 7 및 Windows 서버 2008 R2 이상

예제 코드 살펴보기 및 다운로드

WebListener를 사용해야 하는 경우

WebListener는 IIS를 사용하지 않고 인터넷에 서버를 직접 노출해야 하는 배포에 유용합니다.

Weblistener communicates directly with the Internet

WebListener는 Http.Sys를 기반으로 하기 때문에 공격을 방어하기 위한 역방향 프록시 서버가 필요 없습니다. Http.Sys는 다양한 형태의 공격을 방어할 수 있고, 완벽한 기능을 갖춘 웹 서버의 견고함과 보안 및 확장성을 제공하는 성숙한 기술입니다. IIS 자체도 Http.Sys 위에서 HTTP Listener로 실행됩니다.

WebListener는 Kestrel이 지원하지 않는 기능을 필요로 하는 내부 배포 시에도 적합한 선택입니다.

Weblistener communicates directly with your internal network

WebListener 사용 방법

다음은 호스트 OS 및 ASP.NET Core 응용 프로그램의 설정 작업에 대한 대략적인 설명입니다.

Windows 서버 구성하기

  • .NET Core 또는 .NET Framework 4.5.1 같은 응용 프로그램에 필요한 .NET 버전을 설치합니다.

  • WebListener에 바인딩 할 URL 접두어를 미리 등록하고, SSL 인증서를 설정합니다.

    Windows에서 URL 접두어를 미리 등록해놓지 않으면 응용 프로그램을 관리자 권한으로 실행해야 합니다. 유일한 예외는 포트 번호가 1024 보다 큰 HTTP를 사용해서 (HTTPS는 해당되지 않습니다) localhost에 바인딩 하는 경우로, 이 때는 관리자 권한이 필요 없습니다.

    더 자세한 내용은 본문의 미리 접두사를 등록하고 SSL 구성하기 절을 참고하시기 바랍니다.

  • 트래픽이 WebListener에 전달될 수 있도록 방화벽 포트를 엽니다.

    이 작업은 netsh.exe 또는 PowerShell 커맨드릿으로 수행할 수 있습니다.

마지막으로 Http.Sys 레지스트리 설정도 필요합니다.

ASP.NET Core 응용 프로그램 구성하기

  • Microsoft.AspNetCore.Server.WebListener NuGet 패키지를 설치합니다. 그러면 의존성으로 Microsoft.Net.Http.Server 패키지가 같이 설치됩니다.

  • 다음 예제와 같이, Main 메서드에서 WebHostBuilderUseWebListener 확장 메서드를 호출해서 필요한 WebListener 옵션설정을 지정합니다:

    public static void Main(string[] args)
    {
        Console.WriteLine("Running demo with WebListener.");
    
        var config = new ConfigurationBuilder()
            .AddCommandLine(args)
            .Build();
    
        var builder = new WebHostBuilder()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseConfiguration(config)
            .UseStartup<Startup>()
            .UseWebListener(options =>
            {
                options.ListenerSettings.Authentication.Schemes = AuthenticationSchemes.None;
                options.ListenerSettings.Authentication.AllowAnonymous = true;
            });
    
        var host = builder.Build();
        host.Run();
    }
  • 수신 대기할 URL 및 포트를 구성합니다.

    기본적으로 ASP.NET Core는 http://localhost:5000에 바인딩됩니다. URL 접두사 및 포트는 UseURLs 확장 메서드, urls 명령줄 인수 또는 ASP.NET Core 구성 시스템을 이용해서 구성할 수 있습니다. 더 자세한 정보는 ASP.NET Core의 호스팅 살펴보기 문서를 참고하시기 바랍니다.

    WebListener는 Http.Sys 접두사 문자열 형식을 사용합니다. WebListener에만 따로 적용되는 접두사 문자열 형식 제한은 없습니다.

    노트

    반드시 서버에서 미리 등록한 접두사 문자열과 동일한 값을 UseUrls에 지정해야 합니다.

  • 응용 프로그램이 IIS 또는 IIS Express를 실행하도록 구성되어 있지는 않은지 확인합니다.

    Visual Studio의 기본 실행 프로필은 IIS Express 용입니다. 프로젝트를 콘솔 응용 프로그램으로 실행하려면 다음 그림과 같이 선택된 프로필을 직접 변경해야합니다.

    Select console app profile

ASP.NET Core 외부에서 WebListener를 사용하는 방법

마지막으로 Http.Sys 레지스트리 설정도 필요합니다.

다음은 ASP.NET Core 외부에서 WebListener를 사용하는 방법을 보여주는 예제 코드입니다:

var settings = new WebListenerSettings();
settings.UrlPrefixes.Add("http://localhost:8080");

using (WebListener listener = new WebListener(settings))
{
    listener.Start();

    while (true)
    {
        var context = await listener.AcceptAsync();
        byte[] bytes = Encoding.ASCII.GetBytes("Hello World: " + DateTime.Now);
        context.Response.ContentLength = bytes.Length;
        context.Response.ContentType = "text/plain";

        await context.Response.Body.WriteAsync(bytes, 0, bytes.Length);
        context.Dispose();
    }
}

미리 접두사를 등록하고 SSL 구성하기

IIS 및 WebListener는 모두 기반 Http.Sys 커널 모드 드라이버를 이용해서 요청을 수신하고 초기 처리를 수행합니다. IIS의 경우, 관리 UI를 사용해서 모든 옵션을 손쉽게 구성할 수 있습니다. 반면 WebListener를 사용하는 경우에는 직접 Http.Sys를 구성해야 합니다. 이를 위한 기본 제공 도구는 netsh.exe 입니다.

netsh.exe 를 이용해서 수행해야 할 가장 일반적인 작업은 URL 접두사를 예약하고 SSL 인증서를 할당하는 것입니다.

그러나 초보자에게 netsh.exe 는 쉬운 도구가 아닙니다. 다음 예제는 포트 80 및 443에 대한 URL 접두사를 예약하기 위해서 필요한 최소한의 작업을 보여줍니다:

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

다음 예제는 SSL 인증서를 할당하는 방법을 보여줍니다:

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

다음은 공식 참조 문서입니다:

다음 문서들은 다양한 시나리오에 대응하는 상세한 지침을 제공합니다. HttpListener와 WebListener는 모두 Http.Sys를 기반으로 하기 때문에, HttpListener를 다루는 문서는 WebListener에도 동일하게 적용됩니다.

다음은 netsh.exe 명령줄 도구보다 사용하기 쉬운 타사 도구들입니다. 이 도구들은 Microsoft가 제공하거나 보증하지 않습니다. netsh.exe 자체가 관리자 권한이 필요하기 때문에, 기본적으로 이 도구들도 관리자 권한으로 실행됩니다.

  • http.sys Manager는 SSL 인증서 및 옵션들을 나열하고 구성하기 위한 UI 및 접두사 예약과 인증서 신뢰 목록을 위한 UI를 제공합니다.
  • HttpConfig를 사용하면 SSL 인증서 및 URL 접두어를 나열하거나 구성할 수 있습니다. http.sys Manager보다 UI가 세련되고 몇 가지 더 많은 구성 옵션을 제공하지만, 그것 말고는 대부분 비슷한 기능을 제공합니다. 새로운 인증서 신뢰 목록(CTL, Certificate Trust List)을 만들 수는 없지만, 기존 인증서 신뢰 목록을 할당할 수는 있습니다.

Microsoft는 자체 서명 SSL 인증서를 생성하기 위한 명령줄 도구인 MakeCert.exe와 PowerShell New-SelfSignedCertificate 커맨드릿을 제공합니다. 또는 자체 서명 인증서를 손쉽게 생성할 수 있게 도와주는 서드 파티 도구들도 존재합니다:

다음 단계

보다 자세한 내용은 다음 문서를 참고하시기 바랍니다: