ASP.NET Core 속도 제한 미들웨어: 아키텍처 및 구성
ASP.NET Core는 웹 애플리케이션의 안정성과 보안을 유지하는 데 필수적인, 들어오는 요청의 속도를 제한하는 강력하고 유연한 메커니즘을 제공합니다. 이 기능의 핵심에는 일반 .NET 속도 제한 구성 요소를 사용하여 요청 흐름을 효율적으로 관리하는 특수 _속도 제한 미들웨어_가 있습니다. 이 미들웨어의 아키텍처, 구성 원칙 및 확장성을 이해하면 중급 및 고급 개발자가 견고하고 확장 가능한 솔루션을 구축할 수 있습니다. 이 글은 피상적인 사용법을 넘어 이 구성 요소의 개념과 작동 메커니즘을 심층적으로 다룹니다.
ASP.NET Core에서 속도 제한 미들웨어의 통합 및 구성
_속도 제한 미들웨어_는 ASP.NET Core의 속도 제한 시스템에서 핵심적인 역할을 합니다. 이 미들웨어는 들어오는 모든 HTTP 요청을 가로채어 미리 정의된 규칙에 따라 처리할지 거부할지 결정합니다. 이는 일반 .NET 속도 제한 구성 요소가 제공하는 기본 제한 알고리즘을 활용하는 어댑터 역할을 합니다.
_미들웨어 구성 요소_를 ASP.NET Core 요청 처리 파이프라인에 통합하려면 IApplicationBuilder 인터페이스의 UseRateLimiter 확장 메서드를 사용합니다. 파이프라인 내에서 이 미들웨어의 핵심 배치 요구 사항은 UseRouting과 UseEndpoints 호출 사이에 위치시키는 것입니다. 이는 요청의 경로가 결정된 후 최종 처리 엔드포인트에 도달하기 전에 제한이 적용되도록 보장합니다. WebApplication/WebApplicationBuilder 템플릿(ASP.NET Core 6.0부터)으로 구축된 애플리케이션에서는 이 조건이 기본적으로 충족되는 경우가 많습니다.
_미들웨어 구성 요소_의 동작은 RateLimiterOptions 클래스의 인스턴스 내에 캡슐화된 _제한자 구성 매개변수_를 통해 구성됩니다. UseRateLimiter 메서드에는 두 가지 주요 형태가 있습니다. 하나는 RateLimiterOptions 인스턴스를 직접 전달할 수 있게 하고, 다른 하나는 더 일반적으로 사용되며 Options 패턴에 따라 애플리케이션의 서비스 컨테이너에서 매개변수를 검색합니다.
메트릭 수집을 포함한 모든 기능을 사용하려면 필요한 서비스를 의존성 주입 컨테이너에 등록해야 합니다. 이는 IServiceCollection의 AddRateLimiter 확장 메서드를 사용하여 수행됩니다. ASP.NET Core 8부터는 이러한 서비스 등록이 필수가 되었습니다. AddRateLimiter 메서드는 매개변수로 전달된 델리게이트를 통해 RateLimiterOptions를 구성하는 역할도 합니다. ASP.NET Core 9에서는 델리게이트가 없는 AddRateLimiter 형태가 추가되어, 설정을 제공하는 다른 방법이 있음을 시사합니다. 이러한 매개변수의 효과적인 _구성_은 애플리케이션의 성능과 보안에 매우 중요합니다.
전역 및 정책 기반 속도 제한 메커니즘
ASP.NET Core의 속도 제한 기능은 독립적이면서도 상호 보완적인 두 가지 메커니즘, 즉 _전역 제한_과 _정책 기반 제한_으로 작동합니다. 요청은 두 메커니즘 모두로부터 허가를 받아야만 성공적으로 처리됩니다. 둘 중 하나가 구성되지 않았거나 현재 요청에 적용되지 않는 경우, 해당 허가는 자동으로 부여된 것으로 간주됩니다.
전역 요청 속도 제한
_전역 제한_은 예외 없이 모든 들어오는 요청에 적용됩니다. 이는 RateLimiterOptions의 GlobalLimiter 속성에 분할된 속도 제한자 인스턴스를 할당하여 구성됩니다. 이 제한자는 HttpContext 리소스 유형으로 매개변수화된 PartitionedRateLimiter 클래스의 객체여야 합니다. ASP.NET Core 컨텍스트에서는 HttpContext가 항상 제한자의 리소스 유형으로 사용됩니다. 전역 제한자 구성이 없으면 이 메커니즘은 비활성화됩니다. 전역 수준에서 트래픽을 관리하는 것은 첫 번째 방어선 역할을 합니다.
정책 기반 속도 제한
요청 흐름에 대한 더 세분화된 제어를 위해 _정책 기반 제한_이 사용됩니다. _요청 제한 정책_은 특정 경로 또는 라우팅 엔드포인트와 관련된 특정 요청 그룹에 특정 제한 규칙을 적용할 수 있도록 합니다. 정책은 RateLimiterOptions의 AddPolicy 메서드 오버로드를 사용하여 구성됩니다. 이 메서드를 통해 명명된 _제한 정책_을 구성에 추가할 수 있습니다.
정책은 다음과 같을 수 있습니다:
- 명명된 정책(Named): 고유 식별자와 함께
RateLimiterOptions에 등록됩니다. 여러 번 재사용할 수 있으며 다양한 경로에 바인딩될 수 있습니다. - 익명 정책(Unnamed): 특정 경로에 직접 바인딩되며 다른 곳에서 재사용할 목적으로 사용되지 않습니다.
명명된 정책을 구성하는 과정은 두 단계로 이루어집니다:
AddPolicy를 사용하여RateLimiterOptions에 명명된 정책을 추가합니다.- 라우팅 구성에서 이 정책을 하나 이상의 경로에 바인딩합니다.
익명 정책은 경로에 바인딩하기만 하면 됩니다. 이는 다양한 엔드포인트에 대한 _접근 관리_에 유연성을 제공합니다.
거부 처리 및 사용자 지정 정책 생성
속도 제한 메커니즘에 의해 요청이 거부되면, _미들웨어 구성 요소_는 특정 작업을 수행해야 합니다. 이 동작은 RateLimiterOptions의 OnRejected 및 RejectionStatusCode 속성을 통해 구성됩니다.
RejectionStatusCode 속성은 클라이언트에게 반환될 HTTP 상태 코드(예: 503 Service Unavailable 또는 429 Too Many Requests)를 정의합니다. OnRejected 속성은 _거부 핸들러_를 지정할 수 있도록 합니다. 이 핸들러는 HttpContext와 거부 컨텍스트 객체를 받는 비동기 델리게이트(ValueTask)입니다. 이 델리게이트는 응답을 수정하는 데 사용되며, 예를 들어 Retry-After 헤더를 추가하거나 거부 이유에 대한 더 자세한 정보를 제공할 수 있습니다.
_제한 정책_은 자체적인 특정 거부 핸들러를 가질 수 있다는 점을 유의해야 합니다. 특정 정책에 해당하는 요청에 전역 핸들러와 정책별 핸들러가 모두 정의되어 있는 경우, 항상 정책 내에 지정된 핸들러에 우선순위가 부여됩니다. 이 메커니즘은 _거부된 요청_에 대한 반응을 세밀하게 조정할 수 있게 합니다.
사용자 지정 속도 제한 정책 개발
표준 구성을 넘어 복잡하고 사용자 지정된 _제한_ 시나리오를 구현하기 위해 ASP.NET Core는 _사용자 지정 요청 제한 정책_을 생성하는 기능을 제공합니다. 이러한 정책은 TPartitionKey가 분할 키 유형을 정의하는 제네릭 IRateLimiterPolicy<TPartitionKey> 인터페이스를 구현해야 합니다.
IRateLimiterPolicy<TPartitionKey> 인터페이스는 두 가지 핵심 요소를 정의합니다:
GetPartition메서드: 이는 현재HttpContext를 기반으로 지정된 분할 키 유형을 가진 파티션에 대한 데이터를 반환하는 _분할 메서드_입니다. 이 메서드를 통해 클라이언트의 IP 주소, 사용자 ID, 헤더 값 또는 기타HttpContext매개변수를 기반으로 요청에 대한 기본 제한자를 동적으로 선택할 수 있습니다. 이는 속도 제한을 선택적으로 만들어, 동일한 정책에 속하더라도 다른 요청 그룹에 다른 제한을 적용할 수 있게 합니다.OnRejected속성: 앞서 언급했듯이, 이 특정 정책에 대한 특정 거부 핸들러를 정의하여 전역 핸들러를 재정의할 수 있습니다.
IRateLimiterPolicy<TPartitionKey>를 구현하는 객체는 _미들웨어 구성 요소_에 의해 _준비된 정책_을 생성하는 데 사용되며, 이 정책은 _요청 처리_에 직접 적용됩니다. 현재 버전에서는 이 인터페이스를 구현하는 클래스 외에도 HttpContext를 리소스 유형으로 하는 분할 델리게이트도 명명된 정책의 기반으로 사용될 수 있습니다.
사용자 지정 정책 및 _분할_의 적용은 개발자에게 정밀하고 적응성 있는 속도 제한 시스템을 구축하는 데 탁월한 유연성을 제공하며, 고부하 애플리케이션, 마이크로서비스 아키텍처 또는 공용 API의 고유한 요구 사항을 충족할 수 있습니다. 이는 효과적인 _리소스 관리_ 및 남용 방지에 기여합니다.
주요 요점
- ASP.NET Core의 속도 제한 미들웨어는 일반 .NET 속도 제한 메커니즘과 통합되어 트래픽 제어 및 보안을 위한 핵심 구성 요소입니다.
- 기능은 파이프라인에는
UseRateLimiter를, 서비스 등록 및 구성에는AddRateLimiter를 사용하여RateLimiterOptions를 통해 구성됩니다. - 이 시스템은 모든 요청에 대한 _전역 제한_과 특정 경로에 대한 세분화된 제어를 위한 _정책 기반_이라는 두 가지 수준의 속도 제한을 지원합니다.
- 거부 처리는
OnRejected및RejectionStatusCode를 통해 구성되며, 정책 수준에서 재정의할 수 있는 옵션이 있습니다. IRateLimiterPolicy<TPartitionKey>를 구현하는 _사용자 지정 정책_은 동적 제한자 선택 및 거부 로직 사용자 지정을 위해HttpContext를 기반으로 하는 복잡한 _분할_을 가능하게 합니다.
— Editorial Team
아직 댓글이 없습니다.