Skip to main content
1

สรุปสั้น ๆ ก่อนเริ่มอ่าน

การทำ 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


อ้างอิง

กรฤต แสงทอง

Author กรฤต แสงทอง

More posts by กรฤต แสงทอง
Close Menu

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า