미들웨어는 ASP.NET Core에서 HTTP 요청(Request) 이 들어와 응답(Response) 이 반환될 때까지 거치는 구성 요소이다.
ASP.NET Core의 요청 처리 흐름은 아래와 같다.
Client Request → [Middleware 1] → [Middleware 2] → [Routing Middleware] → [MVC Controller] → Response
이렇게, MVC 컨트롤러도 미들웨어 내부에서 실행된다.
미들웨어의 역할은 아래와 같다.
next())| 메서드 | 역할 | 실행 방식 |
|---|---|---|
app.Use() | 중간 미들웨어 추가 | 다음 미들웨어 호출 가능 (next()) |
app.Run() | 최종 미들웨어 | next() 없이 즉시 응답 반환 |
| app.MapGet() | 특정 경로(Route) 요청 처리 | app.Use()와 달리 직접 응답 반환 |
미들웨어 실행 예제
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
Console.WriteLine("미들웨어 1 시작");
await next();
Console.WriteLine("미들웨어 1 종료");
});
app.Use(async (context, next) =>
{
Console.WriteLine("미들웨어 2 시작");
await next();
Console.WriteLine("미들웨어 2 종료");
});
app.Run(async context =>
{
Console.WriteLine("미들웨어 3 실행 (app.Run)");
await context.Response.WriteAsync("Hello from Middleware 3!");
});
app.Run();
// 미들웨어 1 시작
// 미들웨어 2 시작
// 미들웨어 3 실행 (app.Run)
// 미들웨어 2 종료
// 미들웨어 1 종료
next()를 따라 실행되고, 응답을 반환할 때는 역순으로 실행된다.MVC 컨트롤러를 사용하면 미들웨어가 필요가 없을까?
정답은 아니다!
컨트롤러를 실행하기 위해서 UseRouting(), UseAuthorization(), MapControllers()미들웨어가 필요하다.
MVC를 사용한 Program.cs (기본적인 미들웨어 설정)
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseRouting(); // ✅ 라우팅 미들웨어 (컨트롤러와 연결)
app.UseAuthorization(); // ✅ 인증 및 권한 관리
app.MapControllers(); // ✅ MVC 컨트롤러 실행
app.Run();
즉, MVC도 미들웨어 위에서 동작하며, 미들웨어 없이는 컨트롤러도 실행되지 않는다!!
ASP.NET Core MVC를 사용하면 내부적으로 적용되는 미들웨어
| 기능 | 미들웨어 사용 가능? | 직접 추가 필요? |
|---|---|---|
| 라우팅 (Controller 실행) | ✅ UseRouting()자동 | ❌ (기본 포함) |
| 인증 (Authorize 속성 사용 시) | ✅ UseAuthorization() 필요 | ✅ (사용 시 추가 필요) |
| 정적 파일 (wwwroot 활용 시) | ✅ UseStaticFiles() 필요 | ✅ (정적 파일 사용 시) |
| 예외 처리 (Exception Handling) | ✅ UseExceptionHandler() 필요 | ✅ (예외 페이지 추가 시) |
기본적인 MVC구조로 기능을 사용할 땨는 미들웨어를 추가할 필요는 없더. 하지만 추가적인 기능이 필요할 때는 미들웨어를 직접 추가해야 한다.
1. 정적 파일 제공(wwwroot)
app.UseStaticFiles(); // ✅ HTML, CSS, JS 등 정적 파일 제공
// 미들웨어가 없으면 /index.html 등의 정적 파일을 제공할 수 없다.
2. 인증 및 권한([Authorize] 사용 시)
[Authorize]
[ApiController]
[Route("api/orders")]
public class OrderController : ControllerBase
{
[HttpGet]
public IActionResult GetOrders() => Ok(new { message = "Orders List" });
}
아래와 같은 인증 미들웨어(UseAuthrization())을 추가해야 한다.
app.UseAuthorization(); // ✅ 인증 및 권한 체크 활성화
3. CORS (다른 도메인에서 API 요청 허용)
CORS를 허용하려면 UseCors() 미들웨어를 추가해야 한다.
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowAll", policy =>
{
policy.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
app.UseCors("AllowAll"); // ✅ CORS 허용
미들웨어가 없으면 브라우저에서 CORS 에러 발생할 수 있다.
4. 로깅 및 요청 처리 미들웨어 추가
app.Use(async (context, next) =>
{
Console.WriteLine($"[LOG] {context.Request.Method} {context.Request.Path}");
await next(); // 다음 미들웨어 실행
});
// 이제 모든 요청이 콘솔에 기록된다.
ASP.NET Core의 핵심 구성 요소이며, 요청과 응답을 처리하는 역할을 한다.ASP.NET Core MVC를 사용할 때 기본적인 미들웨어 (UseRouting(), UseAuthorization(), MapControllers())는 자동 포함된다.