ASP.NET Core로 마이그레이션을 고려하는 개발자라면 가장 먼저 마주치는 질문 중 하나가 "기존의 HttpModule과 미들웨어(Middleware)는 무엇이 다른가?"입니다. 두 기술 모두 HTTP 요청 파이프라인에서 공통 로직을 처리한다는 점에서 유사하지만, 구성 방식과 실행 흐름 제어 측면에서 큰 차이가 있습니다.
HttpModule의 특징
전통적인 ASP.NET의 HttpModule은 web.config 또는 global.asax 파일을 통해 구성됩니다. 모듈의 실행 순서는 주로 애플리케이션 수명 주기(Life Cycle) 이벤트에 의해 결정되기 때문에, 개발자가 실행 순서를 직접 제어하기 어렵습니다. 또한 요청(Request)과 응답(Response) 단계에서 실행 순서가 동일하게 유지됩니다.
- 구성 방식: web.config 또는 global.asax를 통해 설정
- 실행 순서: 애플리케이션 수명 주기 이벤트에 종속적이며 개발자가 제어하기 어려움
- 역할: 애플리케이션 이벤트에 특정 코드를 연결(Attach)
- 종속성: System.Web에 강하게 결합됨
미들웨어(Middleware)의 특징
반면 ASP.NET Core의 미들웨어는 web.config 파일이 아닌 Startup.cs(애플리케이션 진입점)의 Configure 메서드 내 코드로 구성됩니다. HttpModule과 달리 어떤 컴포넌트가 어떤 순서로 실행될지를 개발자가 완전히 제어할 수 있으며, 미들웨어는 추가된 순서대로 실행됩니다.
특히 응답 단계에서의 미들웨어 실행 순서는 요청 단계의 역순이라는 점이 중요합니다. 즉, 요청이 들어올 때 A → B → C 순서로 통과했다면, 응답이 나갈 때는 C → B → A 순서로 되돌아갑니다. 또한 미들웨어는 애플리케이션 수명 주기 이벤트와 무관하고, 호스트(IIS, Kestrel 등)에도 독립적이므로 다양한 호스팅 환경에서 일관되게 동작합니다.
핵심 차이점 한눈에 보기
| 구분 | HttpModule | 미들웨어 |
|---|---|---|
| 구성 위치 | web.config / global.asax | Startup.cs (Configure 메서드) |
| 실행 순서 제어 | 개발자가 제어 불가 | 추가된 순서대로 완전한 제어 가능 |
| 응답 시 순서 | 요청과 동일 | 요청의 역순 |
| 수명 주기 이벤트 | 종속적 | 독립적 |
| 호스트 종속성 | IIS / System.Web 종속 | 호스트 독립적 |
ASP.NET Core 기본 제공 미들웨어
ASP.NET Core는 자주 사용되는 기능들을 기본 제공 미들웨어 형태로 제공합니다.
- Authentication(인증): 인증 기능을 지원합니다.
- CORS: 교차 출처 리소스 공유(Cross-Origin Resource Sharing)를 구성합니다.
- Routing(라우팅): 요청 경로를 정의하고 제약 조건을 설정합니다.
- Session(세션): 사용자 세션 관리를 지원합니다.
- Diagnostics(진단): 오류 페이지 및 런타임 정보 확인 기능을 제공합니다.
커스텀 미들웨어 작성 예제
다음은 간단한 로깅 미들웨어를 클래스 기반으로 작성한 예제입니다.
public class MyMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
public MyMiddleware(RequestDelegate next, ILoggerFactory logFactory)
{
_next = next;
_logger = logFactory.CreateLogger("MyMiddleware");
}
public async Task Invoke(HttpContext httpContext)
{
_logger.LogInformation("MyMiddleware executing..");
await _next(httpContext); // 다음 미들웨어 호출
}
}
확장 메서드(Extension Method)를 활용하면 미들웨어를 HTTP 요청 파이프라인에 더 깔끔하게 등록할 수 있습니다.
public static class MyMiddlewareExtensions
{
public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyMiddleware>();
}
}
마지막으로 Startup.cs의 Configure 메서드에서 Use 확장 메서드를 통해 커스텀 미들웨어를 요청 파이프라인에 추가합니다.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMiddleware<MyMiddleware>();
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
}
마무리
정리하면, HttpModule은 수명 주기 이벤트와 System.Web에 묶여 있는 반면, 미들웨어는 개발자가 실행 순서를 완전히 제어할 수 있고 호스트에도 독립적입니다. 따라서 ASP.NET Core 프로젝트에서는 인증, 로깅, 예외 처리 같은 공통 관심사를 미들웨어 방식으로 구현하는 것이 권장됩니다.