Hampir setiap proyek web modern berinteraksi dengan API key—saat memasang payment gateway (Stripe/Midtrans), peta Google Maps, OpenAI, atau membangun REST API sendiri di Laravel dan Node.js. Namun, banyak developer menganggap semua API Key sama: sekadar string rahasia yang dimasukkan ke header HTTP atau file .env.
Anggapan ini berisiko memicu celah keamanan fatal:
- Menuliskan secret key di JavaScript frontend (React/Vue/browser) sehingga mudah dicuri via Inspect Element.
- Memasukkan data sensitif seperti password atau NIK ke payload JWT karena menganggap JWT dienkripsi.
- Lupa memverifikasi signature callback webhook pembayaran, sehingga peretas bisa memalsukan status transaksi menjadi "PAID" dengan
curl. - Meng-commit file
.envatauservice-account-key.jsonke repositori publik GitHub.
Artikel ini membedah 9 jenis API Key dan mekanisme autentikasi API modern, lengkap dengan cara kerja, contoh industri, kelebihan-kekurangan, serta diagram alur ASCII.
Apa Itu API Key dan Mengapa Jenisnya Berbeda-beda?
API Key adalah kredensial digital berupa string teks untuk mengidentifikasi dan memverifikasi aplikasi atau pengguna yang mengirim request ke API server.
Untuk memahami variasi jenisnya, pisahkan dua konsep utama: Authentication dan Authorization.
- Authentication (Autentikasi): Membuktikan identitas pengirim request ("Siapa Anda?").
- Authorization (Otorisasi): Menentukan hak akses atau izin yang diperbolehkan ("Apa yang boleh Anda lakukan?").
Mengapa Jenis API Key Beragam?
Kebutuhan lapangan menentukan jenis kredensial:
- Frontend vs Backend: Browser (frontend JS) tidak bisa menyimpan kata sandi rahasia. Backend server aman menyimpan secret key.
- Identitas Pengirim: Akses atas nama pengguna terautentikasi, entitas proyek, atau proses otomatis (cron job/bot).
- Penyimpanan Sesi: Pengecekan status di database (stateful) atau verifikasi kriptografi mandiri tanpa database (stateless).
- Keamanan Transpor: Pengiriman token langsung di header jaringan versus pengolahan tanda tangan digital (HMAC signature).
9 Jenis API Key & Mekanisme Autentikasi Modern
1. Standard API Key (Simple String Token)
Standard API Key adalah token string tunggal acak (opaque token) untuk mengidentifikasi proyek atau akun pengirim request.
- Mekanisme: Client mengirim key via Query Parameter (
?api_key=xyz123) atau HTTP Header (X-API-Key: xyz123). Server mencocokkan key di database/cache untuk mengidentifikasi caller, melacak rate limit, dan mencatat billing. - Contoh Nyata: Google Maps JavaScript API Key (
AIzaSy...), OpenWeatherMap API Key, Mailgun API Key. - Keamanan: Mengidentifikasi proyek, bukan pengguna spesifik. Untuk penggunaan frontend (Google Maps), key wajib dibatasi dengan HTTP Referrer Restriction atau IP Restriction.
- Kelebihan: Sederhana dan cepat diimplementasikan.
- Kekurangan: Tanpa konteks pengguna, berisiko jika bocor tanpa restriksi domain/IP.
2. Bearer Token (RFC 6750)
Bearer Token (RFC 6750) bekerja dengan prinsip "barangsiapa memegang token ini (bearer), ia diberikan hak akses".
- Mekanisme: Client mengirimkan token pada header HTTP
Authorization:
API server membaca string token setelah skemaAuthorization: Bearer eYJhbGciOiJIUzI1NiIsInR5cCI6...Bearerdan memvalidasinya. - Contoh Nyata: OAuth 2.0 Access Token, Laravel Sanctum Token, Stripe REST API.
- Keamanan: Siapa pun yang memegang token mendapat akses. HTTPS/TLS hukumnya wajib agar token tidak diintersepsi di jaringan.
- Kelebihan: Format standar industri HTTP, kompatibel dengan semua HTTP client.
- Kekurangan: Rentan jika token bocor atau disimpan sembarangan di client-side.
3. OAuth 2.0 Tokens (Access Token & Refresh Token - RFC 6749)
OAuth 2.0 (RFC 6749) adalah standar otorisasi terdelegasi yang memungkinkan aplikasi pihak ketiga mengakses data atas nama pengguna tanpa meminta password pengguna.
- Mekanisme: Menggunakan dua token: Access Token berumur pendek (misal 1 jam) untuk memanggil API, dan Refresh Token berumur panjang (disimpan di backend aman) untuk meminta Access Token baru saat kadaluarsa.
- Contoh Nyata: Google Sign-In, GitHub OAuth App, Spotify API Authorization Code Flow dengan PKCE.
- Keamanan: Mendukung fine-grained scopes (izin spesifik seperti
read:profile). Access Token yang kadaluarsa cepat meminimalkan dampak kebocoran. - Kelebihan: Keamanan tinggi, kontrol izin presisi.
- Kekurangan: Alur handshake otorisasi lebih kompleks.
4. JWT (JSON Web Token - RFC 7519)
JSON Web Token (RFC 7519) adalah format token mandiri (self-contained) bertanda tangan digital yang membawa klaim data JSON. JWT terdiri dari 3 bagian: Header.Payload.Signature.
- Mekanisme: Server menandatangani JWT dengan Secret Key (HMAC) atau Private Key (RS256). Saat client mengirim JWT di request berikutnya, API server memverifikasi Signature secara stateless tanpa query database.
- Contoh Nyata: Laravel Tymon JWT, Auth0, Firebase Authentication.
- Peringatan Keamanan:
Payload JWT bawaan hanya di-encode Base64Url, BUKAN dienkripsi. Siapa pun bisa membaca isi payload di
jwt.io. Jangan pernah menyimpan password, nomor kartu kredit, atau NIK di payload JWT! - Kelebihan: Stateless, efisien untuk microservices.
- Kekurangan: Pembatalan token seketika (instant revocation) membutuhkan mekanisme blacklist tambahan.
5. API Key + Secret Pair / HMAC Request Signing (AWS SigV4)
HMAC Request Signing menggunakan pasangan Access Key ID (publik) dan Secret Access Key (rahasia). Secret Access Key tidak pernah dikirimkan melalui jaringan HTTP.
- Mekanisme: Client membuat signature berbasis HMAC-SHA256 dari parameter HTTP request (Method, Path, Body, Timestamp) menggunakan Secret Key. Server menghitung ulang HMAC dari request yang diterima dan mencocokkannya.
- Contoh Nyata: AWS Signature Version 4 (SigV4) pada Amazon S3 REST API, Midtrans Signature.
- Keamanan: Anti-Tampering (perubahan body request membatalkan signature) dan Anti-Replay Attack (waktu request dibatasi maksimal 5 menit).
- Kelebihan: Keamanan tertinggi, rahasia tidak pernah melintasi jaringan.
- Kekurangan: Kalkulasi signature di client dan server lebih kompleks.
6. Service Account Key
Service Account Key berupa file konfigurasi (file JSON) yang berisi Private Key RSA milik akun layanan (Service Account) non-manusia untuk otomatisasi server-to-server.
- Mekanisme: SDK backend membaca private key dari file JSON, menandatangani JWT assertion, lalu menukarkannya dengan short-lived Access Token (berlaku 1 jam) dari Auth Server cloud.
- Contoh Nyata: Google Cloud Service Account Credentials (
service-account-key.json), Firebase Admin SDK. - Keamanan: Mengidentifikasi entitas server infrastruktur. Jika file JSON terkomit ke Git publik, peretas mendapat akses penuh ke cloud.
- Kelebihan: Sangat andal untuk otomasi backend (cron job, data pipeline).
- Kekurangan: Berisiko tinggi jika file kredensial bocor.
7. Webhook Secret / Webhook Signing Key
Webhook Secret adalah kunci rahasia bersama (shared secret) yang digunakan oleh penyedia layanan (publisher) untuk menandatangani payload notifikasi HTTP POST ke server pengembang (subscriber).
- Mekanisme: Publisher menghitung HMAC-SHA256 dari payload dan menyertakannya di header (misal
Stripe-Signature). Pada Stripe API secara spesifik, string yang di-hash HMAC adalah gabungan timestamptdan raw body payload (t.payload) untuk mencegah Replay Attack. Server subscriber mengambil timestamptdari header, mengambil raw body mentah, menghitung ulangHMAC-SHA256(t.payload, webhook_secret), lalu mencocokkannya dengan signaturev1. - Contoh Nyata: Stripe Webhook Signing Secret (
whsec_...), GitHub Webhook Secret, Midtrans / Xendit Notification Signature. - Keamanan: Mencegah Webhook Spoofing (pemalsuan request POST oleh peretas) dan Replay Attack.
- Kelebihan: Menjamin validitas notifikasi asynchronous.
- Kekurangan: Membutuhkan pembacaan raw body sebelum JSON diparse di backend.
8. Personal Access Token (PAT)
Personal Access Token (PAT) adalah token pengganti password berumur panjang yang digenerasi pengguna melalui dashboard akun untuk kebutuhan skrip CLI, bot, atau CI/CD pipeline.
- Mekanisme: Pengguna menggenerasi token dengan masa berlaku dan scope spesifik dari dashboard. Token digunakan pada CLI atau environment secrets CI/CD.
- Classic vs Fine-Grained PAT (GitHub): PAT Classic memberikan akses luas ke seluruh repositori. Fine-Grained PAT membatasi akses per repositori, per izin spesifik (misal
contents:read), serta memiliki batas expired. - Contoh Nyata: GitHub Fine-Grained PAT, GitLab PAT, Bitbucket App Passwords.
- Kelebihan: Menghindari pembagian password utama, token dapat dicabut individual.
- Kekurangan: Token tanpa masa kadaluarsa berisiko jika bocor.
9. Client ID & Client Secret (OAuth App Credentials)
Client ID dan Client Secret adalah pasangan kredensial untuk mengautentikasi aplikasi pengembang (Confidential Client) ke Authorization Server.
- Mekanisme:
Client IDadalah identifier publik aplikasi (seperti username), sedangkanClient Secretadalah kata sandi aplikasi. Digunakan pada OAuth Client Credentials Grant (machine-to-machine) atau saat penukaran authorization code. - Contoh Nyata: Spotify Developer App Credentials, Twitter/X API v2 App Credentials, Google Cloud OAuth Credentials.
- Keamanan: Client Secret HARAM dipakai di browser atau app mobile. Aplikasi mobile/SPA wajib menggunakan OAuth 2.0 dengan PKCE.
- Kelebihan: Mengamankan identitas aplikasi bisnis ke provider API.
- Kekurangan: Kebocoran Client Secret memerlukan rotasi dan re-deploy konfigurasi server.
Tabel Perbandingan Komprehensif Jenis-Jenis API Key
| Jenis API Key | Skema Header / Pengiriman | Status Validasi | Hak Akses (Scopes) | Risiko Keamanan Utama | Kasus Penggunaan Utama |
|---|---|---|---|---|---|
| Standard API Key | X-API-Key / Query ?api_key= | Stateful (DB/Cache) | Proyek Global | Bocor di frontend tanpa restriksi | Maps Widget, Weather API |
| Bearer Token | Authorization: Bearer | Stateless / Stateful | Sesuai jenis token | Token dicuri di jaringan tanpa HTTPS | REST API General, SPA Client |
| OAuth 2.0 Tokens | Authorization: Bearer | Stateful / Stateless | Fine-grained per user | Refresh token bocor di client-side | Login Google/GitHub, Data User |
| JWT | Authorization: Bearer | Stateless (Kriptografi) | Klaim JSON Payload | Data sensitif di payload | Microservices, Sesi User |
| HMAC Signatures | Header X-Signature | Stateless / Stateful | Sesuai Secret Key | Replay attack, hash mismatch | AWS S3, Payment Gateway |
| Service Account Key | File JSON Credentials / JWT | Stateless (Exchange) | IAM Role Cloud | File JSON terkomit ke Git | Server Cloud (GCP/Firebase) |
| Webhook Secret | Header Signature | Stateless (HMAC Payload) | N/A (Event Notification) | Tanpa verifikasi signature | Callback Payment, Event GitHub |
| Personal Access Token | Header Authorization: Bearer | Stateful (DB User Token) | Scope terbatas | Token tanpa tanggal kadaluarsa | Automasi CI/CD, Script CLI |
| Client ID & Secret | POST Body / Basic Auth Header | Stateful (App Auth) | Hak Akses Aplikasi | Client Secret dipasang di Frontend | Machine-to-Machine, OAuth Exchange |
Skenario Praktis - Kapan Memakai Jenis Key Yang Mana?
- Peta Interaktif di Website Frontend (Browser): Standard API Key + HTTP Referrer Restriction (domain
https://*.domain.com/*). - Login Pengguna di Aplikasi Mobile (Android/iOS): OAuth 2.0 Authorization Code Flow dengan PKCE (tanpa Client Secret statis).
- Komunikasi Antarlayanan Microservices Backend: JWT dengan Signature RS256 (Asymmetric Public/Private Key).
- Integrasi Payment Gateway: API Secret Key (Server to Server) + Webhook Secret (Verifikasi Callback Notification).
- Script Automasi Backup Server ke Cloud Storage: HMAC Request Signing (AWS SigV4) atau Service Account Credentials via SDK.
Kesalahan Umum Keamanan API Key dan Solusinya
- Secret Key di Frontend JavaScript: Selalu gunakan Backend Proxy (BFF pattern). Browser memanggil backend milik sendiri, backend yang berkomunikasi dengan API pihak ketiga.
- Terkomit ke Git Repository: Pastikan
.gitignorememuat.envdan*.jsonkredensial. Gunakan GitGuardian atau GitHub Secret Scanning. Jika terlanjur terkomit, segera revoke dan rotasi kunci di dashboard provider. - Mengabaikan Verifikasi HMAC Webhook: Selalu baca raw body request dan lakukan perbandingan signature constant-time untuk mencegah spoofing request
POSTpalsu. - Data Sensitif di Payload JWT: Ingat bahwa JWT hanya di-encode Base64Url, bukan dienkripsi. Simpan hanya identifier minimal seperti
user_id. - Kunci Tanpa Expired dan Rotasi: Tetapkan masa berlaku pada token dan terapkan prosedur rotasi kunci berkala.
Best Practices Pengelolaan API Key di Produksi
- Simpan Kredensial di
.env/ Secrets Vault: Gunakan Environment Variables, AWS Secrets Manager, atau HashiCorp Vault. - Prinsip Hak Akses Terkecil (PoLP): Gunakan key terpisah dengan scope minimal (misal read-only).
- Aktifkan Restriksi Domain & IP: Batasi Public API Key hanya dari domain atau IP server resmi.
- Wajibkan TLS/HTTPS: Seluruh route API yang membawa token wajib menggunakan HTTPS.
- Dukung Graceful Key Rotation: Izinkan transisi dua active secret key bersamaan saat rotasi agar aplikasi tidak mengalami downtime.
Kesimpulan & Checklist Sebelum Rilis
API Key bukan sekadar string acak rahasia. Memahami variasi jenis dan mekanismenya adalah fondasi utama membangun aplikasi web yang aman dan andal.
Gunakan checklist singkat ini sebelum meluncurkan integrasi API ke produksi:
- Seluruh Secret Key disimpan di
.envdan tidak ada yang terposting di frontend atau Git. - Public API Key di frontend sudah dibatasi dengan HTTP Referrer atau IP restriction.
- Endpoint Webhook memverifikasi HMAC signature dan timestamp pada setiap request masuk.
- Payload JWT bebas dari data sensitif dan dikirimkan via HTTPS.
- Token pihak ketiga dikonfigurasi dengan scope hak akses terkecil (Least Privilege).
Referensi Resmi
- Stripe API Authentication Documentation
- Stripe Webhook Signatures Guide
- GitHub Documentation: Managing Personal Access Tokens
- AWS Signature Version 4 Documentation
- RFC 7519: JSON Web Token (JWT)
- RFC 6749: The OAuth 2.0 Authorization Framework
- RFC 6750: The OAuth 2.0 Authorization Framework - Bearer Token Usage
- Google Cloud: API Keys Security & Best Practices
Fitur komentar belum diaktifkan oleh administrator.