Bạn có một API Login /api/auth/login.
Hacker viết một script thử 10.000 mật khẩu mỗi giây.
- Hậu quả 1: Database của bạn quá tải -> Web sập (DDOS).
- Hậu quả 2: Hacker tìm ra mật khẩu đúng (Brute-force thành công).
Rate Limiting (Giới hạn tốc độ) là người bảo vệ đứng ở cửa: "Anh chỉ được thử 5 lần mỗi phút thôi nhé".
1. Thuật toán "Sliding Window"
Để đếm số request chính xác, chúng ta cần một bộ nhớ đệm cực nhanh -> Redis. Database SQL quá chậm để làm việc đếm này (và tốn kém connection).
Logic:
- Mỗi khi IP
1.2.3.4gọi API. - Tăng counter trong Redis:
INCR rate_limit:1.2.3.4. - Đặt thời gian hết hạn (TTL):
EXPIRE rate_limit:1.2.3.4 60(60 giây). - Nếu counter > 10 -> Trả về lỗi
429 Too Many Requests.
2. Triển khai với Next.js Middleware & Upstash
Sử dụng thư viện @upstash/ratelimit (Serverless friendly).
// middleware.ts
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
// Tạo bộ đếm: 10 requests mỗi 10 giây
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(10, "10 s"),
});
export async function middleware(req: NextRequest) {
// Chỉ limit các route API
if (req.nextUrl.pathname.startsWith("/api")) {
const ip = req.ip ?? "127.0.0.1";
// Check limit
const { success, limit, reset, remaining } = await ratelimit.limit(ip);
// Nếu hết lượt -> Chặn ngay lập tức
if (!success) {
return new NextResponse("Too Many Requests", {
status: 429,
headers: {
"X-RateLimit-Limit": limit.toString(),
"X-RateLimit-Remaining": remaining.toString(),
"X-RateLimit-Reset": reset.toString(),
},
});
}
}
return NextResponse.next();
}3. Chiến lược nâng cao
- IP-based: Cơ bản nhất, nhưng dễ bị bypass nếu hacker dùng Proxy/VPN.
- User-based: Sau khi login, limit theo User ID (VD: Mỗi user chỉ được post 1 comment/phút). Chính xác hơn IP.
- Exponential Backoff: Nếu vi phạm -> Cấm 1 phút. Vi phạm tiếp -> Cấm 10 phút -> Cấm 1 ngày.
4. Captcha: The Last Resort
Nếu Rate Limit bị vượt qua, hãy dùng Google reCAPTCHA hoặc Cloudflare Turnstile làm chốt chặn cuối cùng. "Bạn request nhanh quá, chứng minh bạn là con người đi".
Kết luận
Rate Limiting là tấm khiên đầu tiên bảo vệ Server của bạn. Trong thế giới Serverless (nơi bạn trả tiền cho từng miligiây CPU), việc để hacker spam API không chỉ sập web mà còn làm bạn phá sản vì hóa đơn Cloud (Bill Shock).