Rate Limiting Stratejileri: API'nizi Aşırı Yükten Koruma
Rate limiting, belirli bir zaman diliminde bir API'ye yapılabilecek istek sayısını sınırlandıran bir güvenlik mekanizmasıdır. Bir kullanıcı veya IP adresi çok fazla istek gönderirse, ek istekler reddedilir. Bu sayede sunucunuz aşırı yükten korunur, hizmet kesintileri engellenir ve kötü niyetli saldırılar (DDoS, brute-force) azaltılır.
Token Bucket en yaygın yaklaşımdır. Sabit kapasiteli bir kova düşün: her saniye belirli sayıda token eklenir. İstek geldiğinde bir token harcanır. Kova boşsa, istek reddedilir.
Sliding Window ise geçmiş zaman penceresini takip eder. Son 60 saniyedeki istekleri sayar; limit aşılmışsa yeni istekleri engeller.
Fixed Window en basit yöntem: her dakika/saat başında sayaç sıfırlanır. Hızlı ama sınır anlarında sorun yaşayabilir.
Aşağıda Express.js kullanan basit bir rate limiter bulunuyor:
1const express = require('express');2const app = express();34class TokenBucket {5constructor(capacity, refillRate) {6this.capacity = capacity;7this.tokens = capacity;8this.refillRate = refillRate; // saniyede kaç token9this.lastRefill = Date.now();10}1112refill() {13const now = Date.now();14const elapsed = (now - this.lastRefill) / 1000;15this.tokens = Math.min(16this.capacity,17this.tokens + elapsed * this.refillRate18);19this.lastRefill = now;20}2122consume(amount = 1) {23this.refill();24if (this.tokens >= amount) {25this.tokens -= amount;26return true;27}28return false;29}30}3132const buckets = {};3334app.use((req, res, next) => {35const clientIP = req.ip;36if (!buckets[clientIP]) {37buckets[clientIP] = new TokenBucket(10, 2); // 10 token, saniyede 2 token38}3940if (buckets[clientIP].consume()) {41next();42} else {43res.status(429).json({ error: 'Too Many Requests' });44}45});4647app.get('/api/data', (req, res) => {48res.json({ message: 'Success', timestamp: new Date() });49});5051app.listen(3000, () => console.log('Server running on port 3000'));Çıktı örneği:
- İlk 10 istek: 200 OK
- 11. istek hemen: 429 Too Many Requests
- 1 saniye sonra 2 yeni token eklendiği için 2 istek geçer
Production ortamında Redis gibi dış bir cache kullanman daha güvenlidir. Çok sunuculu sistemlerde her sunucunun kendi sayacı varsa çelişkiler oluşur. Redis merkezi bir sayaç tutar.
Ayrıca API'nin rate limit bilgisini yanıt başlıklarında gönder:
1res.set('X-RateLimit-Limit', '10');2res.set('X-RateLimit-Remaining', buckets[clientIP].tokens.toFixed(0));3res.set('X-RateLimit-Reset', Math.ceil(buckets[clientIP].lastRefill / 1000) + 1);Bu başlıklar istemciye kalan istekleri bildirir. Rate limiting stratejisini ihtiyacınıza göre seçin: basit API'ler için Fixed Window yeterli, kritik hizmetler için Token Bucket tercih edin.
0 yorum