# Optimasi Performa Regex untuk Routing WAF Berkecepatan Tinggi

> Diterbitkan oleh Literally Web ID pada 21 Oct 2026
> Sumber: https://literally.web.id/articles/optimasi-performa-regex-untuk-routing-waf-berkecepatan-tinggi

---

Dalam 15 menit ke depan, kita akan merakit sebuah sistem pertahanan Web Application Firewall (WAF) berkecepatan tinggi yang kebal terhadap serangan Regular Expression Denial of Service (ReDoS). Pengalaman mengajarkan saya di lapangan bahwa sebuah regex yang terlihat sepele untuk menyaring payload XSS atau SQL Injection bisa melumpuhkan seluruh cluster Nginx hanya karena lonjakan *backtracking* yang tak terkendali. Mari kita bedah bagaimana cara menjinakkan mesin regex ini dari nol sampai benar-benar siap tempur di environment production.

## 1. Menu Kita Hari Ini & Alat yang Perlu Disiapkan

Bayangkan kita sedang berada di dapur produksi sistem dengan beban 50.000 req/sec. Bahan utama kita hari ini adalah Nginx dengan modul Lua (OpenResty) untuk eksekusi logika WAF yang asinkron, PCRE2 (Perl Compatible Regular Expressions versi 2) yang dikenal jauh lebih efisien dalam hal manajemen memori dibanding versi pendahulunya, serta tool benchmarking seperti `wrk` untuk menguji ketahanan server kita terhadap pola string jahat. Pastikan Anda sudah menyiapkan terminal Linux berbasis Debian/Ubuntu atau container Docker dengan resource minimal 2 vCPU dan 4GB RAM agar kita bisa melihat langsung bagaimana CPU melompat saat regex buruk dieksekusi.

> [!IMPORTANT]
> Jangan pernah menggunakan mesin production untuk eksperimen regex pertama Anda. Gunakan staging environment yang terisolasi karena ReDoS dapat menghabiskan 100% kapasitas CPU core dalam hitungan detik.

## 2. Peta Jalan Singkat: Apa yang Sedang Kita Rakit

Sebelum tangan kita kotor mengetik konfigurasi, mari kita lihat alur kerja yang akan kita bangun. Pertama, kita akan membedah **Anatomi ReDoS di Production** untuk memahami bagaimana pola `(a+)+$` bisa membuat engine regex tersesat dalam labirin *backtracking*. Kedua, kita masuk ke **Teknik Backtracking Optimization** di mana kita mengubah pola serakah (*greedy*) menjadi posesif atau menggunakan *atomic grouping*. Terakhir, kita akan melakukan **Benchmarking Regex di Nginx & OpenResty** untuk membuktikan secara empiris bahwa modifikasi kecil pada ekspresi kita mendongkrak throughput secara drastis, yang akan mengantarkan kita secara mulus ke implementasi teknis berikutnya.

## 3. Langkah 1: Mempersiapkan Fondasi & Environment

Mari kita mulai dengan menginstal OpenResty dan pustaka PCRE2 terbaru di server kita. Buka terminal Anda dan jalankan perintah di bawah ini untuk menyiapkan dependensi dasarnya:

```bash
# Update repository dan install dependensi esensial untuk OpenResty dan PCRE2
sudo apt-get update
sudo apt-get install -y wget gnupg software-properties-common libpcre2-dev build-zlib build-essential

# Tambahkan GPG key resmi OpenResty
wget -O - https://openresty.org/package/pubkey.gpg | sudo apt-key add -

# Tambahkan repository OpenResty ke apt sources
echo "deb http://openresty.org/package/ubuntu $(lsb_release -sc) openresty" \
    | sudo tee /etc/apt/sources.list.d/openresty.list

# Install openresty dan piranti pendukungnya
sudo apt-get update
sudo apt-get install -y openresty
```

Perhatikan respons log di layar terminal Anda. Jika instalasi berjalan mulus tanpa error dependensi, itu adalah tanda pertama bahwa pondasi infrastruktur kita sudah siap menerima racikan aturan keamanan selanjutnya.

## 4. Langkah 2: Meracik Konfigurasi Inti Tanpa Basa-basi

Sekarang kita masuk ke jantung masalah: menulis aturan WAF berbasis Lua dan Nginx yang aman dari ReDoS. Buka file konfigurasi Nginx Anda, biasanya berada di `/usr/local/openresty/nginx/conf/nginx.conf`. Kita akan menyisipkan blok `access_by_lua_block` yang memvalidasi parameter URL terhadap regex yang sudah dioptimalkan.

```nginx
http {
    lua_shared_dict waf_cache 10m;
    
    server {
        listen 80;
        server_name api.domain-anda.com;

        location / {
            access_by_lua_block {
                local uri = ngx.var.uri
                local args = ngx.req.get_uri_args()
                
                -- Pola buruk (ReDoS Vulnerable): (a+)+
                -- Pola aman (Optimized): Menggunakan atomic grouping atau batas karakter ketat
                local safe_pattern = [[([\w-]+)(?:\s*=\s*[^;]+)]]
                
                for key, val in pairs(args) do
                    if type(val) == "string" then
                        -- Batasi panjang input untuk mencegah eksekusi regex yang terlalu panjang
                        if string.len(val) > 256 then
                            ngx.log(ngx.WARN, "Payload terlalu panjang, potensi DoS ditolak: ", key)
                            ngx.exit(ngx.HTTP_FORBIDDEN)
                        end
                        
                        -- Eksekusi regex dengan pengaman waktu (PCRE2 JIT)
                        local matched, err = ngx.re.match(val, safe_pattern, "jo")
                        if matched then
                            ngx.log(ngx.ERR, "Potensi Attack terdeteksi pada key: ", key)
                            ngx.exit(ngx.HTTP_FORBIDDEN)
                        end
                    end
                end
            }
            
            proxy_pass http://backend_upstream;
        }
    }
}
```

> [!TIP]
> Penggunaan flag `"jo"` pada `ngx.re.match` sangat krusial. Huruf `j` mengaktifkan JIT (Just-In-Time) compilation untuk regex, sedangkan `o` melakukan optimasi kompilasi satu kali saat Nginx melakukan *reload*, menghemat siklus CPU secara masif.

## 5. Langkah 3: Sentuhan Akhir Keamanan & Optimasi

Untuk memastikan engine kita tidak mudah tumbang, kita perlu menambahkan lapisan proteksi tambahan berupa pembatasan laju (*rate limiting*) dan validasi panjang header. Tambahkan konfigurasi limit req di bagian `http` pada file `nginx.conf` yang sama:

```nginx
http {
    # Definisikan zone rate limiting berdasarkan IP klien
    limit_req_zone $binary_remote_addr zone=waf_limit:10m rate=50r/s;

    server {
        listen 80;
        server_name api.domain-anda.com;

        location / {
            limit_req zone=waf_limit burst=20 nodelay;
            
            # Pastikan header Content-Type tervalidasi dengan ketat
            if ($content_type !~* "application/json|application/x-www-form-urlencoded") {
                return 403;
            }
            
            try_files $uri @proxy;
        }

        location @proxy {
            proxy_pass http://127.0.0.1:8080;
        }
    }
}
```

Simpan file konfigurasi tersebut, lalu uji integritas sintaksnya dengan perintah `sudo openresty -t`. Jika muncul pesan *syntax is ok* dan *test is successful*, Anda bisa langsung melakukan reload service dengan `sudo systemctl reload openresty`.

## 6. Tes Rasa: Memastikan Semuanya Berjalan Sempurna

Saatnya kita menguji hasil racikan kita di lapangan menggunakan `wrk`. Kita akan menembakkan *load testing* ke endpoint kita dengan menyertakan string payload normal maupun string yang mencoba memicu *backtracking*.

```bash
# Jalankan benchmark dengan 10 concurrent connections selama 30 detik
wrk -t2 -c10 -d30s --latency "http://api.domain-anda.com/?search=normal_query_string"
```

Perhatikan metrik *Latency Distribution* dan *Requests/sec* pada terminal Anda. Dengan regex yang sudah di-JIT dan dioptimalkan tanpa *nested quantifiers*, Anda akan melihat latensi rata-rata berada di bawah 2 milidetik dengan penggunaan CPU yang tetap landai di bawah 15% bahkan di bawah tekanan beban tinggi.

## 7. Pertolongan Pertama: Jika Terjadi Kendala Kecil

Jika Anda mendapati error seperti `pcre compile failed: regular expression is too complicated`, itu tandanya ekspresi reguler Anda masih mengandung struktur bersarang yang ambigu. Solusinya, pecah regex tersebut menjadi beberapa kondisi pengecekan `if` terpisah di dalam blok Lua alih-alih menggabungkannya dalam satu baris ekspresi yang panjang. Jika Nginx gagal melakukan reload, cek log error di `/usr/local/openresty/nginx/logs/error.log` untuk melihat baris konfigurasi mana yang menyumbang masalah, perbaiki, dan *reload* kembali infrastruktur WAF Anda dengan tenang.