NestJS’de Rate Limiting Uygulaması: IP ve Cihaz ID Tabanlı Stratejiler
Merhaba! Bu yazıda, NestJS uygulamalarınızda rate limiting (hız sınırlama) mekanizmasını nasıl entegre edeceğinizi adım adım açıklayacağım. Rate limiting, belirli bir zaman aralığında yapılan istek sayısını sınırlayarak sunucunuzun aşırı yüklenmesini ve performans düşüşlerini önlemenizi sağlar. Özellikle API’lerinizin kötü amaçlı kullanımlara karşı korunması için son derece önemlidir. Bu rehberde, hem IP tabanlı hem de cihaz ID tabanlı rate limiting stratejilerini ele alacağız.
IP Tabanlı Rate Limiting
IP tabanlı rate limiting, belirli bir IP adresinden gelen istekleri sınırlar. Bu, aynı IP adresinden gelen çok sayıda istekle sunucuyu aşırı yüklemeyi önlemek için etkili bir yöntemdir. Örneğin, belirli bir IP adresinden dakikada 100’den fazla istek gelmesini engelleyebilirsiniz. Bunun için öncelikle bir istek sayacı tutmamız ve bu sayacı her istekte güncellememiz gerekiyor. İşte NestJS’de bunu nasıl yapabileceğimize dair bir örnek:
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class RateLimitMiddleware implements NestMiddleware {
private readonly requests = new Map();
use(req: Request, res: Response, next: NextFunction) {
const ip = req.ip;
const limit = 100; // Dakikadaki maksimum istek sayısı
const timeWindow = 60000; // Milisaniye cinsinden zaman penceresi
let count = this.requests.get(ip) || 0;
const now = Date.now();
// Eski istekleri temizleme
this.requests.forEach((value, key, map) => {
if (now - key > timeWindow) {
map.delete(key);
}
})
if (count >= limit) {
return res.status(429).send('Too Many Requests');
}
count++;
this.requests.set(ip, count);
next();
}
}
Bu middleware, gelen her isteğin IP adresini takip eder ve izin verilen limiti aşarsa 429 (Too Many Requests) hatası döndürür. Bu basit bir örnektir, daha gelişmiş senaryolar için redis gibi bir önbelleğe ihtiyaç duyabilirsiniz. Web sitemde daha karmaşık örnekler bulabilirsiniz.
Cihaz ID Tabanlı Rate Limiting
IP tabanlı limitleme, proxy veya VPN kullanan kullanıcıları doğru bir şekilde sınırlandırmayabilir. Bu yüzden cihaz ID tabanlı rate limiting daha güvenilir bir çözümdür. Cihaz ID’si, cihazın benzersiz bir tanımlayıcısı olabilir (örneğin, UUID). Uygulamanız kullanıcı kimlik doğrulaması yapıyorsa, kullanıcı ID’sini kullanabilirsiniz. Bu yöntem, aynı cihazdan gelen çok sayıda isteği engellemeye yardımcı olur.
Cihaz ID’sini elde etmek için, istek başlıklarında bir “Device-ID” göndermesini veya uygulamanızda cihaz kimliği oluşturup saklamasını sağlayabilirsiniz. Yukarıdaki middleware örneğine benzer bir şekilde, cihaz ID’sini kullanarak istekleri sayabilir ve limiti kontrol edebilirsiniz. Ancak, cihaz ID’sinin güvenli bir şekilde elde edildiğinden ve saklandığından emin olmalısınız.
Rate Limiting Kütüphaneleri
Rate limiting uygulamasını kolaylaştırmak için çeşitli NestJS kütüphaneleri mevcuttur. Bu kütüphaneler, redis entegrasyonu gibi gelişmiş özellikler sunar ve geliştirme sürenizi kısaltır. Araştırmanızı yaparak projenize en uygun kütüphaneyi seçebilirsiniz.
Sonuç
Bu rehberde, NestJS uygulamalarında IP tabanlı ve cihaz ID tabanlı rate limiting’i nasıl uygulayacağınızı öğrendiniz. Rate limiting, uygulamanızın güvenliğini ve performansını korumak için önemli bir adımdır. Doğru stratejiyi seçerken ve uygularken uygulamanızın spesifik ihtiyaçlarını ve güvenlik gereksinimlerini göz önünde bulundurmanız önemlidir. Umarım bu rehber faydalı olmuştur! İlginizi çekebilecek İngilizce bir kaynak için buraya bakabilirsiniz.
#Etiketler: NestJS, Rate Limiting, Hız Sınırlama, IP Tabanlı, Cihaz ID Tabanlı, Güvenlik, Performans, Rehber, Tutorial, FatihSoysal