সিস্টেমকে হ্যাকারদের স্প্যামিং এবং ক্লাউডের বিশাল বিল (Cloud Billing) থেকে বাঁচাতে আমরা API-এর ওপর একটি অদৃশ্য স্পিড ব্রেকার বসিয়ে দিই।
ধরি, আমরা একটি লগইন সিস্টেম বা পাবলিক API বানালাম। সবকিছু দারুণভাবে কাজ করছে। কিন্তু হঠাৎ একদিন একজন হ্যাকার স্ক্রিপ্ট লিখে আমাদের /api/login এন্ডপয়েন্টে প্রতি সেকেন্ডে ৫,০০০ রিকোয়েস্ট পাঠানো শুরু করলো।
ফলাফল কী হবে? আমাদের সার্ভারের RAM ফুল হয়ে অ্যাপ্লিকেশন ক্র্যাশ করবে (যাকে বলে DDoS Attack)। অথবা, হ্যাকার হাজার হাজার পাসওয়ার্ড কম্বিনেশন ট্রাই করে কোনো না কোনো ইউজারের অ্যাকাউন্ট হ্যাক করে ফেলবে (Brute-force Attack)। তাছাড়া, ডাটাবেসে এতগুলো কোয়েরি হিট করার কারণে মাসের শেষে AWS বা ক্লাউড প্রোভাইডার আমাদেরকে বিশাল বড় একটি বিল ধরিয়ে দেবে!
Node.js-এ এই সমস্যা সমাধানের সবচেয়ে সহজ এবং প্রোডাকশন-রেডি উপায় হলো express-rate-limit প্যাকেজ ব্যবহার করা। বড় স্কেলের অ্যাপ্লিকেশনে আমরা এর সাথে Redis যুক্ত করি যাতে একাধিক সার্ভার (Load balancer) এর মাঝে লিমিট সিঙ্ক (Sync) থাকে।
const rateLimit = require('express-rate-limit'); // 1. Standard API Limiter export const apiLimiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutes window max: 100, // Limit each IP to 100 requests per windowMs message: { error: 'Too many requests from this IP, please try again after 15 minutes.' }, standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers legacyHeaders: false, }); // 2. Strict Login Limiter (Against Brute-force) export const loginLimiter = rateLimit({ windowMs: 60 * 1000, // 1 minute window max: 5, // Start blocking after 5 consecutive failed attempts message: { error: 'Too many login attempts. Account locked for 60 seconds.' } });
চলুন প্র্যাকটিক্যালি দেখি। নিচের "Hit API" বাটনে খুব দ্রুত ক্লিক করতে থাকুন। আমাদের রুল সেট করা আছে: সর্বোচ্চ ৫টি রিকোয়েস্ট / ১০ সেকেন্ড। লিমিট ক্রস করলে সার্ভার আপনাকে সাময়িকভাবে ব্লক করে দিবে!