참고 항목
이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .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/2
HTTP/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에서 자체 서명된 인증서를 Kestrel 허용하지 않습니다.
HttpClient
는 .NET 6 이상에서 localhost/loopback 테스트에 사용할 수 있습니다.HttpClient
를 사용하여 HTTP/3을 요청할 때는 추가 구성이 필요합니다.-
HttpRequestMessage.Version
을 3.0으로 설정합니다. 또는 -
HttpRequestMessage.VersionPolicy
를HttpVersionPolicy.RequestVersionOrHigher
로 설정합니다.
-
HTTP/3을 사용하는 방법에 대한 자세한 내용은 .NET에서 HttpClient
HTTP/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
에 게시됩니다. 이 패키지를 설치하려면:
-
packages.microsoft.com
리포지토리를 추가합니다. Microsoft 제품용 Linux 소프트웨어 리포지토리를 참조하세요. - 배포판의 패키지 관리자를 사용하여
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.VersionPolicy
를HttpVersionPolicy.RequestVersionOrHigher
로 설정합니다.
-
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
에 게시됩니다. 이 패키지를 설치하려면:
-
packages.microsoft.com
리포지토리를 추가합니다. Microsoft 제품용 Linux 소프트웨어 리포지토리를 참조하세요. - 배포판의 패키지 관리자를 사용하여
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.VersionPolicy
를HttpVersionPolicy.RequestVersionOrHigher
로 설정합니다.
-
제한 사항
일부 HTTPS 시나리오는 Kestrel의 HTTP/3에서 아직 지원되지 않습니다. HTTP/3을 사용하는 동안 Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps
를 사용하여 HttpsConnectionAdapterOptions를 호출하면 HttpsConnectionAdapterOptions에서 다음 옵션을 설정할 수 없습니다(아무 작업도 수행되지 않음).
HTTP/3을 사용할 때 다음과 같은 Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps
의 구현을 호출하면 오류가 throw됩니다.
- UseHttps(This ListenOptions listenOptions, ServerOptionsSelectionCallback serverOptionsSelectionCallback, object state, TimeSpan handshakeTimeout)
- UseHttps(This ListenOptions listenOptions, TlsHandshakeCallbackOptions callbackOptions)
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에서 네트워크 전환을 지원하지 않습니다. 향후 릴리스에서는 지원될 수 있을 것입니다.
ASP.NET Core