L
REST API Design • Literally Web ID

Desain RESTful API Skalabel dengan Autentikasi JWT dan Rate Limiting Lanjutan

⏱️ 18 menit baca • 📅 15 Oct 2026 • 👁️ 1 views
Desain RESTful API Skalabel dengan Autentikasi JWT dan Rate Limiting Lanjutan

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap pengembangan aplikasi web modern berbasis arsitektur terdistribusi, pembuatan RESTful API yang aman, berkinerja tinggi, dan tahan banting adalah fondasi utama yang menentukan skalabilitas sistem secara keseluruhan. Di satu sisi, pemisahan antara frontend (seperti Single Page Application berbasis React, Vue, atau mobile app) dan backend (Node.js, Go, PHP/Laravel) menuntut mekanisme autentikasi yang ringan, stateless, dan dapat diverifikasi secara instan tanpa membebani database sentral. Di sisi lain, paparan API ke publik menjadikannya rentan terhadap berbagai vektor serangan siber, mulai dari brute-force attack pada endpoint login, pemanfaatan token yang dicuri, hingga Denial of Service (DoS) terdistribusi yang dapat melumpuhkan infrastruktur.

Secara historis, banyak arsitek sistem mengandalkan manajemen sesi berbasis stateful (session cookies/database session store) yang membutuhkan lookup basis data atau cache (seperti Redis) pada setiap permintaan masuk (request). Pendekatan ini menciptakan hambatan performa (performance bottleneck) ketika traffic melonjak hingga puluhan ribu request per detik (RPS). JSON Web Token (JWT) hadir sebagai solusi elegan karena sifatnya yang self-contained: seluruh informasi identitas pengguna dan hak akses terenkapsulasi di dalam token yang ditandatangani secara kriptografis (digitally signed), memungkinkan verifikasi instan oleh API Gateway atau backend service tanpa harus menyentuh database.

Namun, implementasi JWT yang naif sering kali mengabaikan siklus hidup token yang aman. Tanpa manajemen Refresh Token yang ketat, pencabutan hak akses (token revocation) menjadi mustahil dilakukan sebelum token kedaluwarsa, membuka celah keamanan yang lebar jika sebuah token jatuh ke tangan penyerang. Lebih jauh lagi, tanpa mekanisme Rate Limiting yang presisi menggunakan algoritma tingkat lanjut seperti Token Bucket, infrastruktur server web (Nginx, Reverse Proxy) dan database backend akan rentan terhadap kehabisan sumber daya (resource exhaustion) akibat lonjakan permintaan yang tidak terkendali.

[!WARNING] Mengandalkan JWT tanpa mekanisme token blacklisting atau refresh token rotation di lingkungan produksi adalah bom waktu keamanan. Begitu token dicuri, penyerang memiliki akses penuh hingga masa berlaku token habis.

Perbandingan Kondisi: Sebelum vs Sesudah Penerapan

Parameter Sebelum (Implementasi Standar / Naif) Sesudah (Arsitektur Skalabel & Aman)
Verifikasi Autentikasi Query database/Redis pada setiap request API. Verifikasi kriptografi publik/privat key secara stateless di memori.
Manajemen Token Menggunakan Access Token berumur panjang tanpa mekanisme penyegaran (refresh). Short-lived Access Token (15 menit) + Long-lived Refresh Token dengan rotasi otomatis.
Perlindungan Traffic Menggunakan limitasi statis berbasis IP sederhana (IP-based limiting). Algoritma Token Bucket berbasis Redis dengan sliding window dan identifikasi per User ID.
Ketahanan Infrastruktur Rentan terhadap DDoS, Credential Stuffing, dan lonjakan beban database. Isolasi beban kerja, proteksi WAF, dan pembatasan laju (rate limiting) di level Edge/Nginx.

2. Konsep Inti & Deep Dive Arsitektur

Untuk merancang sistem RESTful API yang memenuhi standar enterprise, kita harus memahami aliran data (data flow) secara mendalam mulai dari titik masuk klien hingga eksekusi di lapisan database.

Alur Eksekusi Sistem & Autentikasi JWT

+--------+       1. POST /login (Credentials)      +---------+       Cek DB      +----------+
| Client | -------------------------------------> | Backend | ----------------> | Database |
|        | <------------------------------------- | Service | <---------------- |          +
+--------+        2. Return Access & Refresh      +---------+                   +----------+
    |                                                  ^
    | 3. API Request + Bearer Token                    |
    v                                                  |
+------------------------------------------------------+--------------------+
| Nginx Reverse Proxy / API Gateway                                          |
| - SSL/TLS Termination                                                      |
| - Rate Limiting Check (Token Bucket Algorithm via Redis)                   |
+----------------------------------------------------------------------------+
    | (Jika lolos rate limit)
    v
+----------------------------------------------------------------------------+
    | Backend Application (Go / Node.js / PHP)
    | - JWT Signature Verification (RS256 / EdDSA)
    | - Payload Validation & Sanitization
    | - Business Logic Execution
+----------------------------------------------------------------------------+

Algoritma Token Bucket untuk Rate Limiting

Algoritma Token Bucket adalah salah satu pendekatan paling efisien dan populer untuk membatasi laju permintaan. Bayangkan sebuah ember yang menampung token. Ember ini memiliki kapasitas maksimum tertentu. Token ditambahkan ke dalam ember pada tingkat konstan (fill rate). Setiap kali klien membuat permintaan request API, satu token diambil dari ember. Jika ember kosong, permintaan ditolak dengan kode status HTTP 429 Too Many Requests.

Berbeda dengan Fixed Window Counter yang mengalami masalah lonjakan (burst) di batas pergantian waktu, atau Leaky Bucket yang memaksa aliran keluar menjadi kaku, Token Bucket memungkinkan fleksibilitas lonjakan (burstability) yang wajar sambil tetap menjaga batas rata-rata penggunaan dalam jangka panjang.

Siklus Hidup Refresh Token & JWT

  1. Autentikasi Awal: Klien mengirim kredensial (username/password) ke /api/v1/auth/login.
  2. Penerbitan Token: Backend memverifikasi kredensial, lalu menerbitkan:
    • Access Token: Berumur sangat pendek (misal: 15 menit), ditandatangani dengan algoritma asimetris (RS256), berisi klaim (claims) identitas pengguna dan peran (roles).
    • Refresh Token: Berumur panjang (misal: 7 hari), disimpan secara aman (HttpOnly, Secure Cookie, atau database terenkripsi), digunakan khusus untuk meminta Access Token baru.
  3. Rotasi Refresh Token: Setiap kali klien menggunakan Refresh Token untuk mendapatkan Access Token baru, server membatalkan Refresh Token lama dan menerbitkan pasangan Refresh Token yang baru. Jika Refresh Token yang sama digunakan dua kali (indikasi pencurian token), sistem akan segera mencabut seluruh sesi pengguna tersebut.

3. Perbandingan Komparatif / Analisis Pendekatan

Dalam membangun sistem autentikasi dan rate limiting, arsitek sering dihadapkan pada beberapa pilihan teknologi dan pendekatan. Tabel berikut menyajikan analisis komparatif untuk membantu pengambilan keputusan berbasis arsitektur.

Pendekatan / Teknologi Kelebihan Kekurangan Konsumsi Sumber Daya Skenario Penggunaan Ideal
JWT (Stateless) vs Session Cookie (Stateful) Skalabel secara horizontal tanpa state server; cepat diverifikasi. Sulit dicabut sebelum kedaluwarsa; ukuran payload lebih besar. CPU rendah, RAM rendah (tanpa state server). Mobile App, SPA modern, arsitektur Microservices.
Algoritma Token Bucket vs Fixed Window Mendukung burst traffic; akurat; memori efisien jika di-handle Redis. Sedikit lebih kompleks dalam implementasi skrip Lua. RAM Redis sangat rendah, CPU minimal. Publik API, sistem e-commerce dengan flash sale.
Algoritma HMAC (HS256) vs Asimetris (RS256) Cepat; implementasi sederhana. Membagikan secret key yang sama ke banyak microservice (risiko keamanan). CPU sangat rendah. Monolitik backend atau internal microservice tertutup.
Algoritma RS256 / EdDSA (Asimetris) Verifikasi aman menggunakan Public Key; Private Key hanya diauth service. Proses enkripsi/dekripsi sedikit lebih lambat dibanding HS256. CPU moderat saat penandatanganan token. Sistem terdistribusi publik, Multi-tenant API Gateway.

4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum masuk ke tahap implementasi teknis, pastikan infrastruktur dan lingkungan pengembangan Anda memenuhi spesifikasi minimum berikut:

  • OS: Ubuntu Server 22.04 LTS / Debian 12 / AlmaLinux 9
  • Web Server / Reverse Proxy: Nginx (versinya >= 1.22)
  • In-Memory Datastore: Redis (versinya >= 7.0, mendukung Lua scripting untuk atomic rate limiting)
  • Runtime Backend: Go (Golang >= 1.21) atau Node.js (>= 20.x LTS) atau PHP (>= 8.2 dengan ekstensi Sodium & Redis)
  • SSL/TLS: Sertifikat valid dari Let's Encrypt (Certbot)

Instalasi Dependensi Dasar (Ubuntu Server)

Jalankan perintah berikut di terminal untuk menyiapkan lingkungan dasar:

# Update sistem dan instal dependensi esensial
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git ufw fail2ban nginx redis-server certbot python3-certbot-nginx

# Memastikan layanan Redis aktif dan berjalan
sudo systemctl enable --now redis-server
sudo systemctl enable --now nginx

5. Panduan Implementasi Langkah demi Langkah

Berikut adalah implementasi nyata dari arsitektur RESTful API yang mencakup:

  1. Konfigurasi Nginx sebagai Reverse Proxy.
  2. Implementasi Token Bucket Rate Limiting menggunakan Redis Lua Script.
  3. Implementasi Backend (menggunakan Go sebagai contoh performa tinggi) untuk validasi JWT dan sanitasi input.

Langkah 1: Konfigurasi Nginx Reverse Proxy & Security Headers

Buat file konfigurasi virtual host Nginx di /etc/nginx/sites-available/api.enterprise.com:

# Konfigurasi upstream ke backend aplikasi Go/Node
upstream api_backend {
    server 127.0.0.1:8080;
    keepalive 32;
}

server {
    listen 80;
    server_name api.enterprise.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name api.enterprise.com;

    # Konfigurasi SSL/TLS Modern (Let's Encrypt)
    ssl_certificate /etc/letsencrypt/live/api.enterprise.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.enterprise.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # Security Headers
    add_header X-Frame-Options "DENY" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Content-Security-Policy "default-src 'self'" always;
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

    # Log akses dan error
    access_log /var/log/nginx/api_access.log;
    error_log /var/log/nginx/api_error.log warn;

    client_max_body_size 5M;

    location / {
        proxy_pass http://api_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Timeouts
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

Langkah 2: Backend Golang - Token Bucket Rate Limiting & JWT Auth

Buat struktur proyek Go baru, lalu tulis kode inti pada file main.go:

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"strings"
	"time"

	"github.com/golang-jwt/jwt/v5"
	"github.com/redis/go-redis/v9"
)

var (
	ctx         = context.Background()
	redisClient *redis.Client
	jwtSecret   = []byte("super-secret-enterprise-key-change-in-production-2024!")
)

// Struktur Payload Response
type Response struct {
	Status  string      `json:"status"`
	Message string      `json:"message,omitempty"`
	Data    interface{} `json:"data,omitempty"`
}

// Skrip Lua untuk Algoritma Token Bucket Atomic di Redis
const tokenBucketScript = `
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local capacity = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local fill_time = tonumber(ARGV[4])

local current = redis.call('hmget', key, 'tokens', 'last_updated')
local tokens = tonumber(current[1])
local last_updated = tonumber(current[2])

if tokens == nil then
    tokens = capacity
    last_updated = now
else
    local delta = math.max(0, now - last_updated)
    local tokens_to_add = delta * (limit / fill_time)
    tokens = math.min(capacity, tokens + tokens_to_add)
    last_updated = now
end

if tokens < 1 then
    return 0
else
    tokens = tokens - 1
    redis.call('hmset', key, 'tokens', tokens, 'last_updated', last_updated)
    redis.call('expire', key, math.ceil(fill_time))
    return 1
end
`

func initRedis() {
	redisClient = redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "",
		DB:       0,
	})

	if err := redisClient.Ping(ctx).Err(); err != nil {
		log.Fatalf("Gagal terhubung ke Redis: %v", err)
	}
}

// Middleware Rate Limiting menggunakan Token Bucket
func RateLimitMiddleware(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		clientIP := r.Header.Get("X-Real-IP")
		if clientIP == "" {
			clientIP = r.RemoteAddr
		}

		limiterKey := fmt.Sprintf("rate_limit:%s", clientIP)
		capacity := 10.0 // Kapasitas maksimal bucket
		limit := 10.0    // Jumlah token yang diregenerasi per periode
		fillTime := 1.0  // Periode dalam detik
		now := float64(time.Now().UnixNano()) / 1e9

		res, err := redisClient.Eval(ctx, tokenBucketScript, []string{limiterKey}, limit, capacity, now, fillTime).Result()
		if err != nil {
			http.Error(w, "Internal Server Error", http.StatusInternalServerError)
			return
		}

		if res.Int64() == 0 {
			w.Header().Set("Content-Type", "application/json")
			w.WriteHeader(http.StatusTooManyRequests)
			json.NewEncoder(w).Encode(Response{
				Status:  "error",
				Message: "Rate limit terlampaui. Harap coba lagi nanti.",
			})
			return
		}

		next.ServeHTTP(w, r)
	}
}

// Middleware Autentikasi JWT
func JWTMiddleware(next http.HandlerFunc) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		authHeader := r.Header.Get("Authorization")
		parsAuth := strings.Split(authHeader, " ")

		if len(parsAuth) != 2 || parsAuth[0] != "Bearer" {
			w.Header().Set("Content-Type", "application/json")
			w.WriteHeader(http.StatusUnauthorized)
			json.NewEncoder(w).Encode(Response{Status: "error", Message: "Token tidak valid atau tidak disertakan"})
			return
		}

		tokenStr := parsAuth[1]
		token, err := jwt.Parse(tokenStr, func(token *jwt.Token) (interface{}, error) {
			if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
				return nil, fmt.Errorf("metode signing tidak terduga: %v", token.Header["alg"])
			}
			return jwtSecret, nil
		})

		if err != nil || !token.Valid {
			w.Header().Set("Content-Type", "application/json")
			w.WriteHeader(http.StatusUnauthorized)
			json.NewEncoder(w).Encode(Response{Status: "error", Message: "Token Kedaluwarsa atau Tidak Sah"})
			return
		}

		next.ServeHTTP(w, r)
	}
}

// Handler Endpoint Login (Menerbitkan JWT)
func LoginHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method != http.MethodPost {
		http.Error(w, "Metode tidak diizinkan", http.StatusMethodNotAllowed)
		return
		}

		var credentials struct {
			Username string `json:"username"`
			Password string `json:"password"`
		}

		if err := json.NewDecoder(r.Body).Decode(&credentials); err != nil {
			http.Error(w, "Payload JSON tidak valid", http.StatusBadRequest)
			return
		}

		// Validasi input ketat (Contoh sederhana)
		if credentials.Username != "admin" || credentials.Password != "SecurePass123!" {
			w.Header().Set("Content-Type", "application/json")
			w.WriteHeader(http.StatusUnauthorized)
			json.NewEncoder(w).Encode(Response{Status: "error", Message: "Kredensial salah"})
			return
		}

		// Buat JWT Claims
		claims := jwt.MapClaims{
			"authorized": true,
			"username":   credentials.Username,
			"exp":        time.Now().Add(time.Minute * 15).Unix(), // Access token 15 menit
		}

		token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
		tokenString, err := token.SignedString(jwtSecret)
		if err != nil {
			http.Error(w, "Gagal menghasilkan token", http.StatusInternalServerError)
			return
		}

		w.Header().Set("Content-Type", "application/json")
		json.NewEncoder(w).Encode(Response{
			Status: "success",
			Data:   map[string]string{"access_token": tokenString},
		})
}

// Handler Protected Resource
func ProtectedDataHandler(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(Response{
		Status:  "success",
		Message: "Akses diizinkan ke sumber daya terlindungi",
		Data:    map[string]string{"server_time": time.Now().String()},
	})
}

func main() {
	initRedis()

	http.HandleFunc("/api/v1/login", RateLimitMiddleware(LoginHandler))
	http.HandleFunc(",/api/v1/resource", RateLimitMiddleware(JWTMiddleware(ProtectedDataHandler)))

	log.Println("Server berjalan di port 8080...")
	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Fatal(err)
	}
}

6. Bedah Kode & Penjelasan Detail Baris Kunci

Mari kita bedah beberapa komponen paling krusial dari skrip Lua dan arsitektur kode di atas:

  1. Atomic Redis Lua Scripting (tokenBucketScript): Eksekusi skrip Lua di Redis bersifat atomik (atomic operation). Ini berarti operasi pembacaan (hmget), perhitungan matematika waktu nyata, dan pembaruan token (hmset) dilakukan dalam satu siklus tunggal tanpa interupsi dari thread lain. Hal ini mencegah race condition yang sering terjadi pada lingkungan konkurensi tinggi (high concurrency).

  2. Kalkulasi Delta Waktu (delta * (limit / fill_time)): Formula ini menghitung berapa banyak token baru yang harus dimasukkan ke dalam bucket berdasarkan selisih waktu (delta) antara request saat ini dan pembaruan terakhir. Pembatasan dengan math.min(capacity, ...) memastikan jumlah token tidak pernah melebihi kapasitas maksimum ember.

  3. Stateless JWT Verification (jwt.Parse): Backend tidak perlu melakukan query ke database untuk memvalidasi token. Validasi dilakukan murni melalui pencocokan tanda tangan kriptografi (cryptographic signature) menggunakan secret key di memori, menghasilkan latensi respons yang mendekati nol.


7. Skenario Produksi & Studi Kasus Dunia Nyata

Dalam studi kasus implementasi pada platform e-commerce berskala besar dengan event Flash Sale, lonjakan traffic dapat mencapai 50.000 RPS. Tanpa persiapan arsitektur yang tepat, server akan mengalami Cascading Failure.

Langkah Mitigasi Produksi:

  • Edge Rate Limiting: Terapkan aturan Rate Limiting pertama kali di level Cloudflare atau Nginx menggunakan modul ngx_http_limit_req_module untuk menyaring bot berbahaya sebelum mencapai aplikasi backend.
  • Redis Cluster: Gunakan Redis Sentinel atau Redis Cluster untuk menjaga ketersediaan tinggi (High Availability) data rate limiter. Jika satu node Redis gagal, sistem failover mengambil alih tanpa menghentikan layanan API.
  • Circuit Breaker: Integrasikan pola Circuit Breaker pada layanan backend mikroservis untuk mencegah penumpukan thread jika database utama mengalami kelambatan.

8. Common Pitfalls, Anti-Patterns & Solusi

  1. Anti-Pattern: Menyimpan Data Sensitif di Payload JWT

    • Masalah: JWT hanya dikodekan dengan Base64Url, bukan dienkripsi. Siapa pun yang memiliki token dapat membaca isinya menggunakan jwt.io.
    • Solusi: Jangan pernah menyimpan password, informasi kartu kredit, atau data PII (Personally Identifiable Information) di dalam klaim JWT. Simpan hanya ID pengguna dan peran (roles).
  2. Anti-Pattern: Mengabaikan Waktu Sinkronisasi Server (NTP)

    • Masalah: Perbedaan waktu antar server (clock drift) menyebabkan klaim exp (expiration) pada JWT menjadi tidak akurat, membuat token kedaluwarsa terlalu cepat atau tetap valid meskipun sudah waktunya habis.
    • Solusi: Selalu sinkronkan jam sistem menggunakan layanan NTP (Network Time Protocol) pada semua server node di kluster.
  3. Kesalahan Fatal Rate Limiting: Menggunakan IP Tampering

    • Masalah: Penyerang memalsukan header X-Forwarded-For untuk melewati pembatasan laju berbasis IP.
    • Solusi: Pastikan Nginx selalu menimpa atau menetapkan ulang header X-Real-IP dan X-Forwarded-For secara ketat dari proxy terpercaya, dan abaikan header yang dikirim langsung oleh klien luar.

9. Benchmark, Metrik Kinerja & Tuning Performa

Untuk memastikan API mampu menangani beban produksi, lakukan pengujian beban (load testing) menggunakan alat benchmark industri seperti k6 atau wrk.

Skrip Pengujian k6 (load-test.js)

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 100 }, // Ramp-up ke 100 VUs
    { duration: '1m', target: 500 },  // Beban puncak 500 VUs
    { duration: '30s', target: 0 },   // Ramp-down
  ],
};

export default function () {
  const url = 'https://api.enterprise.com/api/v1/login';
  const payload = JSON.stringify({
    username: 'admin',
    password: 'SecurePass123!',
  });

  const params = {
    headers: {
      'Content-Type': 'application/json',
    },
  };

  let res = http.post(url, payload, params);
  check(res, {
    'status adalah 200 atau 429': (r) => r.status === 200 || r.status === 429,
  });
  sleep(0.1);
}

Tuning Kernel Linux untuk High Concurrency (/etc/sysctl.conf)

# Tingkatkan batas file descriptor untuk menangani ribuan koneksi simultan
fs.file-max = 2097152

# Optimasi TCP backlog dan port range
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.ip_local_port_range = 1024 65535

# Mengaktifkan reuse koneksi TIME_WAIT
net.ipv4.tcp_tw_reuse = 1

Terapkan perubahan dengan menjalankan perintah sudo sysctl -p.


10. Checklist Penerapan Produksi & Kesimpulan

Sebelum meluncurkan arsitektur API ini ke lingkungan live/production, pastikan Anda memverifikasi seluruh item dalam checklist berikut:

  • Sertifikat SSL/TLS valid dan terkonfigurasi dengan cipher suites modern (TLSv1.2 & TLSv1.3).
  • Algoritma Token Bucket di Redis teruji terhadap konkurensi tinggi tanpa race condition.
  • JWT menggunakan tanda tangan asimetris (RS256) atau secret key yang sangat kuat (minimal 256-bit).
  • Mekanisme rotasi Refresh Token aktif dan terisolasi dengan penyimpanan HttpOnly Cookie.
  • Header keamanan HTTP (CSP, HSTS, X-Frame-Options) terpasang sempurna di Nginx.
  • Sinkronisasi waktu NTP aktif di seluruh kluster server.
  • Log akses dan error dimonitor secara real-time menggunakan sistem centralized logging (ELK / Grafana Loki).

Dengan menerapkan desain arsitektur yang komprehensif ini, API Anda tidak hanya akan memiliki performa tinggi dan skalabilitas tak terbatas, tetapi juga benteng pertahanan berlapis terhadap berbagai ancaman eksploitasi modern.

🏷️ Tags: #Nginx #Redis #Rate Limiting #Api Architecture #Jwt Authentication