SECURITY ARCHITECTURE

API Rate Limiting

Definition: Rate limiting is a strategy for limiting network traffic. It puts a cap on how often someone can repeat an action within a certain timeframe (e.g., trying to log in to an account).

সিস্টেমকে হ্যাকারদের স্প্যামিং এবং ক্লাউডের বিশাল বিল (Cloud Billing) থেকে বাঁচাতে আমরা API-এর ওপর একটি অদৃশ্য স্পিড ব্রেকার বসিয়ে দিই।

1. The Vulnerability Problem

Architectural Challenge (DDoS & Brute-force)

ধরি, আমরা একটি লগইন সিস্টেম বা পাবলিক API বানালাম। সবকিছু দারুণভাবে কাজ করছে। কিন্তু হঠাৎ একদিন একজন হ্যাকার স্ক্রিপ্ট লিখে আমাদের /api/login এন্ডপয়েন্টে প্রতি সেকেন্ডে ৫,০০০ রিকোয়েস্ট পাঠানো শুরু করলো।

ফলাফল কী হবে? আমাদের সার্ভারের RAM ফুল হয়ে অ্যাপ্লিকেশন ক্র্যাশ করবে (যাকে বলে DDoS Attack)। অথবা, হ্যাকার হাজার হাজার পাসওয়ার্ড কম্বিনেশন ট্রাই করে কোনো না কোনো ইউজারের অ্যাকাউন্ট হ্যাক করে ফেলবে (Brute-force Attack)। তাছাড়া, ডাটাবেসে এতগুলো কোয়েরি হিট করার কারণে মাসের শেষে AWS বা ক্লাউড প্রোভাইডার আমাদেরকে বিশাল বড় একটি বিল ধরিয়ে দেবে!

Without Rate Limiting

  • সার্ভার সহজেই ওভারলোড হয়ে যায়।
  • বট (Bot) বা স্ক্রিপ্ট দিয়ে স্প্যামিং করা সহজ।
  • সার্ভার রিসোর্স এবং ডাটাবেস ব্যান্ডের অপচয়।

With Rate Limiting

  • নির্দিষ্ট সময়ের পর রিকোয়েস্ট ব্লক করে দেয়।
  • Brute-force অ্যাটাক শতভাগ প্রতিহত করে।
  • সিস্টেম সবসময় স্টেবল এবং ফাস্ট থাকে।

2. Express.js Implementation

Node.js-এ এই সমস্যা সমাধানের সবচেয়ে সহজ এবং প্রোডাকশন-রেডি উপায় হলো express-rate-limit প্যাকেজ ব্যবহার করা। বড় স্কেলের অ্যাপ্লিকেশনে আমরা এর সাথে Redis যুক্ত করি যাতে একাধিক সার্ভার (Load balancer) এর মাঝে লিমিট সিঙ্ক (Sync) থাকে।

middleware/rateLimiter.js
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.'
    }
});

3. API Spammer Simulator

চলুন প্র্যাকটিক্যালি দেখি। নিচের "Hit API" বাটনে খুব দ্রুত ক্লিক করতে থাকুন। আমাদের রুল সেট করা আছে: সর্বোচ্চ ৫টি রিকোয়েস্ট / ১০ সেকেন্ড। লিমিট ক্রস করলে সার্ভার আপনাকে সাময়িকভাবে ব্লক করে দিবে!

Current Rule:
Max 5 requests allowed per 10-second rolling window.
Node.js Server Port: 5000
Server is listening for requests...

IP BLOCKED

5

HTTP 429: Too Many Requests
Cooling down...