[Core 3.1] ASP.NET Core 미들웨어 - 미들웨어 순서

728x90
반응형

원 글은 MSDN의 문서입니다만, 해당 글을 그대로 읽고 있자니, 이해가 안되는 부분이 있어서 영문버전의 MSDN을 각각 번역하면서 다시 한번 정리한 글입니다.

 


미들웨어 순서

미들웨어 구성 요소가 Startup.Configure 메서드에 추가되는 순서에 의해서 미들웨어가 호출되는 순서가 결정됩니다. 요청 시에는 추가된 순서대로 호출되고 응답 시에는 그 역순으로 호출 됩니다. 이 순서는 보안, 성능 및 기능에 민감한 영향을 줍니다. 

 

다음 Startup.Configure 메서드는 보안 관련 미들웨어 구성 요소를 아래의 순서에 따라 추가합니다. 

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    // app.UseCookiePolicy();

    app.UseRouting();
    // app.UseRequestLocalization();
    // app.UseCors();

    app.UseAuthentication();
    app.UseAuthorization();
    // app.UseSession();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

위 코드에서

  • 개별 사용자 계정으로 새 웹 앱을 만들 때 추가되지 않은 미들웨어는 주석 처리됩니다.
  • 모든 미들웨어가 이 순서대로 진행 해야 하는 것은 아닙니다. 예를 들어, UseCors, UseAuthenticationUseAuthorization은 표시된 순서대로 진행되어야합니다.

다음 Startup.Configure 메서드는 일반적인 앱 시나리오를 위한 미들웨어 구성 요소를 추가합니다.

 


1. Exception/error handling

  • 앱이 개발환경에서 실행되는 경우
    • 개발자 예외 페이지 미들웨어가 (UseDeveloperExceptionPage) 가 앱 런타임 오류를 보고합니다.
    • 데이터베이스 오류페이지 미들웨어가 데이터베이스 런타임 오류를 보고합니다.
  • 앱이 프로덕션 환경에서 실행되는 경우
    • 예외 처리기 미들웨어 (UseExceptionHandler)는 다음 미들웨어에서 발생한 예외를 포착합니다.
    • HSTS(HTTP Strict Transport Security Protocol) 미들웨어 (UseHsts)는 Strict-Transport-Security헤더를 추가합니다.

2. HTTPS 리디렉션 미들웨어 (UseHttpsRedirection)는 HTTP 요청을 HTTPS로 리디렉션합니다.

 

3. 정적 파일 미들웨어 (UseStaticFiles)는 정적 파일을 리턴하고 추가 요청 처리를 단락시킵니다.

 

4. 쿠키 정책 미들웨어 (UseCookiePolicy)는 앱을 EU 일반 데이터 보호 규정 (GDPR) 규정에 따릅니다.

 

5. 요청을 라우팅하기위한 미들웨어 라우팅 (UseRouting)

 

6. 인증 미들웨어 (UseAuthentication)는 보안 자원에 대한 액세스가 허용되기 전에 사용자 인증을 시도합니다.

 

7. 권한 미들웨어 (UseAuthorization)는 사용자가 보안 자원에 액세스 할 수있는 권한을 부여합니다.

 

8. 세션 미들웨어 (UseSession)는 세션 상태를 설정하고 유지합니다. 앱이 세션 상태를 사용하는 경우 쿠키 정책 미들웨어 이후 및 MVC 미들웨어 전에 세션 미들웨어를 호출하십시오.

 

9. 엔드 포인트 라우팅 미들웨어 (MapRazorPages 를 포함하는 UseEndPoints)를 사용하여 요청 파이프라인에 Razor Pages 엔드포인트를 추가합니다.

 


 

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseSession();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

앞의 예제 코드에서 각 미들웨어 확장 메서드는 Microsoft.AspNetCore.Builder 네임스페이스를 통해 IApplicationBuilder에 노출 됩니다.

 

UseExceptionHandler는 파이프라인에 처음으로 추가된 미들웨어 구성 요소입니다. 따라서 예외 처리기 미들웨어는 후속 호출에서 발생하는 모든 예외를 잡습니다.

 

정적 파일 미들웨어는 파이프라인 초기에 호출되므로 요청을 처리하고 나머지 구성 요소를 거치지 않고 단락(short-circuit)할 수 있습니다. 정적 파일 미들웨어는 권한 확인을 제공하지 않습니다. wwwroot 아래에 포함하여 정적 파일 미들웨어가 제공하는 모든 파일은 공개적으로 사용 가능합니다. 정적 파일을 보호하는 방법은 ASP.NET Core의 정적 파일을 참조하세요.

 

정적 파일 미들웨어가 요청을 처리하지 않으면 인증 미들웨어(UseAuthentication)로 전달되어 인증을 수행합니다. 인증은 인증되지 않은 요청을 단락(short-circuit)하지 않습니다. 인증 미들웨어가 요청을 인증하지만, MVC가 특정 Razor Page 또는 MVC 컨트롤러 및 작업을 선택한 후에만 권한 부여(및 거부)가 발생합니다.

 

다음 예제는 정적 파일 미들웨어가 응답 압축 미들웨어 전에 정적 파일에 대한 요청을 처리하는 미들웨어 순서를 보여줍니다. 정적 파일은 이 미들웨어 순서로 압축되지 않습니다. Razor Pages 응답을 압축할 수 있습니다.

 

public void Configure(IApplicationBuilder app)
{
    // Static files aren't compressed by Static File Middleware.
    app.UseStaticFiles();

    app.UseResponseCompression();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

 

 

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1
https://docs.microsoft.com/ko-kr/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1

 

 

 

728x90