REST API'lerde rate limiting, bir istemcinin belirli bir zaman diliminde gönderebileceği istek sayısını sınırlayan bir güvenlik ve performans mekanizmasıdır. Kötü niyetli kullanıcıların DDoS saldırıları veya aşırı yüklenme girişimleri olmadan, sunucunuzun kaynaklarını korumanıza yardımcı olur. Aynı zamanda adil kullanım politikası uygulayarak tüm kullanıcılar için eşit erişim sağlar.
Bu yazıda, rate limiting'in temel kavramlarını, yaygın stratejilerini ve Express.js ile pratik uygulamasını adım adım inceleyeceğiz.
Rate Limiting Nedir ve Neden Gereklidir?
Rate limiting, bir API uç noktasına yapılan isteklerin hızını kontrol eden bir tekniktir. Aşırı istekler sunucu kaynaklarını tüketebilir, yanıt sürelerini artırabilir ve hizmet kesintilerine yol açabilir. Özellikle halka açık API'lerde, kimlik doğrulama yapılmamış bile olsa, belirli bir IP'den gelen trafiği sınırlamak kritik öneme sahiptir.
Rate limiting uygulamanın başlıca nedenleri şunlardır:
- Sunucu kaynaklarının korunması: CPU, bellek ve bant genişliği gibi kaynakların aşırı kullanımını önler.
- DDoS saldırılarına karşı koruma: Dağıtık hizmet engelleme saldırılarının etkisini azaltır.
- Adil kullanım: Tüm kullanıcıların API'ye eşit erişimini garanti eder.
- Hata ayıklama kolaylığı: Beklenmedik yük artışlarını tespit etmenize yardımcı olur.
Rate limiting, özellikle JWT ile güvenli kimlik doğrulama gibi mekanizmalarla birlikte kullanıldığında API güvenliğini katmanlı hale getirir.
Temel Rate Limiting Stratejileri
Farklı kullanım senaryoları için çeşitli rate limiting algoritmaları bulunur. En yaygın olanları aşağıdaki tabloda karşılaştırılmıştır:
| Strateji | Çalışma Prensibi | Avantajları | Dezavantajları |
|---|---|---|---|
| Fixed Window | Zaman dilimi (örn. 1 dakika) sabit, sayaç her dilim sıfırlanır. | Kolay uygulama, düşük bellek tüketimi. | Anlık patlamalara izin verebilir (dilim başında ve sonunda eşik aşılabilir). |
| Sliding Window | Kayan bir zaman penceresi kullanır (örn. son 60 saniye). | Daha adil, patlama etkisini azaltır. | Daha karmaşık hesaplama, biraz daha fazla bellek. |
| Token Bucket | Belirli bir hızda token üretilir, her istek bir token tüketir. Token sayısı sınırlıdır. | Patlamalara izin verir (token biriktirerek), esnek. | Uygulaması daha karmaşık, token yönetimi gerekir. |
| Leaky Bucket | İstekler bir kuyruğa alınır, sabit hızda işlenir. Kuyruk dolarsa istekler reddedilir. | Çıkış hızını sabitler, aşırı yükü önler. | Gecikme artabilir, patlamalara iyi yanıt vermez. |
Hangi stratejinin kullanılacağı, API'nizin trafik desenine ve iş gereksinimlerinize bağlıdır. Genellikle sliding window veya token bucket, çoğu senaryo için en iyi dengeyi sağlar.
Express.js ile Rate Limiting Uygulaması
Node.js ve Express.js ekosisteminde rate limiting için popüler bir kütüphane express-rate-limit'dir. Aşağıda, temel bir yapılandırma örneği verilmiştir:
npm install express-rate-limitconst rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 dakika
max: 100, // her IP için 15 dakikada maksimum 100 istek
message: 'Çok fazla istek gönderdiniz, lütfen daha sonra tekrar deneyin.',
standardHeaders: true,
legacyHeaders: false,
});
// Tüm rotalar için rate limiting uygula
app.use(limiter);
// Belirli rotalar için farklı limitler
app.use('/api/auth', rateLimit({
windowMs: 15 * 60 * 1000,
max: 20,
}))Bu kod, tüm uygulama için genel bir limit belirler ve kimlik doğrulama gibi hassas rotalar için daha sıkı bir limit uygular. Merkezi hata yönetimi ile birleştirildiğinde, rate limit aşıldığında kullanıcıya anlamlı hata mesajları döndürebilirsiniz.
Rate Limiting Uygularken Dikkat Edilmesi Gerekenler
Rate limiting her ne kadar faydalı olsa da, yanlış yapılandırma sorunlara yol açabilir. İşte sık yapılan hatalar ve çözüm önerileri:
- Çok düşük limitler: Kullanıcıların normal kullanımını engelleyecek kadar düşük limitler koymayın. API'nizin tipik kullanımını analiz edin.
- IP adresine göre sınırlama: Birden fazla kullanıcı aynı IP'yi paylaşabilir (örneğin, kurumsal ağlar). Bu durumda, kullanıcı başına limit uygulamak için kimlik doğrulama token'larını kullanın.
- Yetersiz hata mesajları: Rate limit aşıldığında
429 Too Many Requestsyanıtı dönün veRetry-Afterbaşlığıyla ne zaman tekrar denemeleri gerektiğini belirtin. - Dağıtık sistemlerde tutarlılık: Birden fazla sunucu varsa, Redis gibi paylaşılan bir veri deposu kullanarak limit durumunu senkronize edin.
Sonuç
Rate limiting, REST API'lerin güvenilirliğini ve güvenliğini artırmak için vazgeçilmez bir araçtır. Doğru stratejiyi seçmek ve Express.js gibi çerçevelerle kolayca uygulamak mümkündür. Unutmayın, rate limiting'i API versiyonlama gibi diğer en iyi uygulamalarla birleştirdiğinizde, sağlam ve ölçeklenebilir bir API mimarisi elde edersiniz.
Sık Sorulan Sorular
Rate limiting ile throttling arasındaki fark nedir?
Rate limiting ve throttling sıkça birbirinin yerine kullanılsa da, rate limiting genellikle istek sayısını sınırlarken, throttling isteklerin hızını (örneğin, saniyede 10 istek) kontrol eder. Pratikte çoğu uygulama aynı amaca hizmet eder.
Rate limiting için hangi HTTP durum kodu kullanılmalıdır?
Rate limit aşıldığında 429 Too Many Requests durum kodu dönülmelidir. İsteğe bağlı olarak Retry-After başlığı ile kullanıcının ne kadar bekleyeceği de belirtilir.
Her kullanıcı için farklı limitler nasıl belirlenir?
Kullanıcı bazlı limitler için API anahtarı veya JWT token'ını kullanarak bir sayaç tutabilirsiniz. express-rate-limit kütüphanesi, keyGenerator fonksiyonu ile özel anahtarlar oluşturmanıza olanak tanır.
Rate limiting'i Redis ile nasıl ölçeklendirebilirim?
Birden fazla sunucu arasında tutarlı limitler için rate-limiter-flexible veya express-rate-limit'in Redis store sürümünü kullanabilirsiniz. Böylece tüm sunucular aynı sayaçları paylaşır.






