Dasar Implementasi WebAuthn
WebAuthn (Web Authentication API) adalah standar W3C yang memungkinkan aplikasi web mengimplementasikan autentikasi berbasis kunci publik (FIDO2). Implementasi ini menggantikan kata sandi tradisional dengan autentikator kriptografis seperti kunci keamanan USB, sensor sidik jari, atau pengenalan wajah pada perangkat pengguna.
Proses implementasi melibatkan dua entitas utama: Client (browser yang menjalankan WebAuthn API) dan Server (Relying Party yang memvalidasi kredensial). Alur kerja dibagi menjadi dua fase: Registrasi (pembuatan kredensial) dan Autentikasi (penandatanganan tantangan).
Alur Teknis Registrasi
- Server membuat
PublicKeyCredentialCreationOptionsyang berisichallenge(random bytes) danrpId. - Client memanggil
navigator.credentials.create(). - Authenticator membuat pasangan kunci (publik/privat) dan mengembalikan kunci publik ke server.
- Server menyimpan kunci publik tersebut di database untuk verifikasi di masa depan.
Tabel Komparasi Komponen WebAuthn
| Komponen | Fungsi | Lokasi |
|---|---|---|
| Relying Party (RP) | Server aplikasi yang memvalidasi user | Server-side |
| Authenticator | Perangkat keras/lunak penyimpan kunci | Client-side |
| Challenge | Data acak untuk mencegah replay attack | Server-side |
| Credential ID | Identitas unik kredensial pengguna | Database |
Contoh Implementasi Sisi Klien (JavaScript)
// Registrasi Kredensial
const publicKeyCredentialCreationOptions = {
challenge: Uint8Array.from('random_challenge_bytes', c => c.charCodeAt(0)),
rp: { name: "Azwinn Corp", id: "azwinn.com" },
user: {
id: Uint8Array.from("user_id_123", c => c.charCodeAt(0)),
name: "[email protected]",
displayName: "User"
},
pubKeyCredParams: [{ alg: -7, type: "public-key" }]
};
const credential = await navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions
});Poin Kritis Keamanan
- Origin Binding: Pastikan
rpIdsesuai dengan domain aplikasi untuk mencegah phishing. - Challenge Uniqueness: Setiap tantangan harus unik dan memiliki masa berlaku singkat.
- Attestation: Gunakan untuk memverifikasi model authenticator jika diperlukan kepatuhan regulasi tinggi.
- User Verification: Selalu set
userVerification: 'required'untuk memastikan pengguna melakukan tindakan fisik (seperti PIN atau biometrik).
Dalam implementasi nyata, gunakan pustaka (library) yang sudah teruji seperti @simplewebauthn/server untuk Node.js guna menangani parsing CBOR dan validasi kriptografi yang kompleks. Jangan mencoba mengimplementasikan validasi tanda tangan kriptografi secara manual dari nol kecuali Anda memiliki keahlian mendalam dalam standar FIDO2.