Implementasi WebAuthn: Panduan Teknis Integrasi FIDO2

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

  1. Server membuat PublicKeyCredentialCreationOptions yang berisi challenge (random bytes) dan rpId.
  2. Client memanggil navigator.credentials.create().
  3. Authenticator membuat pasangan kunci (publik/privat) dan mengembalikan kunci publik ke server.
  4. Server menyimpan kunci publik tersebut di database untuk verifikasi di masa depan.

Tabel Komparasi Komponen WebAuthn

KomponenFungsiLokasi
Relying Party (RP)Server aplikasi yang memvalidasi userServer-side
AuthenticatorPerangkat keras/lunak penyimpan kunciClient-side
ChallengeData acak untuk mencegah replay attackServer-side
Credential IDIdentitas unik kredensial penggunaDatabase

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 rpId sesuai 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.