Pola Autentikasi API
Memilih pola autentikasi yang tepat untuk API sangat penting. Setiap pola memiliki kelebihan dan kekurangan tergantung pada use case.
1. API Key
Cara paling sederhana. Client mengirim key statis di header atau query parameter.
// Penggunaan API Key
GET /api/data HTTP/1.1
X-API-Key: sk_live_abc123def456
// Kelebihan: sederhana, mudah diimplementasi
// Kekurangan: tidak bisa identify user, sulit di-rotate
// Cocok untuk: server-to-server communication, public API dengan rate limiting
2. Bearer Token (OAuth/JWT)
Client mengirim token di header Authorization setelah proses autentikasi.
// Bearer Token
GET /api/profile HTTP/1.1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
// Flow:
// 1. Client login → server return access token + refresh token
// 2. Client kirim access token di setiap request
// 3. Jika expired, gunakan refresh token untuk dapat token baru
3. Session-based (Cookie)
Cocok untuk same-origin web apps. Server menyimpan state di session store.
// Cookie-based auth
POST /api/login → Set-Cookie: session=abc123; HttpOnly; Secure
GET /api/profile → Cookie: session=abc123 (otomatis dikirim browser)
// Kelebihan: mudah di-revoke, familiar
// Kekurangan: perlu CSRF protection, tidak cocok untuk mobile/cross-origin
4. HMAC Signature
Request ditandatangani dengan secret key. Server memverifikasi signature.
// HMAC request signing
const crypto = require("crypto");
const timestamp = Date.now().toString();
const payload = `${method}\n${path}\n${timestamp}\n${body}`;
const signature = crypto.createHmac("sha256", secretKey)
.update(payload).digest("hex");
// Header
X-Timestamp: 1700000000
X-Signature: a1b2c3d4...
Perbandingan
- API Key: Sederhana, cocok untuk server-to-server. Tidak aman untuk frontend.
- Bearer Token: Fleksibel, cocok untuk SPA dan mobile. Perlu token management.
- Session/Cookie: Cocok untuk web tradisional. Perlu CSRF protection.
- HMAC: Paling aman, cocok untuk API kritis. Lebih kompleks.
Best Practices
- Jangan kirim credentials di URL (query parameter) — bisa terlog
- Selalu gunakan HTTPS
- Implementasikan token expiration dan rotation
- Gunakan scoped permissions — token hanya punya akses yang dibutuhkan
- Log semua authentication attempts untuk monitoring
Session-based vs Token-based
Session-based menyimpan state di server (database/Redis) dan mengirim session ID via cookie — cocok untuk web tradisional, mudah di-revoke, tapi sulit di-scale horizontal. Token-based (JWT/PASETO) menyimpan state di token itu sendiri — stateless, cocok untuk SPA dan mobile, mudah di-scale, tapi sulit di-revoke sebelum expired.