Cara Mengamankan API Endpoint dengan Rate Limiting dan Autentikasi Token

Developer 20 Mei 2026 · OTPZap Team

Membangun API yang aman adalah fondasi dari setiap aplikasi modern. Tanpa proteksi yang memadai, endpoint API Anda rentan terhadap serangan brute-force, credential stuffing, dan penyalahgunaan resource. Dalam artikel ini, kita akan membahas tiga lapisan keamanan yang wajib diterapkan.

1. Rate Limiting - Batasi Jumlah Request

Rate limiting mencegah satu client mengirim terlalu banyak request dalam waktu singkat. Implementasi paling sederhana menggunakan sliding window counter:

// PHP: Simple rate limiter (300 req/menit per API key)
$window = date("Y-m-d H:i:00"); // round ke menit
$stmt = $pdo->prepare("INSERT INTO api_rate_limit (key_id, window_start, count)
    VALUES (?, ?, 1) ON DUPLICATE KEY UPDATE count = count + 1");
$stmt->execute([$key_id, $window]);

// Cek apakah melebihi limit
$count = $pdo->query("SELECT count FROM api_rate_limit WHERE ...")->fetchColumn();
if ($count > 300) {
    http_response_code(429);
    header("Retry-After: 60");
    exit(json_encode(["error" => "Rate limit exceeded"]));
}

Teknik ini digunakan oleh banyak platform termasuk OTPZap Public API yang menerapkan limit 300 request/menit per API key dengan header X-RateLimit-Remaining untuk transparansi.

2. Bearer Token Authentication

Jangan pernah kirim API key sebagai query parameter - gunakan header Authorization: Bearer. Simpan key sebagai hash (SHA-256) di database, bukan plaintext:

// Generate API key
$raw_key = "myapp_live_" . bin2hex(random_bytes(16));
$key_hash = hash("sha256", $raw_key);
// Simpan $key_hash di DB, tampilkan $raw_key ke user SEKALI saja

// Validasi request
$header = $_SERVER["HTTP_AUTHORIZATION"] ?? "";
preg_match("/Bearer (.+)/i", $header, $m);
$incoming_hash = hash("sha256", trim($m[1] ?? ""));
$key = $pdo->query("SELECT * FROM api_keys WHERE key_hash = ?")->fetch();

Dengan menyimpan hash, bahkan jika database bocor, attacker tidak bisa menggunakan key tersebut.

3. Webhook Signature Verification (HMAC)

Jika API Anda mengirim webhook ke server client, selalu sertakan signature untuk membuktikan keaslian payload:

// Pengirim (server Anda)
$body = json_encode($payload);
$sig = "sha256=" . hash_hmac("sha256", $body, $client_secret);
// Kirim header: X-Signature: $sig

// Penerima (server client)
$expected = "sha256=" . hash_hmac("sha256", $raw_body, $my_secret);
if (!hash_equals($expected, $_SERVER["HTTP_X_SIGNATURE"])) {
    http_response_code(401);
    exit("Invalid signature");
}

Gunakan hash_equals() untuk constant-time comparison - mencegah timing attack.

Kesimpulan

Ketiga teknik ini - rate limiting, token auth, dan HMAC signature - membentuk defense-in-depth yang solid untuk API manapun. Implementasi tidak harus kompleks; yang penting konsisten di setiap endpoint.

Jika Anda sedang membangun aplikasi yang membutuhkan verifikasi OTP via API, OTPZap menyediakan REST API lengkap dengan semua best practice keamanan yang dibahas di artikel ini - termasuk rate limiting, Bearer auth, dan webhook signature verification.