Bir API'yi dış dünyaya açtığınızda, iyi niyetli kullanıcıların yanı sıra, sistemi kasıtlı ya da kazayla aşırı yükleyebilecek istemcilerle de karşılaşıyorsunuz. Rate limiting, bu riske karşı en temel savunma katmanlarından biri.

ASP.NET Core'un Yerleşik Rate Limiting Middleware'i

builder.Services.AddRateLimiter(options =>
{
    options.AddFixedWindowLimiter("fixed", opt =>
    {
        opt.PermitLimit = 100;
        opt.Window = TimeSpan.FromMinutes(1);
    });
});

.NET 7 ile gelen yerleşik rate limiting middleware'i, dış bir kütüphaneye ihtiyaç duymadan temel senaryoları karşılıyor.

Kullanıcı Bazlı mı, IP Bazlı mı?

Kimliği doğrulanmış bir API için kullanıcı/API key bazlı limitleme, anonim bir API için IP bazlı limitleme daha anlamlı oluyor. Bazı projelerde ikisini birlikte kullanıyorum: kimliği doğrulanmamış istekleri IP'ye göre, doğrulanmış istekleri kullanıcıya göre sınırlıyorum.

429 Durumu ve Retry-After Header'ı

Limit aşıldığında sadece bir hata döndürmek yerine, 429 Too Many Requests durum kodu ile birlikte Retry-After header'ı da döndürüyorum; bu, iyi niyetli istemcilerin ne zaman tekrar deneyeceğini bilmesini sağlıyor.

Kritik Endpoint'lere Daha Sıkı Limitler

Tüm API'ye tek bir genel limit uygulamak yerine, giriş/şifre sıfırlama gibi kötüye kullanıma daha açık endpoint'lere daha sıkı, özel limitler tanımlıyorum. Bu, kaba kuvvet (brute force) saldırılarına karşı ek bir koruma katmanı sağlıyor.

Sonuç

Rate limiting, "birileri kötüye kullanacak" senaryosuna hazırlıklı olmanın basit ama etkili bir yolu. Bunu sonradan eklenecek bir özellik değil, API'nin ilk tasarımının bir parçası olarak ele almak, ileride yaşanacak sürprizleri azaltıyor.