สรุปสั้น ๆ ก่อนเริ่มอ่าน
การทำ Rate Limiting ใน Express.js โดยใช้ Library ชื่อ express-rate-limit เป็น 1 ในวิธีการที่ง่ายและเหมาะสมสำหรับผู้พัฒนาที่ไม่ต้องการความยุ่งยากในการใช้วิธีการอื่น ๆ ในการป้องกัน DDoS Attack หรือ DoS Attack ซึ่งสามารถช่วยลดเวลา และความซับซ้อน ในการพัฒนาลงได้
Rate Limiting ใน API คืออะไร
Rate Limiting คือการกำหนดจำนวน โควต้า ในการเรียกใช้ตัว API ต่าง ๆ โดยจะกำหนดในลักษณะ จำนวนครั้ง ต่อ เวลา เช่น 100 ครั้ง ต่อ 1 นาที สำหรับ 1 ผู้ใช้งาน เพื่อป้องกันตัว API หรือ server ทำงานหนักเกินไป เนื่องจากมีการเรียกใช้จำนวนมาก จนล่มในที่สุด หรือ เพื่อแชร์ ทรัพยากร ให้ผู้เรียกใช้ API ได้จำนวนเท่า ๆ กัน โดยหลัก ๆ จะนิยมใช้ในการป้องกันการทำการโจมตีแบบ DDoS Attack หรือ Dos Attack ใส่ API
DDoS Attack และ Dos Attack คืออะไร
Distributed Denial of Service หรือ เรียกกันว่าสั้น ๆ ว่า DDoS คือการโจมตีทางไซเบอร์รูปแบบหนึ่ง ในลักษณะ ที่มีการส่งคำขอเข้าถึงข้อมูลจำนวนมาก ๆ พร้อมกัน มากเกินกว่า API หรือ Server จะรับได้ (มีตั้งแต่การกด F5 ยันใช้การเขียน Script เพื่อทำการโจมตี) ซึ่ง Denial of Service หรือ Dos ก็มีลักษณะเหมือนกันต่างกันที่ DDoS จะมีการโจมตีจากหลายที่ ส่วน Dos จะมาจากแหล่งเดียว ซึ่งการทำ Rate Limiting ใน API ก็เป็น 1 ในวิธีการป้องกัน
การทำ Rate Limiting ใน API บน Express.JS
โดยในการทำ Rate Limiting ใน API จะมี 2 รูปแบบหลัก ๆ ในการกำหนดตัวตนของผู้ที่เรียกใช้งาน API
- การกำหนดตัวตนโดยใช้ IP Address ของผู้เรียกใช้ เหมาะกับการงานที่ไม่มีการต้องให้มีการสมัครใช้งาน เพื่อยืนยันตัวผู้ใช้ แต่จะมีข้อเสียที่ ผู้ทำการโจมตีสามารถเปลี่ยนแปลง IP โดยใช้ Proxy หรือ VPN ได้ (หรืออีกวิธีคือ Restart Router อินเทอร์เน็ต) ซึ่งจะทำให้ Rate Limiting ไร้ประโยชน์
- การกำหนดตัวตนโดยใช้ข้อมูลผู้ใช้ หรือ Token เหมาะกับการงานที่มีการต้องให้มีการสมัครใช้งาน เพื่อยืนยันตัวผู้ใช้งาน
มาสู่การทำ Rate Limiting บน Express.js Framework โดยในบทความนี้จะเลือกใช้ Library Middleware สำหรับ Express.js ชื่อ express-rate-limit ซึ่งใช้วิธีการกำหนด IP Address ของผู้เรียกใช้ โดยในบทความจะขอข้ามในส่วนการใช้ express.JS ไปครับ สำหรับการใช้งาน Express.JS เบื้องต้น สามารถไปดูได้ที่คอร์ส Introduction to Web App Development with Node.js & Express ซึ่งเป็นคอร์สเรียนฟรีได้ของทาง borntoDev เลยครับ เรียนจบ ทำ Project ส่ง สามารถรับได้เกียรติบัตรด้วยนะ มาเริ่มด้วยขั้นตอนแรกในการใช้ Library ชื่อ express-rate-limit กันครับ
ทำการติดตั้ง express-rate-limit โดยใช้คำสั่ง
npm i express-rate-limit
ทำการ Import Library express-rate-limit เข้ามาใช้งาน (ใช้รูปแบบมาตราฐาน ES6)
import { rateLimit } from 'express-rate-limit'
สร้างตัวแปรชื่อ limiter หรือ ชื่ออื่นๆ เพื่อเก็บตัว Config ของ rateLimit
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // หน่วยเวลาเป็น มิลลิวินาที ในนี้คือ 15 นาที (1000 มิลลิวินาที = 1 วินาที)
max: 100, // จำนวนการเรียกใช้สูงสุดต่อ IP Address ต่อเวลาใน windowMS
standardHeaders: true, // คืน rate limit ไปยัง `RateLimit-*` ใน headers
legacyHeaders: false, // ปิด `X-RateLimit-*` ใน headers
})
จากนั้นเรียกใช้ตัวแปร ที่ได้ทำการสร้างไป โดยใช้ app.use() ซึ่งเป็นการเรียกใช้ Middleware ของ Express.js (ในตัวอย่างใช้ตัวแปรชื่อ limiter)
app.use(limiter)
โดยโครงสร้างของ Code ที่ได้จะเป็นลักษณะนี้
import express from "express";
import { rateLimit } from 'express-rate-limit'
//สร้าง express app
const app = express();
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // หน่วยเวลาเป็น มิลลิวินาที ในนี้คือ 15 นาที (1000 มิลลิวินาที = 1 วินาที)
max: 100, // จำนวนการเรียกใช้สูงสุดต่อ IP Address ต่อเวลาใน windowMS
standardHeaders: true, // คืน rate limit ไปยัง `RateLimit-*` ใน headers
legacyHeaders: false, // ปิด `X-RateLimit-*` ใน headers
})
//ใช้ middleware ทำ rate limit
app.use(limiter);
//ดูรายการสินค้าทั้งหมด
app.get("/product/all", (req, res) => {
//ส่งข้อมูลสินค้าทั้งหมดกลับไป ในรูปแบบของ JSON Array
try {
return res.status(200).json(database);
} catch (error) {
return res.status(500).json({message: "Internal server error"});
}
}
);
สรุป
การทำ Rate Limit บน Express.js โดยใช้ Library ชื่อ express-rate-limit เป็น 1 ในวิธีการที่ง่ายและเหมาะสมสำหรับผู้พัฒนาที่ไม่ต้องการความยุ่งยากในการใช้วิธีการอื่น ๆ ในการป้องกัน DDoS Attack หรือ DoS Attack
อ้างอิง
- DDoS คืออะไร? ทำไมเว็บไซต์ชื่อดังถึงล่ม? สืบค้นเมื่อ 1 เมษายน 2567 จาก https://nipa.cloud/th/blog/what-ddos-is
- express-rate-limit library documentation สือค้นเมื่อ 1 เมษายน 2567 จาก https://express-rate-limit.mintlify.app/