Credential stuffing menargetkan API login dengan mengirimkan ribuan kombinasi kredensial yang bocor. Untuk mencegah serangan ini, penerapan lapisan perlindungan beruntun—validasi input, kendali laju permintaan, dan rotasi secret—harus menjadi bagian dari pipeline autentikasi API Anda.
Dalam artikel ini, kita langsung membahas teknik teknis yang bisa diimplementasikan tanpa asumsi lingkungan tertentu, sehingga tim backend dan keamanan dapat menanggulangi serangan secara sistematis.
1. Validasi Login yang Ketat
Validasi input di endpoint login adalah garis pertama pertahanan. Tujuannya bukan hanya memfilter format yang salah, tetapi juga mengidentifikasi pola bot sebelum logika autentikasi dijalankan.
1.1. Validasi format dan panjang
Batasi panjang username/email dan password untuk menghindari payload oversize yang bisa memicu beban CPU tambahan. Contoh batas: email 5-254 karakter, password 8-64 karakter. Gunakan validasi sisi server untuk semua field, tidak cukup hanya client-side.
1.2. Deteksi bot dan tantangan tambahan
Setelah batas format, tambahkan pemeriksaan seperti:
- Frekuensi input: jika IP/akunnya melakukan lebih dari N percobaan per menit dengan status pending, tandai sebagai bot.
- Fingerprint device sederhana: kombinasi User-Agent, accept headers, dan kecepatan submit.
- Captcha/2FA adaptif: aktifkan hanya bila anomali terdeteksi, misal percobaan beruntun dari beberapa IP.
1.3. Middleware validasi (contoh Express/Node.js)
function validateLoginInput(req, res, next) {
const { identifier, password } = req.body;
if (!identifier || identifier.length < 5 || identifier.length > 254) {
return res.status(400).json({ error: 'Identifier tidak valid' });
}
if (!password || password.length < 8 || password.length > 64) {
return res.status(400).json({ error: 'Password tidak valid' });
}
if (req.headers['x-suspicious']) {
return res.status(429).json({ error: 'Terlalu banyak percobaan. Coba lagi nanti.' });
}
next();
}Middleware seperti di atas bisa digabung dengan fitur fingerprinting untuk menandai bot dan menolak permintaan lebih awal.
2. Rate Limit dan Kontrol Session
Rate limit harus diterapkan di beberapa lapisan—gateway API, layanan aplikasi, atau CDN. Tujuannya membatasi serangan yang tak dikenali berdasarkan metrik IP, akun, atau device.
2.1. Rate limit berbasis identitas
Rate limit terbaik tidak hanya berdasarkan IP. Kombinasikan:
- IP: banyak serangan menggunakan proxy, jadi tetap penting.
- Identifier: jika backend melihat akun direquest lebih dari N kali dalam 60 detik, beri delay.
- Device fingerprint: membuat key unik dari header, cookies, dan metadata lain.
Gunakan token bucket atau sliding window di cache seperti Redis. Contoh konfigurasi express-rate-limit:
const rateLimit = require('express-rate-limit');
const loginLimiter = rateLimit({
windowMs: 60 * 1000,
max: 5,
keyGenerator: (req) => req.body.identifier || req.ip,
handler: (req, res) => res.status(429).json({ error: 'Coba lagi nanti' })
});
app.post('/api/login', loginLimiter, validateLoginInput, loginHandler);Perhatikan: max 5 hanya contoh. Sesuaikan dengan pola penggunaan nyata dan tambahkan backoff eksponensial untuk klien yang sama.
2.2. Kontrol sesi dan pemblokiran agresif
Setelah login gagal berulang, tandai sesi/IP dalam blokir sementara. Simpan entry di Redis dengan TTL singkat (misal 5 menit). Jika heuristik mendeteksi IP/agent terus mencoba, blokir selama interval lebih lama.
Catat metadata seperti device fingerprint dan geolokasi agar tim keamanan bisa menginvestigasi. Jika suatu device dianggap malicious, nonaktifkan token refresh dan minta autentikasi ulang penuh.
3. Rotasi Secret dan Autentikasi Ulang
Credential stuffing bisa memanfaatkan API key/client secret yang bocor. Rencanakan rotasi secret secara berkala dan mendukung otomatisasi invalidasi ketika terdeteksi anomali.
3.1. Rotasi dan versi secret
Gunakan pendekatan versioning:
- Simpan secret aktif dan fallback di server.
- Ketika rotasi terjadi, broadcast notifikasi ke service dependent.
- API gateway mengizinkan request jika secret match dengan version terbaru.
Otomasi rotasi dengan pipeline CI yang memicu update secret vault dan memvalidasi sesi yang sudah ada.
3.2. Autentikasi ulang setelah deteksi anomali
Jika sistem mendeteksi login dari secret yang di-rotate atau percobaan yang mencurigakan, beri tahu client untuk memaksa sign-out dan meminta autentikasi ulang (reauth). Contohnya, return HTTP 401 dengan header khusus yang mengindikasikan reauth diperlukan.
4. Monitoring dan Respon Keamanan
Mendeteksi serangan credential stuffing membutuhkan observability tingkat lanjut.
4.1. Metrics untuk didorong ke dashboard
- Jumlah login gagal per identifier/IP per menit.
- Rate limit hits di sisi gateway.
- Frekuensi trigger robot detection.
Gunakan histogram untuk tenggat waktu dan threshold alert ketika error spike abnormal.
4.2. Alert dan playbook respon
Konfigurasikan alert ketika rate limit blokir melonjak 3x rata-rata. Sertakan automasi:
- Tambah rule firewall untuk memblokir IP yang tercatat.
- Kirim notifikasi ke tim SOC dengan rincian device fingerprint.
- Sesi berisiko di-mark untuk invalidasi otomatis.
Transparansi seperti ini memudahkan debugging perbedaan apakah kena rate limit biasa atau serangan.
Ringkasan dan Tips Debugging
Pelaksanaan bertahap: mulai dari validasi input ketat, lalu rate limit multi-lapisan, kemudian rotasi credential dan monitoring aktif. Jangan lupa mencatat log yang cukup untuk menelusuri percobaan, tapi hindari logging password.
Jika mengalami false positive, evaluasi algoritma fingerprinting dan angka limit. Catat masing-masing perubahan agar auditor bisa meninjau respons keamanan.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!