EMZETT.
Giriş yap

Hız sınırlama

Kısaca: Bir kullanıcının/bir IP adresinin belirli bir sürede kaç kez istek yapabileceğini sınırlama tekniği — kötüye kullanıma (örneğin kaba kuvvetle girişler, spam) ve aşırı yüke karşı korur.

Biraz daha ayrıntılı: Çoğu zaman Redis gibi hızlı bir önbellek üzerinden uygulanır (kullanıcı/IP başına, bitiş süreli bir sayaç). Hız sınırlama HER isteğe uygulanırsa (zararsız salt okunur sayfalar dahil), her sayfa görüntülemesi ek bir ağ gidiş-dönüşüne mal olur — yükleme süresinde fark edilir.

Bizim bağlamımız: Emzett’te başlangıçta her istekte küresel olarak çalışıyordu; ardından formu olmayan salt GET/HEAD okuma sayfaları muaf tutulacak biçimde kısıtlandı (giriş, ödeme, sohbet ve yönetim tamamen korumalı kalır), yükleme süresinden ve Redis yükünden tasarruf etmek için.

Ayrıntılı

En yaygın hız sınırlama yöntemi “kayan penceredir”: “son tam dakikadan beri kaç istek” diye saymak yerine kayan bir zaman penceresine bakılır (örneğin “şimdiden geriye sayarak son 60 saniyede kaç istek”) — bu, birinin bir dakika sınırının hemen öncesinde ve hemen sonrasında tam limiti kullanıp fiilen izin verilenin iki katı isteği geçirmesini önler. @upstash/ratelimit gibi kütüphaneler bunu, zaman penceresi mantığını kendin yazmak zorunda kalmadan Redis üzerinden sunucusuz olarak uygular:

const ratelimit = new Ratelimit({
  redis,
  limiter: Ratelimit.slidingWindow(100, "1 m"), // dakikada 100 istek
});
const { success } = await ratelimit.limit(`edge:${ip}`);
if (!success) {
  return new Response("Too many requests", { status: 429 });
}

Önemli olan sayım için HANGİ tanımlayıcının kullanıldığıdır: düz bir IP adresi basittir ama paylaşılan NAT’ların/kurumsal ağların arkasında sorunludur (birçok gerçek kullanıcı tek bir görünür IP’yi paylaşır) ve IP döndürme ile kolayca aşılır; IP + kullanıcı hesabı kombinasyonu (varsa) daha kesindir. Küresel dağıtık uç ortamlarında (Vercel Edge Functions gibi), sayaç deposunun kendisi de küresel olarak tutarlı olmalıdır — sunucu örneği başına yerel bir bellek içi sayaç, birkaç örnek paralel çalıştığında limiti fiilen katlardı; bu yüzden Redis gibi merkezî bir depo gerekir.

Ayrıca bak: Upstash Redis