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();34// Kullanıcıları IP'ye göre takip etmek için bir harita5const requestCounts = new Map();67const rateLimitMiddleware = (req, res, next) => {8const ip = req.ip;9const now = Date.now();10const timeWindow = 10000; // 10 saniye11const maxRequests = 5;1213// Bu IP'nin kaydı yoksa oluştur14if (!requestCounts.has(ip)) {15requestCounts.set(ip, []);16}1718const timestamps = requestCounts.get(ip);1920// Zaman penceresinin dışındaki istekleri temizle21const validTimestamps = timestamps.filter(t => now - t < timeWindow);22requestCounts.set(ip, validTimestamps);2324// Limit kontrol et25if (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}3132// Yeni isteği ekle33validTimestamps.push(now);34requestCounts.set(ip, validTimestamps);3536next();37};3839// Middleware'i tüm rotalara uygula40app.use(rateLimitMiddleware);4142app.get('/api/data', (req, res) => {43res.json({ message: 'Başarılı', timestamp: new Date() });44});4546app.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 express2node app.js34# Başka bir terminalde test etBeklenen çı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-limitGerçek projede bunu tercih et, daha stabil ve test edilmiş.
0 yorum