Node.js ile Hız Sınırlaması Middleware Yazma

API'niz çok fazla isteği kaldıramıyor veya spam saldırılarından korumak istiyorsanız hız sınırlaması (rate limiting) lazım. Bunu basit bir middleware ile hallederiz.

Problem: Bir kullanıcı saniyede yüzlerce istek gönderirse sunucu çöker. Çözüm: Belirli bir zaman içinde kaç istek yapabileceğini sınırlamak.

Aşağıda 10 saniyede maksimum 5 istek izin veren bir middleware var:

1const express = require('express');
2const app = express();
3
4// Kullanıcıları IP'ye göre takip etmek için bir harita
5const requestCounts = new Map();
6
7const rateLimitMiddleware = (req, res, next) => {
8const ip = req.ip;
9const now = Date.now();
10const timeWindow = 10000; // 10 saniye
11const maxRequests = 5;
12
13// Bu IP'nin kaydı yoksa oluştur
14if (!requestCounts.has(ip)) {
15requestCounts.set(ip, []);
16}
17
18const timestamps = requestCounts.get(ip);
19
20// Zaman penceresinin dışındaki istekleri temizle
21const validTimestamps = timestamps.filter(t => now - t < timeWindow);
22requestCounts.set(ip, validTimestamps);
23
24// Limit kontrol et
25if (validTimestamps.length >= maxRequests) {
26return res.status(429).json({
27error: 'Çok fazla istek gönderdiniz, lütfen bekleyin',
28retryAfter: Math.ceil((timeWindow - (now - validTimestamps[0])) / 1000)
29});
30}
31
32// Yeni isteği ekle
33validTimestamps.push(now);
34requestCounts.set(ip, validTimestamps);
35
36next();
37};
38
39// Middleware'i tüm rotalara uygula
40app.use(rateLimitMiddleware);
41
42app.get('/api/data', (req, res) => {
43res.json({ message: 'Başarılı', timestamp: new Date() });
44});
45
46app.listen(3000, () => console.log('Server 3000 portunda çalışıyor'));

Çalıştırma:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1npm install express
2node app.js
3
4# Başka bir terminalde test et

Beklenen çıktı: İlk 5 istek başarılı, 6. istek 429 hatasını döner.

Sık yapılan hata: Bellek sızıntısı. Eğer IP'ler hiç temizlenmezse harita sonsuza kadar büyür. Yukarıdaki kod bunu zaten engelliyor, ama production'da `express-rate-limit` paketi kullanmak daha güvenli:

1npm install express-rate-limit

Gerçek projede bunu tercih et, daha stabil ve test edilmiş.

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