보고서는 모든 시스템에서 매우 일반적이며 일부는 처리하기에 매우 무거울 수 있습니다. 따라서이 경우 보고서 생성 중에 응용 프로그램이 저하되어 다른 사용자에게 영향을 줄 수 있습니다. 그러나 어떻게 우리는 이것을 피할 수 있습니까? 첫 번째 생각은 바닥을 차단하는 것입니다. 음,하지만 해킹하기가 너무 쉽습니다. 사용자는 HTML 소품을 편집하고 다시 활성화 할 수 있습니다. 따라서 가장 좋은 옵션은 일부 요청 제한 제어 전략을 사용하여 서버 측에서 차단하는 것입니다.
AspNetCoreRateLimit 요청 제어를 도울 수있는 라이브러리입니다. 규칙을 정의하여 클라이언트가 일정 기간 동안 리소스를 몇 번이나 호출 할 수 있는지 결정할 수 있습니다.
그러나 어떻게 작동합니까?
AspnetCoreratelimit는 MemoryCache 솔루션을 사용하여 클라이언트 요청에 대한 정보를 저장합니다. 예를 들어, 클라이언트는 특정 엔드 포인트에 대해 5 초 간격으로 10 번의 요청 만 할 수 있습니다. 따라서 각 요청은 메모리 캐시에 저장되며 클라이언트 가이 한도를 초과하면 응용 프로그램이 요청을 중지하고 HTTP 오류 상태를 반환합니다.
우선, 라이브러리 AspnetCoreratelimit를 설치해야합니다.
ASPNETCORERATELIMIT를 구성하는 가장 좋은 옵션은 AppSettings.json 내의 모든 정보를 정의하는 것입니다. 따라서 다음과 같은 블록을 만들 것입니다.
"IpRateLimiting": {
"EnableEndpointRateLimiting": true,
"StackBlockedRequests": false,
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429,
"GeneralRules": [
{
"Endpoint": "*/api/test",
"Period": "2s", //interval
"Limit": 2 //limit of request in the interval
}
]
},
규칙이 구성되면 Startup.cs 에 몇 줄을 추가해야합니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
//AspNetCoreRateLimit uses MemoryCache to control the numbers of requests
services.AddMemoryCache();
//Adding AspNetCoreRateLimit rules
services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));
//Adding the store
services.AddSingleton<IIpPolicyStore, MemoryCacheIpPolicyStore>();
//Adding the request counter
services.AddSingleton<IRateLimitCounterStore, MemoryCacheRateLimitCounterStore>();
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
services.AddHttpContextAccessor();
services.AddControllers();
services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "RequestLimit", Version = "v1" });
});
}
마지막 단계는 서비스를 활성화하는 것입니다.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "RequestLimit v1"));
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseIpRateLimiting() //Adding this block;
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
그리고 이제 우리의 API에는 요청 제어가 있습니다. 구체적인 규칙을 따르도록 구성을 사용자 정의 할 수 있습니다. 모든 옵션은 여기에 나열되어 있습니다 : https://github.com/stefanprodan/aspnetcoreratelimit.