다음을 통해 공유


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

참고 항목

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

경고

이 버전의 ASP.NET Core는 더 이상 지원되지 않습니다. 자세한 내용은 .NET 및 .NET Core 지원 정책을 참조 하세요. 현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

중요합니다

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

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

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

중요합니다

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

HTTP/3 혜택

HTTP/3:

  • 하이퍼텍스트 전송 프로토콜의 최신 버전입니다.
  • HTTP/2의 강점을 기반으로 하여 특히 성능, 대기 시간, 안정성 및 보안 측면에서 몇 가지 제한 사항을 해결합니다.
특징 HTTP/2 HTTP/3
운송 TCP 사용 QUIC 사용
연결 TCP + TLS로 인해 느려집니다. 0-RTT QUIC를 사용하여 더 빠르게
설치 핸드셰이크 악수
헤드 오브 라인 TCP 수준의 영향을 받습니다. QUIC를 사용하여 제거됨
차단 블로킹 스트림 멀티플렉싱
암호화 TCP를 통해 TLS TLS는 QUIC에 기본 제공

주요 차이점은 다음과 같습니다.HTTP/2HTTP/3

  • 전송 프로토콜: HTTP/3 TCP 대신 QUIC를 사용합니다. QUIC는 특히 모바일 및 손실 네트워크에서 향상된 성능, 낮은 대기 시간 및 더 나은 안정성을 제공합니다.
  • 헤드 오브 라인 차단: HTTP/2 TCP 수준에서 헤드 오브 라인 차단으로 인해 한 스트림의 지연이 다른 스트림에 영향을 줄 수 있습니다. HTTP/3는 QUIC를 사용하여 독립 스트림을 제공하므로 한 스트림의 패킷 손실이 다른 스트림을 중단하지 않습니다.
  • 연결 설정: HTTP/3 QUIC를 사용하면 전송 및 암호화 핸드셰이크를 결합하여, 특히 기존의 클라이언트의 경우에는 0-RTT(왕복 시간 0)로 더 빠르게 연결을 설정할 수 있습니다.
  • 암호화: HTTP/3 TLS 1.3 암호화를 의무화하여 기본적으로 향상된 보안을 제공하는 반면, 선택 사항 HTTP/2입니다.
  • 멀티플렉싱: 둘 다 멀티플렉싱을 HTTP/3지원하지만 QUIC를 사용하여 구현하는 것이 더 효율적이며 TCP 수준 헤드 오브 라인 차단 문제를 방지합니다.
  • 연결 마이그레이션: QUIC를 HTTP/3 사용하면 클라이언트의 IP 주소가 변경되는 경우에도(예: Wi-Fi에서 셀룰러로 전환) 연결이 유지되어 모바일 사용자 환경이 향상됩니다.

HTTP/3 요구 사항

HTTP/3은 QUIC를 전송 프로토콜로 사용합니다. HTTP/3의 ASP.NET Core 구현은 MSQuic 에 따라 QUIC 기능을 제공합니다. 결과적으로 http/3의 ASP.NET Core 지원은 MsQuic 플랫폼 요구 사항에 따라 달라집니다. MsQuic를 설치하는 방법에 대한 자세한 내용은 QUIC 플랫폼 종속성을 참조하세요. 실행 중인 플랫폼에 Kestrel HTTP/3에 대한 모든 요구 사항이 없으면 사용하지 않도록 설정되고 Kestrel 다른 HTTP 프로토콜로 대체됩니다.

시작

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을 사용하는 방법에 대한 자세한 내용은 .NET에서 HttpClientHTTP/3을 참조하세요.

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

중요합니다

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

HTTP/3 요구 사항

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

윈도우즈

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

리눅스

  • 설치된 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을 구성하는 방법을 설명합니다.

중요합니다

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 11 빌드 22000 이상 또는 Windows Server 2022.
  • TLS 1.3 이상 연결

리눅스

  • 설치된 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을 사용하는 동안 Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps를 사용하여 HttpsConnectionAdapterOptions를 호출하면 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에서 네트워크 전환을 지원하지 않습니다. 향후 릴리스에서는 지원될 수 있을 것입니다.