ASP.NET Core Kestrel 웹 서버에서 HTTP/3 사용

참고 항목

이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.

Important

이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.

현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.

HTTP/3 은 승인된 표준 및 세 번째 주 버전의 HTTP입니다. 이 문서에서는 HTTP/3에 대한 요구 사항을 설명합니다. HTTP/3은 ASP.NET Core 7.0 이상에서 완전히 지원됩니다.

Important

HTTP/3을 활용하도록 구성된 앱은 HTTP/1.1 및 HTTP/2도 지원하도록 디자인되어야 합니다.

HTTP/3 요구 사항

HTTP/3의 요구 사항은 운영 체제에 따라 다릅니다. 실행 중인 플랫폼에 Kestrel HTTP/3에 대한 모든 요구 사항이 없으면 사용하지 않도록 설정되고 Kestrel 다른 HTTP 프로토콜로 대체됩니다.

Windows

  • Windows 11 빌드 22000 이상 또는 Windows Server 2022.
  • TLS 1.3 이상 연결

Linux

  • 설치된 libmsquic 패키지.

libmsquic는 Microsoft 공식 Linux 패키지 리포지토리를 통해 packages.microsoft.com에 게시됩니다. 이 패키지를 설치하려면:

  1. packages.microsoft.com 리포지토리를 추가합니다. Microsoft 제품용 Linux 소프트웨어 리포지토리를 참조하세요.
  2. 배포판의 패키지 관리자를 사용하여 libmsquic 패키지를 설치합니다. 예를 들어, Ubuntu에 apt install libmsquic=1.9*를 설치합니다.

참고: .NET 6은 libmsquic의 1.9.x 버전과만 호환됩니다. Libmsquic 2.x는 호환성이 손상되는 변경으로 인해 호환되지 않습니다. Libmsquic는 보안 픽스를 통합하는 데 필요한 경우 1.9.x에 대한 업데이트를 받습니다.

macOS

HTTP/3은 현재 macOS에서 지원되지 않으며 향후 릴리스에서 사용할 수 있을 것입니다.

시작하기

HTTP/3은 기본적으로 사용되지 않습니다. HTTP/3을 Program.cs 사용하도록 설정하는 구성을 추가합니다.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

이전 코드는 다음을 위해 포트 5001을 구성합니다.

  • HttpProtocols.Http1AndHttp2AndHttp3을 지정하여 HTTP/1.1, HTTP/2와 함께 HTTP/3을 사용합니다.
  • UseHttps를 사용하여 HTTPS를 사용하도록 설정합니다. HTTP/3에는 HTTPS가 필요합니다.

모든 라우터, 방화벽, 프록시가 HTTP/3을 제대로 지원하는 것은 아니므로 HTTP/3을 HTTP/1.1, HTTP/2와 함께 구성해야 합니다. 이 작업은 HttpProtocols.Http1AndHttp2AndHttp3을 엔드포인트에 지원되는 프로토콜로 지정하여 수행할 수 있습니다.

자세한 내용은 ASP.NET Core Kestrel 웹 서버에 대한 엔드포인트 구성을 참조하세요.

Alt-svc

HTTP/3은 alt-svc 헤더를 통해 HTTP/1.1 또는 HTTP/2에서 업그레이드로 검색됩니다. 즉, 첫 번째 요청에서 일반적으로 HTTP/1.1 또는 HTTP/2를 사용한 후에 HTTP/3으로 전환합니다. HTTP/3을 사용하도록 설정된 경우에는 Kestrel가 alt-svc 헤더를 자동으로 추가합니다.

Localhost 테스트

HTTP/3 혜택

HTTP/3은 HTTP/1.1 및 HTTP/2와 동일한 의미 체계를 사용하기 때문에 동일한 요청 메서드, 상태 코드 및 메시지 필드가 모든 버전에 적용됩니다. 기본 전송에 차이가 있습니다. HTTP/1.1과 HTTP/2 모두 TCP를 전송으로 사용합니다. HTTP/3은 HTTP/3과 함께 개발된 새로운 전송 기술인 QUIC를 사용합니다.

HTTP/3과 QUIC에는 HTTP/1.1 및 HTTP/2에 비해 많은 이점이 있습니다.

  • 첫 번째 요청의 응답 시간이 더 빠릅니다. QUIC와 HTTP/3은 연결을 조정할 때 클라이언트와 서버 간의 왕복 횟수가 더 적습니다. 첫 번째 요청이 서버에 더 빨리 도달합니다.
  • 연결 패킷 손실이 있는 경우의 환경이 향상되었습니다. HTTP/2는 하나의 TCP 연결을 통해 여러 요청을 멀티플렉싱합니다. 연결의 패킷 손실은 모든 요청에 영향을 미칩니다. 이 문제를 ‘HOC(head-of-line) 블로킹’이라고 합니다. QUIC는 네이티브 멀티플렉싱을 제공하기 때문에 손실된 패킷은 데이터가 손실된 요청에만 영향을 미칩니다.
  • 네트워크 간 전환을 지원합니다. 이 기능은 모바일 디바이스가 위치를 변경할 때 WIFI와 셀룰러 네트워크 사이의 전환이 흔히 일어나는 모바일 디바이스에 유용합니다. 현재 HTTP/1.1 및 HTTP/2는 네트워크를 전환할 때 오류가 발생하여 연결에 실패합니다. 앱 또는 웹 브라우저는 실패한 HTTP 요청을 다시 시도해야 합니다. HTTP/3을 사용하면 네트워크가 변경될 때도 앱 또는 웹 브라우저가 원활하게 지속될 수 있습니다. Kestrel 는 .NET 8에서 네트워크 전환을 지원하지 않습니다. 향후 릴리스에서는 지원될 수 있을 것입니다.

HTTP/3 은 제안된 표준 및 HTTP의 세 번째 주 버전입니다. 이 문서에서는 HTTP/3에 대한 요구 사항을 설명합니다. HTTP/3은 ASP.NET Core 7.0 이상에서 완전히 지원됩니다.

Important

HTTP/3을 활용하도록 구성된 앱은 HTTP/1.1 및 HTTP/2도 지원하도록 디자인되어야 합니다.

HTTP/3 요구 사항

HTTP/3의 요구 사항은 운영 체제에 따라 다릅니다. Kestrel이 실행되는 플랫폼에 HTTP/3의 모든 요구 사항이 없는 경우 HTTP/3은 사용하지 않도록 설정되며 Kestrel은 다른 HTTP 프로토콜로 대체됩니다.

Windows

  • Windows 11 빌드 22000 이상 또는 Windows Server 2022.
  • TLS 1.3 이상 연결

Linux

  • 설치된 libmsquic 패키지.

libmsquic는 Microsoft 공식 Linux 패키지 리포지토리를 통해 packages.microsoft.com에 게시됩니다. 이 패키지를 설치하려면:

  1. packages.microsoft.com 리포지토리를 추가합니다. Microsoft 제품용 Linux 소프트웨어 리포지토리를 참조하세요.
  2. 배포판의 패키지 관리자를 사용하여 libmsquic 패키지를 설치합니다. 예를 들어, Ubuntu에 apt install libmsquic=1.9*를 설치합니다.

참고: .NET 6은 libmsquic의 1.9.x 버전과만 호환됩니다. Libmsquic 2.x는 호환성이 손상되는 변경으로 인해 호환되지 않습니다. Libmsquic는 보안 픽스를 통합하는 데 필요한 경우 1.9.x에 대한 업데이트를 받습니다.

macOS

HTTP/3은 현재 macOS에서 지원되지 않으며 향후 릴리스에서 사용할 수 있을 것입니다.

시작하기

HTTP/3은 기본적으로 사용되지 않습니다. HTTP/3을 Program.cs 사용하도록 설정하는 구성을 추가합니다.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

이전 코드는 다음을 위해 포트 5001을 구성합니다.

  • HttpProtocols.Http1AndHttp2AndHttp3을 지정하여 HTTP/1.1, HTTP/2와 함께 HTTP/3을 사용합니다.
  • UseHttps를 사용하여 HTTPS를 사용하도록 설정합니다. HTTP/3에는 HTTPS가 필요합니다.

모든 라우터, 방화벽, 프록시가 HTTP/3을 제대로 지원하는 것은 아니므로 HTTP/3을 HTTP/1.1, HTTP/2와 함께 구성해야 합니다. 이 작업은 HttpProtocols.Http1AndHttp2AndHttp3을 엔드포인트에 지원되는 프로토콜로 지정하여 수행할 수 있습니다.

자세한 내용은 ASP.NET Core Kestrel 웹 서버에 대한 엔드포인트 구성을 참조하세요.

Alt-svc

HTTP/3은 alt-svc 헤더를 통해 HTTP/1.1 또는 HTTP/2에서 업그레이드로 검색됩니다. 즉, 첫 번째 요청에서 일반적으로 HTTP/1.1 또는 HTTP/2를 사용한 후에 HTTP/3으로 전환합니다. HTTP/3을 사용하도록 설정된 경우에는 Kestrel가 alt-svc 헤더를 자동으로 추가합니다.

Localhost 테스트

HTTP/3 혜택

HTTP/3은 HTTP/1.1 및 HTTP/2와 동일한 의미 체계를 사용하기 때문에 동일한 요청 메서드, 상태 코드 및 메시지 필드가 모든 버전에 적용됩니다. 기본 전송에 차이가 있습니다. HTTP/1.1과 HTTP/2 모두 TCP를 전송으로 사용합니다. HTTP/3은 HTTP/3과 함께 개발된 새로운 전송 기술인 QUIC를 사용합니다.

HTTP/3과 QUIC에는 HTTP/1.1 및 HTTP/2에 비해 많은 이점이 있습니다.

  • 첫 번째 요청의 응답 시간이 더 빠릅니다. QUIC와 HTTP/3은 연결을 조정할 때 클라이언트와 서버 간의 왕복 횟수가 더 적습니다. 첫 번째 요청이 서버에 더 빨리 도달합니다.
  • 연결 패킷 손실이 있는 경우의 환경이 향상되었습니다. HTTP/2는 하나의 TCP 연결을 통해 여러 요청을 멀티플렉싱합니다. 연결의 패킷 손실은 모든 요청에 영향을 미칩니다. 이 문제를 ‘HOC(head-of-line) 블로킹’이라고 합니다. QUIC는 네이티브 멀티플렉싱을 제공하기 때문에 손실된 패킷은 데이터가 손실된 요청에만 영향을 미칩니다.
  • 네트워크 간 전환을 지원합니다. 이 기능은 모바일 디바이스가 위치를 변경할 때 WIFI와 셀룰러 네트워크 사이의 전환이 흔히 일어나는 모바일 디바이스에 유용합니다. 현재 HTTP/1.1 및 HTTP/2는 네트워크를 전환할 때 오류가 있으면 연결에 실패합니다. 앱 또는 웹 브라우저는 실패한 HTTP 요청을 다시 시도해야 합니다. HTTP/3을 사용하면 네트워크가 변경될 때도 앱 또는 웹 브라우저가 원활하게 지속될 수 있습니다. Kestrel는 .NET 6에서 네트워크 전환을 지원하지 않습니다. 향후 릴리스에서는 지원될 수 있을 것입니다.

HTTP/3은 HTTP의 예정된 세 번째 주 버전입니다. 이 문서에서는 HTTP/3의 요구 사항과 HTTP/3을 사용하도록 Kestrel을 구성하는 방법을 설명합니다.

Important

HTTP/3은 .NET 6에서 ‘미리 보기 기능’으로 사용할 수 있습니다. HTTP/3 사양이 종료되지 않았고 .NET 6의 HTTP/3에 동작 또는 성능 문제가 있을 수 있습니다.

미리 보기 기능 지원에 대한 자세한 내용은 미리 보기 기능 지원 섹션을 참조하세요.

HTTP/3을 활용하도록 구성된 앱은 HTTP/1.1 및 HTTP/2도 지원하도록 디자인되어야 합니다. HTTP/3에서 문제가 확인되면 향후 ASP.NET Core 릴리스에서 문제가 해결될 때까지 HTTP/3을 사용하지 않도록 설정하는 것이 좋습니다. 중요한 문제는 Announcements GitHub repository(알림 GitHub 리포지토리)에 보고됩니다.

HTTP/3 요구 사항

HTTP/3의 요구 사항은 운영 체제에 따라 다릅니다. Kestrel이 실행되는 플랫폼에 HTTP/3의 모든 요구 사항이 없는 경우 HTTP/3은 사용하지 않도록 설정되며 Kestrel은 다른 HTTP 프로토콜로 대체됩니다.

Windows

  • Windows 11 빌드 22000 이상 또는 Windows Server 2022.
  • TLS 1.3 이상 연결

Linux

  • 설치된 libmsquic 패키지.

libmsquic는 Microsoft 공식 Linux 패키지 리포지토리를 통해 packages.microsoft.com에 게시됩니다. 이 패키지를 설치하려면:

  1. packages.microsoft.com 리포지토리를 추가합니다. Microsoft 제품용 Linux 소프트웨어 리포지토리를 참조하세요.
  2. 배포판의 패키지 관리자를 사용하여 libmsquic 패키지를 설치합니다. 예를 들어, Ubuntu에 apt install libmsquic=1.9*를 설치합니다.

참고: .NET 6은 libmsquic의 1.9.x 버전과만 호환됩니다. Libmsquic 2.x는 호환성이 손상되는 변경으로 인해 호환되지 않습니다. Libmsquic는 보안 픽스를 통합하는 데 필요한 경우 1.9.x에 대한 업데이트를 받습니다.

macOS

HTTP/3은 현재 macOS에서 지원되지 않으며 향후 릴리스에서 사용할 수 있을 것입니다.

시작하기

HTTP/3은 기본적으로 사용되지 않습니다. HTTP/3을 Program.cs 사용하도록 설정하는 구성을 추가합니다.

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

이전 코드는 다음을 위해 포트 5001을 구성합니다.

  • HttpProtocols.Http1AndHttp2AndHttp3을 지정하여 HTTP/1.1, HTTP/2와 함께 HTTP/3을 사용합니다.
  • UseHttps를 사용하여 HTTPS를 사용하도록 설정합니다. HTTP/3에는 HTTPS가 필요합니다.

모든 라우터, 방화벽, 프록시가 HTTP/3을 제대로 지원하는 것은 아니므로 HTTP/3을 HTTP/1.1, HTTP/2와 함께 구성해야 합니다. 이 작업은 HttpProtocols.Http1AndHttp2AndHttp3을 엔드포인트에 지원되는 프로토콜로 지정하여 수행할 수 있습니다.

자세한 내용은 ASP.NET Core Kestrel 웹 서버에 대한 엔드포인트 구성을 참조하세요.

Alt-svc

HTTP/3은 alt-svc 헤더를 통해 HTTP/1.1 또는 HTTP/2에서 업그레이드로 검색됩니다. 즉, 첫 번째 요청에서 일반적으로 HTTP/1.1 또는 HTTP/2를 사용한 후에 HTTP/3으로 전환합니다. HTTP/3을 사용하도록 설정된 경우에는 Kestrel가 alt-svc 헤더를 자동으로 추가합니다.

Localhost 테스트

  • 브라우저는 HTTP/3에서 Kestrel 개발 인증서와 같은 자체 서명된 인증서를 허용하지 않습니다.

  • HttpClient는 .NET 6 이상에서 localhost/loopback 테스트에 사용할 수 있습니다. HttpClient를 사용하여 HTTP/3을 요청할 때는 추가 구성이 필요합니다.

    • HttpRequestMessage.Version을 3.0으로 설정합니다. 또는
    • HttpRequestMessage.VersionPolicyHttpVersionPolicy.RequestVersionOrHigher로 설정합니다.

제한 사항

일부 HTTPS 시나리오는 Kestrel의 HTTP/3에서 아직 지원되지 않습니다. HTTP/3을 사용하는 동안 HttpsConnectionAdapterOptions를 사용하여 Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps를 호출하면 HttpsConnectionAdapterOptions에서 다음 옵션을 설정할 수 없습니다(아무 작업도 수행되지 않음).

HTTP/3을 사용할 때 다음과 같은 Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps의 구현을 호출하면 오류가 throw됩니다.

HTTP/3 혜택

HTTP/3은 HTTP/1.1 및 HTTP/2와 동일한 의미 체계를 사용하기 때문에 동일한 요청 메서드, 상태 코드 및 메시지 필드가 모든 버전에 적용됩니다. 기본 전송에 차이가 있습니다. HTTP/1.1과 HTTP/2 모두 TCP를 전송으로 사용합니다. HTTP/3은 HTTP/3과 함께 개발된 새로운 전송 기술인 QUIC를 사용합니다.

HTTP/3과 QUIC에는 HTTP/1.1 및 HTTP/2에 비해 많은 이점이 있습니다.

  • 첫 번째 요청의 응답 시간이 더 빠릅니다. QUIC와 HTTP/3은 연결을 조정할 때 클라이언트와 서버 간의 왕복 횟수가 더 적습니다. 첫 번째 요청이 서버에 더 빨리 도달합니다.
  • 연결 패킷 손실이 있는 경우의 환경이 향상되었습니다. HTTP/2는 하나의 TCP 연결을 통해 여러 요청을 멀티플렉싱합니다. 연결의 패킷 손실은 모든 요청에 영향을 미칩니다. 이 문제를 ‘HOC(head-of-line) 블로킹’이라고 합니다. QUIC는 네이티브 멀티플렉싱을 제공하기 때문에 손실된 패킷은 데이터가 손실된 요청에만 영향을 미칩니다.
  • 네트워크 간 전환을 지원합니다. 이 기능은 모바일 디바이스가 위치를 변경할 때 WIFI와 셀룰러 네트워크 사이의 전환이 흔히 일어나는 모바일 디바이스에 유용합니다. 현재 HTTP/1.1 및 HTTP/2는 네트워크를 전환할 때 오류가 있으면 연결에 실패합니다. 앱 또는 웹 브라우저는 실패한 HTTP 요청을 다시 시도해야 합니다. HTTP/3을 사용하면 네트워크가 변경될 때도 앱 또는 웹 브라우저가 원활하게 지속될 수 있습니다. Kestrel는 .NET 6에서 네트워크 전환을 지원하지 않습니다. 향후 릴리스에서는 지원될 수 있을 것입니다.