Pembatasan tarif adalah strategi yang dapat Anda gunakan untuk mengontrol lalu lintas di jaringan. Ini membatasi jumlah permintaan yang dapat dibuat pengguna dalam jangka waktu tertentu.

Berbagai algoritma pembatas kecepatan ada, masing-masing dengan trade-off-nya sendiri. Salah satu metode sederhana dan populer adalah melacak alamat IP permintaan dan memeriksa berapa lama waktu yang berlalu antara permintaan. Sistem kemudian dapat menolak permintaan jika alamat IP-nya melebihi jumlah permintaan yang diizinkan oleh batas.

Pendekatan untuk membatasi nilai ini mudah dibuat dalam aplikasi NodeJS-Express, hanya dengan beberapa langkah.

Langkah 1: Menyiapkan Lingkungan Pengembangan

Pertama, Anda harus membuat dan menginisialisasi aplikasi Express.

Mulailah dengan membuat direktori proyek dengan menjalankan:

mkdir express-aplikasi

Kemudian masukkan direktori itu dengan menjalankan:

CD aplikasi ekspres

Selanjutnya, inisialisasi npm, manajer paket simpul, dan buat package.json file di aplikasi Anda dengan menjalankan:

instagram viewer
npm init -y

Itu -y bendera akan membuat Anda package.json file dengan semua pengaturan default.

Selanjutnya, Anda perlu menginstal beberapa dependensi. Dependensi yang diperlukan untuk tutorial ini adalah:

  • ExpressJS: ExpressJS adalah kerangka kerja NodeJS yang menyediakan serangkaian fitur tangguh untuk aplikasi web dan seluler. Ini menyederhanakan proses membangun aplikasi backend dengan NodeJS.
  • Batas Tarif Ekspres: Batas kecepatan ekspres adalah middleware pembatas kecepatan untuk ExpressJS. Ini membatasi permintaan berulang ke API publik dan/atau titik akhir, seperti pengaturan ulang kata sandi, login pengguna, dll.

Instal dependensi yang diperlukan dengan menjalankan:

npm Install express rate-membatasi

Langkah 2: Membuat Aplikasi Ekspres

Anda harus membuat server Express dasar yang mendengarkan permintaan yang dibuat ke aplikasi Anda.

Pertama, buat index.js file di direktori root proyek Anda. Ini akan menjadi file entri untuk aplikasi Anda.

Selanjutnya, tambahkan kode berikut ke Anda index.js mengajukan:

// indeks.js
konstan ekspres = memerlukan("cepat");
konstan aplikasi = ekspres();
konstan port = proses.env. PELABUHAN || 3000

app.listen (port, () => {
menghibur.catatan(`Aplikasi berjalan di port ${pelabuhan}`);
});

Kode ini diimpor cepat dan membuat aplikasi Express dengan memanggil express() dan menyimpan nilai kembaliannya di aplikasi variabel. Kemudian mendengarkan lalu lintas di port 3000 dengan memanggil mendengarkan metode pada aplikasi obyek.

Langkah 3: Membuat Route Handler

Selanjutnya, buat beberapa pengendali rute tempat Anda dapat menerapkan solusi pembatasan kecepatan.

Pertama, buat folder, rute, di direktori root proyek Anda dengan menjalankan:

rute mkdir

Buat berkas, route.js, di dalam folder rute Anda dan tambahkan kode berikut:

konstan ekspres = memerlukan("cepat");
konstan router = ekspres. Router();

router.get("/", (permintaan, res) => {
res.send({ pesan: "Halo, ini adalah permintaan GET" });
});

router.post("/add-demo", (permintaan, res) => {
res.status (201).send({ pesan: "Sumber daya berhasil dibuat" });
});

router.put("/update-demo", (permintaan, res) => {
res.status (201).send({ pesan: "Sumber daya berhasil diperbarui" });
});

modul.ekspor = ruter;

Kode ini diimpor cepat, memanggil Router metode aktif cepat, dan menyimpan nilai dalam variabel, router. Itu Router metode ini memungkinkan Anda membuat penangan rute modular yang dapat dipasang. Anda dapat membuat penangan rute untuk a DAPATKAN permintaan untuk “/", sebuah POS permintaan untuk “/add-demo”, dan TARUH permintaan untuk “/update-demo”. Terakhir, ekspor router variabel.

Selanjutnya, impor router variabel di Anda index.js mengajukan:

// indeks.js
konstan rute = memerlukan("./rute/rute");

Kemudian, gunakan sebagai middleware di file index.js Anda:

// indeks.js
aplikasi.menggunakan(rute);

Pastikan untuk menempatkan blok kode di atas sebelum app.listen panggilan.

Langkah 4: Menerapkan Pembatasan Tarif

Pertama, buat "perangkat tengah” di direktori root proyek Anda dengan menjalankan:

mkdir middleware

Kemudian buat file bernama “rate-limiter.js” di dalam direktori middleware. Tambahkan kode berikut ke file ini:

// rate-limiter.js
konstan rateLimiter = memerlukan("batas-tarif-ekspres");

konstan pembatas = rateLimiter({
maks: 5,
jendelaMS: 10000, // 10 detik
pesan: "Kamu bisa't membuat permintaan lagi saat ini. Coba lagi nanti",
});

modul.ekspor = pembatas

Itu rateLimiter fungsi mengambil objek konfigurasi dengan kondisi untuk membatasi jumlah permintaan.

Properti pada objek konfigurasi di atas adalah:

  • maksimal: Properti ini harus selalu a nomor atau fungsi yang mengembalikan angka. Ini mewakili jumlah maksimum permintaan yang dapat dibuat pengguna dalam jangka waktu tertentu. Jika properti ini tidak disetel dalam objek konfigurasi, defaultnya adalah 5.
  • windowsMS: Properti ini harus selalu berupa angka. Ini mewakili jangka waktu di mana beberapa permintaan diizinkan masuk milidetik. Jika properti ini tidak diatur dalam objek konfigurasi, defaultnya adalah 60000 milidetik (satu menit).
  • pesan: Properti ini dapat berupa rangkaian, objek JSON, atau nilai lain apa pun yang didukung oleh Tanggapan ekspres. kirim metode. Jika properti ini tidak disetel di objek konfigurasi, defaultnya adalah “Terlalu banyak permintaan. Silakan coba lagi nanti.”

Fungsi tersebut kemudian akan memeriksa permintaan berulang ke aplikasi Anda. Jika pengguna melebihi batas (maksimal, 5) dalam jangka waktu (jendelaMS, 10s), itu akan memblokir permintaan. Itu juga akan memunculkan kesalahan "Terlalu Banyak Permintaan" dengan kode status 429.

Terakhir, impor fungsi pembatas di. Anda index.js file dan menerapkannya sebagai middleware global dalam aplikasi Anda. Lakukan ini dengan menempatkan app.use (pembatas) di atas middleware rute. Ini menerapkan solusi pembatasan tarif untuk semua rute aplikasi Anda.

aplikasi.menggunakan(pembatas);

Pembatasan Tarif Rute Tertentu

Anda juga dapat menerapkan pembatasan tarif untuk rute tertentu. Anda dapat mengonfigurasinya secara terpisah untuk menolak permintaan yang dibuat dalam jangka waktu yang berbeda, menampilkan pesan yang berbeda, dll.

Misalnya, anggap Anda menerapkan rute masuk pengguna di aplikasi Anda. Anda mungkin perlu menambahkan konfigurasi pembatasan kecepatan untuk rute masuk yang berbeda dari konfigurasi yang digunakan oleh rute lain.

Pertama, Anda harus menghapus pembatas sebagai middleware tingkat aplikasi dan menerapkannya karena tidak ada sistem filter middleware bawaan di ExpressJS. Jadi, bahkan jika Anda menambahkan solusi pembatasan kecepatan tertentu ke suatu rute, middleware global akan tetap berjalan pada rute tersebut.

Selanjutnya, buat konfigurasi pembatas tarif baru di rate-limiter.js file dan mengekspornya.

konstan signInLimiter = rateLimiter({
maks: 3,
jendelaMS: 10000, //10 detik
pesan: "Terlalu banyak upaya masuk. Coba lagi nanti."
})

modul.ekspor = {
pembatas,
signInLimiter
}

Itu signInLimiter objek konfigurasi memiliki jumlah yang berbeda maksimal permintaan dan pesan kesalahan yang berbeda dari pembatas kecepatan umum.

Terakhir, perbarui router.js file dengan blok kode di bawah ini:

// router.js
konstan ekspres = memerlukan("cepat");
konstan router = ekspres. Router();
konstan {limiter, signInLimiter} = memerlukan("../middleware/rate-limiter")

router.get("/sign-in", signInLimiter, (permintaan, res, selanjutnya) => {
res.send({ pesan: "Halo, ini adalah permintaan GET" });
});

router.menggunakan(pembatas)

router.post("/post", (permintaan, res) => {
res.status (201).send({ pesan: "Sumber daya berhasil dibuat" });
});

router.put("/put", (permintaan, res) => {
res.status (201).send({ pesan: "Sumber daya berhasil diperbarui" });
});

modul.ekspor = ruter;

Di blok kode di atas, Anda mengimpor pembatas dan signInLimiter. Kemudian Anda melamar signInLimiter sebagai pembatas laju khusus untuk "/sign-in” rute.

Akhirnya, dengan menempatkan router.use (pembatas) di atas rute lainnya, Anda menerapkan pembatas sebagai pembatas kecepatan untuk rute lainnya.

Pentingnya Pembatasan Tarif

Pembatasan tingkat mengurangi ketegangan pada server web Anda dengan menghindari keharusan memproses terlalu banyak permintaan sekaligus. Ini menurunkan aktivitas bot, melindungi Anda dari serangan Denial of Service (DoS), dan mencegah serangan brute force.