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:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1const express = require('express');
2const app = express();
3
4class TokenBucket {
5constructor(capacity, refillRate) {
6this.capacity = capacity;
7this.tokens = capacity;
8this.refillRate = refillRate; // saniyede kaç token
9this.lastRefill = Date.now();
10}
11
12refill() {
13const now = Date.now();
14const elapsed = (now - this.lastRefill) / 1000;
15this.tokens = Math.min(
16this.capacity,
17this.tokens + elapsed * this.refillRate
18);
19this.lastRefill = now;
20}
21
22consume(amount = 1) {
23this.refill();
24if (this.tokens >= amount) {
25this.tokens -= amount;
26return true;
27}
28return false;
29}
30}
31
32const buckets = {};
33
34app.use((req, res, next) => {
35const clientIP = req.ip;
36if (!buckets[clientIP]) {
37buckets[clientIP] = new TokenBucket(10, 2); // 10 token, saniyede 2 token
38}
39
40if (buckets[clientIP].consume()) {
41next();
42} else {
43res.status(429).json({ error: 'Too Many Requests' });
44}
45});
46
47app.get('/api/data', (req, res) => {
48res.json({ message: 'Success', timestamp: new Date() });
49});
50
51app.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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz