Web Uygulamalarında Rate Limiting ile API Kötüye Kullanımını Engelleme
Web Uygulamalarında Rate Limiting ile API Kötüye Kullanımını Engelleme
Sistem Yöneticisi
Kıdemli Yazılım Mimarı
{ "title": "Web Uygulamalarında Rate Limiting Rehberi: API Kötüye Kullanımını Önleme", "slug": "web-uygulamalarinda-rate-limiting-rehberi-api-guvenligi", "summary": "Modern web sistemlerinde API kötüye kullanımını engelleyen rate limiting rehberi. Algoritmalar, mimari tercihler ve adım adım uygulama.", "content": "
Modern Web Sistemlerinde Rate Limiting Neden Zorunlu?
DDoS, brute-force, web scraping ve kontrolsüz bot trafiği sunucu kaynaklarını tüketir. Dijital ajans ekipleri ve yazılım mühendisleri için modern web trendleri veri güvenliğini ve API erişilebilirliğini ilk sıraya koyar. Doğru yapılandırılmış rate limiting, altyapı maliyetini düşürür, sistem kesintilerini önler.
Temel Rate Limiting Algoritmaları
1. Token Bucket
Kova sabit hızla token ile dolar. Her istek bir token harcar. Kova boşsa istek reddedilir. Kısa süreli trafik patlamalarına (burst) izin verir.
2. Leaky Bucket
İstekler kuyruğa girer, sabit hızla işlenir. Kuyruk dolarsa yeni istekler atılır. Çıkış trafiğini pürüzsüzleştirir.
3. Fixed Window Counter
Zaman sabit pencerelere bölünür (örn. 1 dakika). Sayaç limiti aşarsa istek reddedilir. Pencere sınırlarında 2 katı trafik geçiş riski taşır.
4. Sliding Window Log / Counter
Zaman damgalarını dinamik işler. Fixed window açığını kapatır. Bellek kullanımı dengelidir, modern web servislerinde standart tercihtir.
Adım Adım Rate Limiting Uygulama
Adım 1: Tanımlayıcı (Identifier) Belirleme
Limiti neye göre uygulayacağınızı seçin:
- IP Adresi: Anonim API uç noktaları için. (NAT arkasındaki kullanıcılar için dezavantajlıdır).
- API Anahtarı / Bearer Token: Kimliği doğrulanmış kullanıcılar için en güvenilir yöntem.
- Endpoint Bazlı: Ağır maliyetli sorgular (örn. /export, /search) için özel limitler.
Adım 2: Dağıtık Sayaç Katmanı (Redis)
Çoklu sunuculu mimarilerde sayaç verisi merkezi olmalıdır. Redis atomik komutları (INCR, EXPIRE) yarış durumlarını (race condition) önler.
Adım 3: Nginx Seviyesinde Hızlı Bloklama
Uygulama sunucusuna yük binmeden ters vekil (reverse proxy) katmanında istekleri filtreleyin:
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend_app;
}
}
}Adım 4: Standart HTTP Başlıkları ve 429 Yanıtı
İstemci limit aştığında 429 Too Many Requests durum kodu ve bilgilendirici başlıklar dönün:
- X-RateLimit-Limit: İzin verilen kota.
- X-RateLimit-Remaining: Kalan kota miktarı.
- X-RateLimit-Reset: Kotanın sıfırlanacağı Unix epoch saniyesi.
- Retry-After: Tekrar denemeden önce beklenecek saniye.
En İyi Pratikler
Güvenlik katmanında tek limit yetersizdir. Global, kullanıcı bazlı ve uç nokta bazlı kademeli kısıtlamalar uygulayın.
- Dinamik Limitler: Güvenilir veya ücretli kullanıcılara daha yüksek kotalar tanımlayın.
- Circuit Breaker Entegrasyonu: Redis çökerse API trafiğini tamamen kesmeyin; fail-open moduna geçin ve log üretin.