HTTP/2는 기본적으로 사용됩니다. HTTP/2 연결이 설정되지 않는 경우 연결이 HTTP/1.1로 대체됩니다. Windows의 이후 릴리스에서는 HTTP.sys를 사용하여 HTTP/2를 사용하지 않도록 하는 기능을 포함하여 HTTP/2 구성 플래그를 사용할 수 있습니다.
HTTP/3 지원
다음 기본 요구 사항이 충족되는 경우 ASP.NET Core 앱에 대해HTTP/3가 사용 설정됩니다.
이전 Windows 11 빌드 버전을 사용하려면 Windows 참가자 빌드를 사용해야 할 수 있습니다.
HTTP/3은 alt-svc 헤더를 통해 HTTP/1.1 또는 HTTP/2에서 업그레이드로 검색됩니다. 즉, 첫 번째 요청에서 일반적으로 HTTP/1.1 또는 HTTP/2를 사용한 후에 HTTP/3으로 전환합니다. Http.Sys는 alt-svc 헤더를 자동으로 추가하지 않으며 애플리케이션에서 추가해야 합니다. 다음 코드는 alt-svc 응답 헤더를 추가하는 미들웨어 예제입니다.
또한 Http.Sys는 응답 헤더 대신 AltSvc HTTP/2 프로토콜 메시지 전송을 지원하여 HTTP/3을 사용할 수 있음을 클라이언트에 알립니다.
EnableAltSvc 레지스트리 키를 참조하세요. 이렇게 하려면 IP 주소 대신 호스트 이름을 사용하는 netsh sslcert 바인딩이 필요합니다.
Kerberos를 사용하여 커널 모드 인증
HTTP.sys는 Kerberos 인증 프로토콜을 사용하여 커널 모드 인증에 위임합니다. 사용자 모드 인증은 Kerberos 및 HTTP.sys로 지원되지 않습니다. 머신 계정은 Active Directory에서 가져온 Kerberos 토큰/티켓의 암호를 해독하는 데 사용되고 사용자를 인증하는 서버에 클라이언트에 의해 전달되어야 합니다. 앱의 사용자가 아닌 호스트에 대해 SPN(서비스 사용자 이름)을 등록합니다.
커널 모드 응답 버퍼링 지원
일부 시나리오에서는 대기 시간이 긴 작은 쓰기의 양이 많으면 성능에 상당한 영향을 줄 HTTP.sys수 있습니다. 이 영향은 구현에 버퍼가 Pipe 없기 때문입니다 HTTP.sys . 이러한 시나리오에서 성능을 향상시키기 위해 응답 버퍼링에 대한 지원이 포함됩니다 HTTP.sys. HttpSysOptions.EnableKernelResponseBuffering을 .로 설정하여 버퍼링을true.
응답 버퍼링은 동기 I/O를 수행하는 앱 또는 한 번에 둘 이상의 미해결 쓰기가 없는 비동기 I/O에서 사용하도록 설정해야 합니다. 이러한 시나리오에서 응답 버퍼링은 대기 시간이 긴 연결에 대한 처리량을 크게 향상시킬 수 있습니다.
비동기 I/O를 사용하고 한 번에 둘 이상의 쓰기가 처리 중인 앱은 이 플래그를 사용하지 않아야 합니다. 이 플래그를 사용하도록 설정하면 HTTP.Sys에서 CPU 및 메모리 사용량이 높아질 수 있습니다.
.NET Framework: 앱에 .NET Framework가 필요한 경우 .NET Framework 설치 가이드를 참조하세요. 필수 .NET Framework를 설치합니다. 최신 .NET Framework의 설치 관리자는 .NET Core 다운로드 페이지에서 사용할 수 있습니다.
앱이 자체 포함 배포인 경우 앱의 배포에 런타임이 포함됩니다. 서버에 프레임워크를 설치할 필요가 없습니다.
앱에서 URL 및 포트를 구성합니다.
기본적으로 ASP.NET Core는 http://localhost:5000으로 바인딩합니다. URL 접두사 및 포트를 구성하려면 다음 옵션을 사용합니다.
최상위 와일드카드 바인딩(http://*:80/ 및 http://+:80)을 사용하지 않아야 합니다. 최상위 와일드카드 바인딩으로 인해 앱 보안 취약성이 생길 수 있습니다. 강력한 와일드카드와 약한 와일드카드 모두에 적용됩니다. 와일드카드보다는 명시적 호스트 이름 또는 IP 주소를 사용합니다. 전체 부모 도메인을 제어하는 경우 하위 도메인 와일드카드 바인딩(예: *.mysub.com)은 보안 위험이 아닙니다(취약한 *.com과 반대임). 자세한 내용은 RFC 9110: 섹션 7.2: 호스트 및 :authority를 참조하세요.
앱 및 컨테이너에는 종종 호스트 또는 경로와 같은 추가 제약 조건 없이 포트 80과 같이 수신 대기할 포트만 제공됩니다. HTTP_PORTS 및 HTTPS_PORTS 및 HTTP.sys 서버에 대한 Kestrel 수신 대기 포트를 지정하는 구성 키입니다. 이러한 키는 접두사 또는 접두사로 DOTNET_ 정의된 환경 변수로 지정되거나 ASPNETCORE_ 같은 다른 구성 입력 appsettings.json을 통해 직접 지정될 수 있습니다. 각각은 다음 예제와 같이 포트 값의 세미콜론으로 구분된 목록입니다.
타임스탬프 빈도는 QueryPerformanceFrequency를 통해 가져올 수 있습니다.
타이밍의 인덱스를 HttpSysRequestTimingType으로 캐스팅하여 타이밍이 나타내는 것을 알 수 있습니다.
현재 요청에 타이밍을 사용할 수 없는 경우 값은 0일 수 있습니다.
Windows 10 버전 2004, Windows Server 2022 이상이 필요합니다.
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var timestamps = feature.Timestamps;
for (var i = 0; i < timestamps.Length; i++)
{
var timestamp = timestamps[i];
var timingType = (HttpSysRequestTimingType)i;
logger.LogInformation("Timestamp {timingType}: {timestamp}",
timingType, timestamp);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var timingType = HttpSysRequestTimingType.RequestRoutingEnd;
if (feature.TryGetTimestamp(timingType, out var timestamp))
{
logger.LogInformation("Timestamp {timingType}: {timestamp}",
timingType, timestamp);
}
else
{
logger.LogInformation("Timestamp {timingType}: not available for the "
+ "current request", timingType);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
[IHttpSysRequestTimingFeature.TryGetElapsedTime](/dotnet/api/microsoft.aspnetcore.server.httpsys.ihttpsysrequesttimingfeature.trygetelapsedtime은 지정된 두 타이밍 사이의 경과 시간을 반환합니다.
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var startingTimingType = HttpSysRequestTimingType.RequestRoutingStart;
var endingTimingType = HttpSysRequestTimingType.RequestRoutingEnd;
if (feature.TryGetElapsedTime(startingTimingType, endingTimingType, out var elapsed))
{
logger.LogInformation(
"Elapsed time {startingTimingType} to {endingTimingType}: {elapsed}",
startingTimingType,
endingTimingType,
elapsed);
}
else
{
logger.LogInformation(
"Elapsed time {startingTimingType} to {endingTimingType}:"
+ " not available for the current request.",
startingTimingType,
endingTimingType);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
gRPC를 지원하기 위한 고급 HTTP/2 기능
HTTP.sys의 추가 HTTP/2 기능은 응답 트레일러 및 초기화 프레임 전송을 위한 지원을 포함하여 gRPC를 지원합니다.
HTTP.sys를 사용하여 gRPC를 실행하기 위한 요구 사항:
Windows 11 Build 22000 이상, Windows Server 2022 Build 20348 이상.
TLS 1.2 이상 연결
트레일러
HTTP 트레일러는 응답 본문이 전송된 후에 전송된다는 점을 제외하고 HTTP 헤더와 유사합니다. IIS 및 HTTP.sys의 경우 HTTP/2 응답 트레일러만 지원됩니다.
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
앞의 예제 코드에서:
SupportsTrailers는 응답을 위해 트레일러가 지원되는지 확인합니다.
DeclareTrailer는 Trailer 응답 헤더에 지정된 트레일러 이름을 추가합니다. 응답 트레일러 선언은 선택 사항이지만 권장됩니다.
DeclareTrailer가 호출되는 경우 해당 트레일러는 응답 헤더가 전송되기 전에 있어야 합니다.
AppendTrailer는 트레일러를 추가합니다.
Reset
초기화를 사용하면 서버에서 지정된 오류 코드를 사용하여 HTTP/2 요청을 초기화할 수 있습니다. 초기화 요청은 중단된 것으로 간주합니다.
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
이전 코드 예제의 Reset은 INTERNAL_ERROR 오류 코드를 지정합니다. HTTP/2 오류 코드에 관한 자세한 내용은 HTTP/2 사양 오류 코드 섹션을 참조하세요.
추적
HTTP.sys 추적을 가져오는 방법에 대한 자세한 내용은 HTTP.sys 관리 효율성 시나리오를 참조 하세요.
HTTP/2는 기본적으로 사용됩니다. HTTP/2 연결이 설정되지 않는 경우 연결이 HTTP/1.1로 대체됩니다. Windows의 이후 릴리스에서는 HTTP.sys를 사용하여 HTTP/2를 사용하지 않도록 하는 기능을 포함하여 HTTP/2 구성 플래그를 사용할 수 있습니다.
HTTP/3 지원
다음 기본 요구 사항이 충족되는 경우 ASP.NET Core 앱에 대해HTTP/3가 사용 설정됩니다.
이전 Windows 11 빌드 버전을 사용하려면 Windows 참가자 빌드를 사용해야 할 수 있습니다.
HTTP/3은 alt-svc 헤더를 통해 HTTP/1.1 또는 HTTP/2에서 업그레이드로 검색됩니다. 즉, 첫 번째 요청에서 일반적으로 HTTP/1.1 또는 HTTP/2를 사용한 후에 HTTP/3으로 전환합니다. Http.Sys는 alt-svc 헤더를 자동으로 추가하지 않으며 애플리케이션에서 추가해야 합니다. 다음 코드는 alt-svc 응답 헤더를 추가하는 미들웨어 예제입니다.
또한 Http.Sys는 응답 헤더 대신 AltSvc HTTP/2 프로토콜 메시지 전송을 지원하여 HTTP/3을 사용할 수 있음을 클라이언트에 알립니다.
EnableAltSvc 레지스트리 키를 참조하세요. 이렇게 하려면 IP 주소 대신 호스트 이름을 사용하는 netsh sslcert 바인딩이 필요합니다.
Kerberos를 사용하여 커널 모드 인증
HTTP.sys는 Kerberos 인증 프로토콜을 사용하여 커널 모드 인증에 위임합니다. 사용자 모드 인증은 Kerberos 및 HTTP.sys로 지원되지 않습니다. 머신 계정은 Active Directory에서 가져온 Kerberos 토큰/티켓의 암호를 해독하는 데 사용되고 사용자를 인증하는 서버에 클라이언트에 의해 전달되어야 합니다. 앱의 사용자가 아닌 호스트에 대해 SPN(서비스 사용자 이름)을 등록합니다.
.NET Framework: 앱에 .NET Framework가 필요한 경우 .NET Framework 설치 가이드를 참조하세요. 필수 .NET Framework를 설치합니다. 최신 .NET Framework의 설치 관리자는 .NET Core 다운로드 페이지에서 사용할 수 있습니다.
앱이 자체 포함 배포인 경우 앱의 배포에 런타임이 포함됩니다. 서버에 프레임워크를 설치할 필요가 없습니다.
앱에서 URL 및 포트를 구성합니다.
기본적으로 ASP.NET Core는 http://localhost:5000으로 바인딩합니다. URL 접두사 및 포트를 구성하려면 다음 옵션을 사용합니다.
최상위 와일드카드 바인딩(http://*:80/ 및 http://+:80)을 사용하지 않아야 합니다. 최상위 와일드카드 바인딩으로 인해 앱 보안 취약성이 생길 수 있습니다. 강력한 와일드카드와 약한 와일드카드 모두에 적용됩니다. 와일드카드보다는 명시적 호스트 이름 또는 IP 주소를 사용합니다. 전체 부모 도메인을 제어하는 경우 하위 도메인 와일드카드 바인딩(예: *.mysub.com)은 보안 위험이 아닙니다(취약한 *.com과 반대임). 자세한 내용은 RFC 9110: 섹션 7.2: 호스트 및 :authority를 참조하세요.
서버에 URL 접두사를 미리 등록합니다.
HTTP.sys 구성에 대한 기본 제공 도구는 netsh.exe입니다.
netsh.exe는 URL 접두사를 예약하고 X.509 인증서를 할당하는 데 사용됩니다. 도구를 사용하려면 관리자 권한이 필요합니다.
netsh.exe 도구를 사용하여 앱의 URL을 등록합니다.
netsh http add urlacl url=<URL> user=<USER>
<URL>: 정규화된 URL(Uniform Resource Locator)입니다. 와일드카드 바인딩을 사용하지 마세요. 유효한 호스트 이름 또는 로컬 IP 주소를 사용합니다. ‘URL에는 후행 슬래시가 포함되어야 합니다.’
HTTP/2는 기본적으로 사용됩니다. HTTP/2 연결이 설정되지 않는 경우 연결이 HTTP/1.1로 대체됩니다. Windows의 이후 릴리스에서는 HTTP.sys를 사용하여 HTTP/2를 사용하지 않도록 하는 기능을 포함하여 HTTP/2 구성 플래그를 사용할 수 있습니다.
Kerberos를 사용하여 커널 모드 인증
HTTP.sys는 Kerberos 인증 프로토콜을 사용하여 커널 모드 인증에 위임합니다. 사용자 모드 인증은 Kerberos 및 HTTP.sys로 지원되지 않습니다. 머신 계정은 Active Directory에서 가져온 Kerberos 토큰/티켓의 암호를 해독하는 데 사용되고 사용자를 인증하는 서버에 클라이언트에 의해 전달되어야 합니다. 앱의 사용자가 아닌 호스트에 대해 SPN(서비스 사용자 이름)을 등록합니다.
적합한 헤더가 있는 응답에 대해 커널 모드 캐싱을 시도합니다. 응답에 Set-Cookie, Vary 또는 Pragma 헤더가 포함될 수 없습니다.
Cache-Control 및 public 또는 shared-max-age 값인 max-age 헤더나 Expires 헤더가 포함되어야 합니다.
.NET Framework: 앱에 .NET Framework가 필요한 경우 .NET Framework 설치 가이드를 참조하세요. 필수 .NET Framework를 설치합니다. 최신 .NET Framework의 설치 관리자는 .NET Core 다운로드 페이지에서 사용할 수 있습니다.
앱이 자체 포함 배포인 경우 앱의 배포에 런타임이 포함됩니다. 서버에 프레임워크를 설치할 필요가 없습니다.
앱에서 URL 및 포트를 구성합니다.
기본적으로 ASP.NET Core는 http://localhost:5000으로 바인딩합니다. URL 접두사 및 포트를 구성하려면 다음 옵션을 사용합니다.
최상위 와일드카드 바인딩(http://*:80/ 및 http://+:80)을 사용하지 않아야 합니다. 최상위 와일드카드 바인딩으로 인해 앱 보안 취약성이 생길 수 있습니다. 강력한 와일드카드와 약한 와일드카드 모두에 적용됩니다. 와일드카드보다는 명시적 호스트 이름 또는 IP 주소를 사용합니다. 전체 부모 도메인을 제어하는 경우 하위 도메인 와일드카드 바인딩(예: *.mysub.com)은 보안 위험이 아닙니다(취약한 *.com과 반대임). 자세한 내용은 RFC 9110: 섹션 7.2: 호스트 및 :authority를 참조하세요.
서버에 URL 접두사를 미리 등록합니다.
HTTP.sys 구성에 대한 기본 제공 도구는 netsh.exe입니다.
netsh.exe는 URL 접두사를 예약하고 X.509 인증서를 할당하는 데 사용됩니다. 도구를 사용하려면 관리자 권한이 필요합니다.
netsh.exe 도구를 사용하여 앱의 URL을 등록합니다.
netsh http add urlacl url=<URL> user=<USER>
<URL>: 정규화된 URL(Uniform Resource Locator)입니다. 와일드카드 바인딩을 사용하지 마세요. 유효한 호스트 이름 또는 로컬 IP 주소를 사용합니다. ‘URL에는 후행 슬래시가 포함되어야 합니다.’
Azure HPC는 최고의 애플리케이션 성능, 스케일링 기능 및 가치를 제공하기 위해 최첨단 프로세서와 HPC급 InfiniBand 상호 연결을 사용하는 HPC 및 AI 워크로드용으로 특화된 클라우드 기능입니다. 사용자는 Azure HPC를 사용하여 비즈니스 및 기술 요구 사항이 달라질 때 동적으로 할당될 수 있는 고가용성의 HPC 및 AI 기술을 통해 뛰어난 혁신, 생산성 및 비즈니스 민첩성을 얻을 수 있습니다. 이 학습 경로는 Azure HPC에서 시작하는 데 도움이 되는 모듈 시리즈입니다. 가장 관심 있는 토픽을 선택하거나 하나씩 진행할 수 있습니다.