0Pricing
C# Academy · 강의

미들웨어 순서와 기본 제공 미들웨어

인증, 라우팅, CORS, 예외 처리에 올바른 미들웨어 순서를 이해합니다.

미들웨어 순서와 기본 제공 미들웨어은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

순서가 중요한 이유

ASP.NET Core 미들웨어는 등록된 정확한 순서대로 실행됩니다. 순서가 잘못되면 보안 취약점, 성능 문제 또는 잘못된 동작이 발생합니다. 예를 들어 라우팅은 인가보다 먼저 실행되어야 하고, 인가는 엔드포인트 실행보다 먼저 실행되어야 합니다.

권장 미들웨어 순서

마이크로소프트는 권장 순서를 문서화하고 있습니다. 이 순서를 따르지 않으면 디버깅하기 어려운 문제가 발생합니다. 다음은 프로덕션 ASP.NET Core 애플리케이션 프로그래밍 인터페이스에 적용하는 표준 순서입니다.

// Recommended order:
app.UseExceptionHandler();    // 1. Catch all exceptions
app.UseHsts();                // 2. HTTP Strict Transport Security
app.UseHttpsRedirection();    // 3. Redirect HTTP to HTTPS
app.UseStaticFiles();         // 4. Serve static assets
app.UseRouting();             // 5. Match route patterns
app.UseCors();                // 6. Cross-Origin
app.UseAuthentication();      // 7. Who are you?
app.UseAuthorization();       // 8. Are you allowed?
app.UseRateLimiter();         // 9. Throttle
app.UseOutputCache();         // 10. Cache responses
// Map endpoints here
app.MapControllers();
app.Run();

예외 처리를 가장 먼저 배치하기

예외 처리 미들웨어는 모든 후속 미들웨어와 엔드포인트에서 발생하는 예외를 포착할 수 있도록 가장 먼저(가장 바깥쪽에) 배치해야 합니다.

// Development: detailed error page
if (app.Environment.IsDevelopment())
    app.UseDeveloperExceptionPage();
else
{
    // Production: generic error page + structured response
    app.UseExceptionHandler("/error");
    app.UseHsts();
}

// OR: use ProblemDetails globally (recommended .NET 8+)
builder.Services.AddProblemDetails();
app.UseExceptionHandler();
// All unhandled exceptions -> RFC 7807 ProblemDetails JSON

라우팅 전에 정적 파일 배치하기

정적 파일(UseStaticFiles)은 라우팅보다 먼저 배치해야 합니다. 정적 파일을 제공하면 파이프라인이 조기에 종료되므로 /css/main.css에 대해 인증이나 라우팅을 실행할 필요가 없습니다.

app.UseStaticFiles(); // serves wwwroot/* without going through auth
app.UseRouting();     // expensive: runs route matching

// If you put UseStaticFiles AFTER UseRouting, the route
// matcher runs unnecessarily for every .js/.css request.
// Serve static files first for better performance.

인가 전에 인증 배치하기

UseAuthentication은 UseAuthorization보다 먼저 실행되어야 합니다. 인증은 HttpContext.User를 채우고, 인가는 채워진 사용자를 정책과 비교해 확인합니다.

// WRONG ORDER — authorization runs before user is populated:
app.UseAuthorization();  // user is null → everything allowed!
app.UseAuthentication(); // too late

// CORRECT:
app.UseAuthentication(); // populates context.User
app.UseAuthorization();  // checks context.User against policies

인증 전 CORS

CORS 미들웨어는 인증보다 먼저 실행되어야 합니다. 그래야 프리플라이트 OPTIONS 요청을 인증 헤더 없이 처리할 수 있습니다.

builder.Services.AddCors(opts =>
    opts.AddPolicy("Frontend", p =>
        p.WithOrigins("https://myapp.com")
         .AllowAnyHeader()
         .AllowAnyMethod()));

app.UseRouting();
app.UseCors("Frontend"); // before auth — handles OPTIONS pre-flight
app.UseAuthentication();
app.UseAuthorization();

주요 기본 제공 미들웨어

ASP.NET Core에는 다양한 기본 제공 미들웨어 구성 요소가 포함되어 있습니다. 각 구성 요소의 역할을 알면 언제 어떻게 사용해야 할지 이해하는 데 도움이 됩니다.

// Compression: compresses responses (must be before static files)
builder.Services.AddResponseCompression();
app.UseResponseCompression();

// Request localization: sets culture from Accept-Language header
builder.Services.AddLocalization();
app.UseRequestLocalization();

// Health checks: /health endpoint
builder.Services.AddHealthChecks();
app.MapHealthChecks("/health");

// Forwarded headers: trust X-Forwarded-For from reverse proxy
app.UseForwardedHeaders();

라우팅 미들웨어 심층 이해

UseRouting()은 들어오는 요청을 라우트 패턴에 매칭하고 그 결과를 HttpContext에 저장합니다. 그런 다음 UseEndpoints()(또는 MapXxx())가 매칭된 엔드포인트를 실행합니다.

app.UseRouting(); // matches route, stores in context

// Between UseRouting and Map*: middleware can read route data
app.Use(async (ctx, next) =>
{
    var endpoint = ctx.GetEndpoint();
    var routeName = endpoint?.DisplayName;
    Console.WriteLine($"Matched: {routeName}");
    await next(ctx);
});

// All auth and other middleware go here
app.UseAuthentication();
app.UseAuthorization();

// Execute the matched endpoint
app.MapControllers();
app.MapGet("/", () => "Home");

응답 압축 배치

응답 압축은 정적 파일과 라우팅보다 먼저 실행되어야 합니다. 콘텐츠가 생성되기 전에 압축된 출력이 작성되도록 하기 위해서입니다. 예외 처리 바로 다음에 배치하세요.

// Correct placement for response compression:
app.UseExceptionHandler();
app.UseResponseCompression(); // before static files
app.UseStaticFiles();          // compressed static files
app.UseRouting();
// ... rest of pipeline

실전: 완전한 운영 환경 파이프라인

모든 권장 사항을 잘 정렬되고 안전한 미들웨어 구성으로 결합한 완전한 운영 환경 파이프라인입니다.

var app = builder.Build();

if (app.Environment.IsDevelopment())
    app.UseDeveloperExceptionPage();
else { app.UseExceptionHandler(); app.UseHsts(); }

app.UseResponseCompression();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors("AllowFrontend");
app.UseAuthentication();
app.UseAuthorization();
app.UseRateLimiter();
app.UseOutputCache();

app.MapHealthChecks("/health").AllowAnonymous();
app.MapControllers();

app.Run();

빠른 확인

미들웨어 파이프라인에서 UseAuthentication이 UseAuthorization보다 먼저 와야 하는 이유는 무엇입니까?

복습: 미들웨어 순서 및 기본 제공 미들웨어

핵심 요점:

  • 예외 처리를 가장 먼저 배치하고, 라우팅 전에 정적 파일을 처리하며, 권한 부여 전에 인증을 수행하고, 인증 전에 CORS를 실행합니다
  • 최대 효과를 얻으려면 응답 압축을 앞부분에 배치합니다(정적 파일보다 먼저)
  • UseRouting + UseAuthorization + Map* — 이들 사이의 미들웨어는 라우트 데이터를 읽을 수 있습니다
  • 기본 제공 항목: UseHsts, UseHttpsRedirection, UseStaticFiles, UseRateLimiter, UseOutputCache
  • 매칭된 라우트 정보를 읽으려면 UseRouting과 MapXxx 사이에서 ctx.GetEndpoint()를 확인합니다

자주 묻는 질문

“미들웨어 순서와 기본 제공 미들웨어” 강의는 무료인가요?

네 — “미들웨어 순서와 기본 제공 미들웨어” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“미들웨어 순서와 기본 제공 미들웨어”에서 뭘 배우나요?

인증, 라우팅, CORS, 예외 처리에 올바른 미들웨어 순서를 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“미들웨어 순서와 기본 제공 미들웨어” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. ASP.NET Core 파이프라인 개요
  2. 사용자 지정 미들웨어 작성
  3. 단락 처리와 분기
  4. 미들웨어 순서와 기본 제공 미들웨어
← C# Academy(으)로 돌아가기