---
url: 'https://www.corbado.com/id/blog/implementasi-server-webauthn'
title: 'Perbandingan 9 Library Implementasi Server WebAuthn'
description: 'Artikel ini membantu Anda menemukan library server WebAuthn yang tepat untuk menawarkan kunci sandi. 9 library dibandingkan dengan strategi memilihnya.'
lang: 'id'
author: 'Nicolai'
date: '2026-07-27T08:26:10.009Z'
lastModified: '2026-07-27T08:27:38.292Z'
keywords: 'implementasi server webauthn, library server webauthn, kunci sandi, passkey, autentikasi tanpa sandi'
category: 'Passkeys Implementation'
---

# Perbandingan 9 Library Implementasi Server WebAuthn

## Key Facts

- **SimpleWebAuthn** (TypeScript, 1.000 bintang GitHub) dinilai paling intuitif dan secara unik menyediakan library server dan library browser frontend untuk implementasi kunci sandi.
- Autentikasi kunci sandi memerlukan setidaknya **empat endpoint API backend** dibandingkan dengan satu untuk autentikasi sandi, sehingga library server WebAuthn sangat penting untuk menangani kompleksitas kriptografi.
- **py_webauthn** (Python) sangat ideal untuk pengujian cepat: opsi autentikasi dihasilkan dengan satu pemanggilan metode dan tidak memerlukan konfigurasi framework.
- **webauthn-framework** (PHP/Symfony, 347 bintang) menyediakan dokumentasi konseptual yang paling ekstensif, sehingga paling cocok bagi developer yang mempelajari dasar-dasar kunci sandi dari awal.
- Saat tidak ada library yang cocok dengan bahasa Anda, **go-webauthn** atau SimpleWebAuthn adalah alternatif yang direkomendasikan karena adopsinya yang paling luas di berbagai proyek komersial dan open-source.

## 1. Pendahuluan: Implementasi Server WebAuthn

Menyediakan autentikasi pengguna yang aman dan sederhana adalah suatu keharusan bagi perusahaan digital pada tahun 2024. Kunci sandi, sebagai standar login baru, adalah solusi ideal untuk memenuhi kebutuhan ini. Namun, pengalaman pengguna dan keamanan yang ditingkatkan dari kunci sandi untuk pengguna memiliki harga yang harus dibayar saat mengimplementasikannya sebagai developer. Tingkat kesulitan implementasi bermula dari fakta bahwa kunci sandi relatif baru - bagi pengguna, tetapi juga bagi developer dan implementasinya bisa cukup menantang dibandingkan dengan autentikasi berbasis sandi. Faktanya, Anda memerlukan setidaknya empat endpoint API untuk autentikasi kunci sandi dibandingkan dengan satu endpoint API untuk autentikasi sandi.

Salah satu komponen inti di sisi server untuk menyediakan autentikasi kunci sandi adalah **server WebAuthn (bagian library berwarna hijau).** Untuk panduan komprehensif tentang bagaimana server WebAuthn cocok dengan integrasi stack enterprise yang lebih luas, lihat artikel khusus kami.

![Arsitektur Server WebAuthn](https://www.corbado.com/website-assets/657d793ffb87095054194ebb_webauthn_server_architecture_e9ba5ad00c.png)_Sumber: [Yubico](https://developers.yubico.com/java-webauthn-server/)_

Dalam postingan blog ini, kami membandingkan beberapa library / paket / SDK server WebAuthn, menganalisis perbedaan, dan memberikan rekomendasi untuk developer yang baru mengenal implementasi kunci sandi.

## 2. Bagaimana Cara Saya Mengimplementasikan Kunci Sandi Sendiri?

Untuk lebih memahami, mengapa **library server WebAuthn** diperlukan sejak awal, mari kita lihat bagaimana kunci sandi dapat diimplementasikan. Pada prinsipnya, ada dua cara untuk mengintegrasikan kunci sandi ke dalam situs web dan aplikasi:

1. Menggunakan solusi kunci sandi pihak ketiga (misalnya Corbado)
2. Mengimplementasikan kunci sandi Anda sendiri menggunakan salah satu library server WebAuthn dari bawah

Meskipun solusi kunci sandi pihak ketiga mudah diintegrasikan dan biasanya menghemat banyak waktu rekayasa (terutama untuk kasus edge, pemeliharaan, pemulihan, fallback, dan UX kunci sandi yang ditingkatkan), beberapa developer lebih suka mengimplementasikan semuanya sendiri.

Mari kita lihat bagaimana implementasi kunci sandi do-it-yourself bekerja. Dalam setup yang sangat mendasar, mekanisme untuk mendaftar (sign-up) dan mengautentikasi (login) diperlukan. Kedua proses tersebut, yang juga disebut upacara WebAuthn, ditangani secara berbeda, meskipun alur keseluruhannya mengikuti skema yang serupa:

1. **Frontend (browser) menginisiasi** permintaan sign-up atau login dan **memanggil endpoint API backend**.
2. **Backend menghasilkan parameter** sign-up atau login **WebAuthn**. Parameter ini masing-masing disebut PublicKeyCredentialCreationOptions dan PublicKeyCredentialRequestOptions. Salah satu bagian terpenting dari parameter WebAuthn ini adalah tantangan (challenge). Parameter WebAuthn kemudian **dikirim kembali ke frontend**.
3. **Frontend** menerima parameter WebAuthn ini dan menggunakannya untuk **memverifikasi identitas pengguna** menggunakan sistem autentikasi perangkat lokal (misalnya via Face ID, Touch ID, Windows Hello). Dalam proses sign-up, pasangan kunci publik-privat baru dibuat, kunci privat disimpan secara lokal, sementara kunci publik dikirim ke server. Dalam proses login, **tantangan ditandatangani** menggunakan kunci privat dari kunci sandi dan dikirim ke endpoint API backend lain.
4. Dalam proses sign-up, backend **menerima kunci publik** dan menyimpannya. Dalam login, backend **menerima tantangan yang ditandatangani dan memverifikasi integritasnya** menggunakan server WebAuthn.

Karena setiap proses sign-up / login melibatkan langkah-langkah ini, backend perlu melacak pengguna, kunci sandi, dan permintaan sign-up / login.

Jika Anda ingin mendapatkan pengetahuan yang lebih mendalam tentang cara kerja kunci sandi dan bagaimana implementasi sederhananya (tanpa menggunakan solusi kunci sandi pihak ketiga), Anda dapat menyelidiki artikel blog kami [di sini](http://ttps://www.corbado.com/blog/passkey-tutorial-how-to-implement-passkeys).

Dalam skenario kehidupan nyata, saat mengimplementasikan kunci sandi sendiri, perlu diingat bahwa ini bukan hanya tentang menyediakan endpoint API yang diperlukan dan implementasi dasar untuk sign-up dan login. Di samping itu, Anda perlu mengatasi topik dan kasus penggunaan berikut:

- Manajemen perangkat
- Alur login lintas platform dan lintas perangkat
- Manajemen pengguna
- Manajemen sesi
- Deteksi perangkat yang siap kunci sandi (passkey-readiness)
- Edukasi pengguna
- Opsi autentikasi fallback
- Mekanisme pemulihan
- Opsi untuk berbagi akun
- Alur pembuatan kunci sandi dan alur login kunci sandi yang dioptimalkan untuk adopsi tinggi

Meskipun begitu, untuk implementasi kunci sandi dasar, Anda hanya perlu mematuhi standar WebAuthn. Mengimplementasikan library server WebAuthn yang terkenal dan didukung biasanya sudah cukup. Library menghasilkan parameter server WebAuthn dan memverifikasi tantangan login, pada dasarnya mengambil alih bagian kriptografi dan paling kompleks untuk Anda.

## 3. Library Backend Server WebAuthn: Sebuah Perbandingan

Semua library server WebAuthn yang dianalisis menyediakan fungsionalitas yang diperlukan untuk menawarkan autentikasi kunci sandi. Oleh karena itu, kami memberikan perhatian khusus pada kriteria berikut:

- **Kriteria Pemilihan Autentikator:** Bagaimana Anda dapat mengatur preferensi untuk perilaku dan fitur keamanan tertentu (misalnya memaksa pembuatan resident keys)?
- **Pengaturan Global:** Seberapa jauh Anda dapat memusatkan konfigurasi yang diperlukan?
- **Dokumentasi:** Seberapa baik library server WebAuthn didokumentasikan dan mudah diikuti
- **Contoh:** Apakah ada contoh implementasi yang Anda ambil sebagai referensi.

Library server WebAuthn berikut dianalisis (diurutkan berdasarkan jumlah bintang GitHub yang menurun pada bulan Desember 2023):

### 3.1 TypeScript: SimpleWebAuthn

![SimpleWebAuthn](https://www.corbado.com/website-assets/657d796db359dbc15ca87b17_webauthn_server_simplewebauthn_458503b246.png)

- **Bahasa Pemrograman:** Typescript
- **Framework:** Node.js
- **Penulis:** Matthew Miller (Duo Security / Cisco)
- **Bintang:** 1.000
- **Digunakan oleh:** 781
- **Kontributor:** 19
- **Kesesuaian FIDO:** Ya
- **Pengaturan Global:** Tidak
- **Kriteria Pemilihan Autentikator:** Seperti yang [disarankan oleh W3C](https://www.w3.org/TR/webauthn-2/#dictionary-authenticatorSelection) (harus berisi variabel authenticatorAttachment, residentKey, requireResidentKey, dan userVerification yang dijelaskan di halaman W3C juga)
- **Dokumentasi:** Terstruktur dengan baik dengan fokus pada pengaturan cepat dan kemudahan penggunaan, termasuk pengetahuan kunci sandi mis. menjelaskan apa itu kunci sandi dan bagaimana cara kerjanya
- **Contoh:** Contoh proyek tersedia di [dokumentasi](https://simplewebauthn.dev/docs/advanced/example-project)
- **Struktur data yang direkomendasikan:**

```json
type UserModel = {
  id: string;
  username: string;
  currentChallenge?: string;
};

/**
 * It is strongly advised that authenticators get their own DB
 * table, ideally with a foreign key to a specific UserModel.
 *
 * "SQL" tags below are suggestions for column data types and
 * how best to store data received during registration for use
 * in subsequent authentications.
 */
type Authenticator = {
  // SQL: Encode to base64url then store as `TEXT`. Index this column
  credentialID: Uint8Array;
  // SQL: Store raw bytes as `BYTEA`/`BLOB`/etc...
  credentialPublicKey: Uint8Array;
  // SQL: Consider `BIGINT` since some authenticators return atomic timestamps as counters
  counter: number;
  // SQL: `VARCHAR(32)` or similar, longest possible value is currently 12 characters
  // Ex: 'singleDevice' | 'multiDevice'
  credentialDeviceType: CredentialDeviceType;
  // SQL: `BOOL` or whatever similar type is supported
  credentialBackedUp: boolean;
  // SQL: `VARCHAR(255)` and store string array as a CSV string
  // Ex: ['usb' | 'ble' | 'nfc' | 'internal']
  transports?: AuthenticatorTransport[];
};
```

- **Karakteristik Lainnya:** Hebat [WebAuthn Debugger untuk respons WebAuthn](https://debugger.simplewebauthn.dev/) dan tidak hanya menawarkan library backend / server tetapi juga library untuk frontend (pada dasarnya membungkus beberapa API Autentikasi Web dari klien)
- **Penilaian Pribadi:** Setup paling intuitif yang terlihat sejauh ini dan sangat mudah. Selain itu, ini adalah salah satu dari sedikit library yang juga menawarkan library browser untuk membantu implementasi klien sehingga membuatnya cukup menonjol. Penulis library ini sangat aktif di komunitas WebAuthn / kunci sandi.
- **Tautan GitHub:** [https://github.com/MasterKale/SimpleWebAuthn](https://github.com/MasterKale/SimpleWebAuthn)

![Tangkapan Layar SimpleWebAuthn](https://www.corbado.com/website-assets/657d797be263ba3262fff816_webauthn_server_simplewebauthn_screenshot_527317d6be.png)

### 3.2 .NET: fido2-net-lib

![fido2-net-lib](https://www.corbado.com/website-assets/657d79968cef2987ff7c9c21_webauthn_server_fido2_net_lib_6727019f82.png)

- **Bahasa Pemrograman:** C#
- **Framework:** .NET
- **Penulis:** Anders Åberg, Alex Seigler
- **Bintang:** 962
- **Digunakan oleh:** 200
- **Kontributor:** 40
- **Kesesuaian FIDO:** Ya
- **Pengaturan Global:** Ya
- **Kriteria Pemilihan Autentikator:** Seperti yang disarankan oleh W3C
- **Dokumentasi:** Hanya Readme dengan beberapa sampel, beberapa [intelijen kunci sandi](https://docs.corbado.com/corbado-connect/features/passkey-intelligence) di [situs web](https://fido2-net-lib.passwordless.dev/) library
- **Contoh:** Pengontrol demo dan penyimpanan kredensial contoh tersedia untuk menunjukkan integrasi contoh
- **Struktur data yang direkomendasikan:**

```json
public class StoredCredential
{
    /// <summary>
    /// The Credential ID of the public key credential source.
    /// </summary>
    public byte[] Id { get; set; }

    /// <summary>
    /// The credential public key of the public key credential source.
    /// </summary>
    public byte[] PublicKey { get; set; }

    /// <summary>
    /// The latest value of the signature counter in the authenticator data from any ceremony using the public key credential source.
    /// </summary>
    public uint SignCount { get; set; }

    /// <summary>
    /// The value returned from getTransports() when the public key credential source was registered.
    /// </summary>
    public AuthenticatorTransport[] Transports { get; set; }

    /// <summary>
    /// The value of the BE flag when the public key credential source was created.
    /// </summary>
    public bool IsBackupEligible { get; set; }

    /// <summary>
    /// The latest value of the BS flag in the authenticator data from any ceremony using the public key credential source.
    /// </summary>
    public bool IsBackedUp { get; set; }

    /// <summary>
    /// The value of the attestationObject attribute when the public key credential source was registered.
    /// Storing this enables the Relying Party to reference the credent’al's attestation statement at a later time.
    /// </summary>
    public byte[] AttestationObject { get; set; }

    /// <summary>
    /// The value of the clientDataJSON attribute when the public key credential source was registered.
    /// Storing this in combination with the above attestationObject item enables the Relying Party to re-verify the attestation signature at a later time.
    /// </summary>
    public byte[] AttestationClientDataJson { get; set; }

    public List<byte[]> DevicePublicKeys { get; set; }

    public byte[] UserId { get; set; }

    public PublicKeyCredentialDescriptor Descriptor { get; set; }

    public byte[] UserHandle { get; set; }

    public string AttestationFormat { get; set; }

    public DateTimeOffset RegDate { get; set; }

    public Guid AaGuid { get; set; }
}
```

- **Karakteristik Lainnya:** Digunakan oleh Bitwarden (startup passwordless.dev diakuisisi oleh Bitwarden)
- **Penilaian Pribadi:** Library ramah developer dengan jumlah materi tambahan yang baik
- **Tautan GitHub:** [https://github.com/passwordless-lib/fido2-net-lib](https://github.com/passwordless-lib/fido2-net-lib)

![Tangkapan Layar fido2-net-lib](https://www.corbado.com/website-assets/657d79aefc6fa186be1a722e_webauthn_server_fido2_net_lib_screenshot_a624ecd3d2.png)

### 3.3 Python: py_webauthn

![py_webauthn](https://www.corbado.com/website-assets/657d79c9b1ac103f4c903ec1_webauthn_server_py_webauthn_416b6eae90.jpg)

- **Bahasa Pemrograman:** Python
- **Framework:** tidak spesifik
- **Penulis:** Duo Labs
- **Bintang:** 727
- **Digunakan oleh:** 912
- **Kontributor:** 23
- **Kesesuaian FIDO:** Tidak Tersedia
- **Pengaturan Global:** Tidak
- **Kriteria Pemilihan Autentikator:** Seperti yang disarankan oleh W3C
- **Dokumentasi:** Sedikit atau tidak ada, pengetahuan kunci sandi sebelumnya diperlukan
- **Contoh:** Sampel kode kecil untuk sign-up dan login disertakan
- **Struktur data yang direkomendasikan:** Tidak Tersedia
- **Karakteristik Lainnya:** Membutuhkan Python &gt;= 3.8
- **Penilaian Pribadi:** Library yang tergolong ringkas dengan jumlah file kecil, Anda bisa mendapatkan ikhtisar dalam waktu singkat.
- **Tautan GitHub:** [https://github.com/duo-labs/py_webauthn](https://github.com/duo-labs/py_webauthn)

![Tangkapan Layar py_webauthn](https://www.corbado.com/website-assets/657d79da1eee1bef26c8ef4b_webauthn_server_py_webauthn_screenshot_5292be32e1.png)

### 3.4 Ruby: webauthn-ruby

![webauthn-ruby](https://www.corbado.com/website-assets/657d79ef3b5153896eb8fd4c_webauthn_server_webauthn_ruby_4fc3b288bd.png)

- **Bahasa Pemrograman:** Ruby
- **Framework:** Ruby on Rails
- **Penulis:** Cedarcode
- **Bintang:** 580
- **Digunakan oleh:** 679
- **Unduhan Gem:** 18 Juta
- **Kontributor:** 27
- **Kesesuaian FIDO:** Ya
- **Pengaturan Global:** Ya
- **Kriteria Pemilihan Autentikator:** Seperti yang disarankan oleh W3C
- **Dokumentasi:** Readme adalah satu-satunya sumber dokumentasi
- **Contoh:** Tidak Tersedia
- **Struktur data yang direkomendasikan:** Tidak Tersedia
- **Karakteristik Lainnya:** Wrapper untuk library ini juga tersedia ([warden-webauthn](https://github.com/ruby-passkeys/warden-webauthn), [devise-passkeys](https://github.com/ruby-passkeys/devise-passkeys))
- **Penilaian Pribadi:** Karena materi tambahan cukup terbatas, kami hanya akan merekomendasikan library ini jika Anda familier dengan Ruby dan Kunci Sandi
- **Tautan GitHub:** [https://github.com/cedarcode/webauthn-ruby](https://github.com/cedarcode/webauthn-ruby)

![Tangkapan Layar webauthn-ruby](https://www.corbado.com/website-assets/657d79fd54838aafd2274e4e_webauthn_server_webauthn_ruby_screenshot_7fb391a360.png)

### 3.5 Go: go-webauthn

![go-webauthn](https://www.corbado.com/website-assets/657d7a13b1ac103f4c908c60_webauthn_server_go_webauthn_f4f8db52ec.png)

- **Bahasa Pemrograman:** Go
- **Framework:** Framework berbasis Go seperti Gin, Echo, …
- **Penulis:** Awalnya dari Duo Labs / dilanjutkan oleh James Elliott
- **Bintang:** 480
- **Digunakan oleh:** 280
- **Kontributor:** 18
- **Kesesuaian FIDO:** Ya
- **Pengaturan Global:** Ya
- **Kriteria Pemilihan Autentikator:** Seperti yang disarankan oleh W3C
- **Dokumentasi:** Readme dengan beberapa sampel adalah satu-satunya sumber dokumentasi
- **Contoh:** [Repositori contoh](https://github.com/ruby-passkeys/devise-passkeys) tersedia
- **Struktur Data yang Direkomendasikan:** Tidak Tersedia
- **Karakteristik Lainnya:** Jumlah file yang besar, mendapatkan ikhtisar membutuhkan waktu
- **Penilaian Pribadi:** Library populer yang mudah digunakan setelah Anda terbiasa, namun kami menyarankan untuk mempelajari beberapa pengetahuan kunci sandi (Bagaimana cara kerjanya, seperti apa prosedurnya, dll) sebelumnya.
- **Tautan GitHub:** [https://github.com/go-webauthn/webauthn](https://github.com/go-webauthn/webauthn)

![Tangkapan Layar go-webauthn](https://www.corbado.com/website-assets/657d7a266276ea8bd12bb480_webauthn_server_go_webauthn_screenshot_4bf908cdfd.png)

### 3.6 Java: java-webauthn-server

![java-webauthn-server](https://www.corbado.com/website-assets/657d7a49ac1b2446296c4e2b_webauthn_server_java_webauthn_server_368503276e.png)

- **Bahasa Pemrograman:** Java
- **Framework:** Maven / Gradle
- **Penulis:** Yubico
- **Bintang:** 391
- **Digunakan oleh:** Tidak Tersedia
- **Kontributor:** 27
- **Kesesuaian FIDO:** Tidak Tersedia
- **Pengaturan Global:** Ya
- **Kriteria Pemilihan Autentikator:** Seperti yang disarankan oleh W3C.
- **Dokumentasi:** Readme adalah satu-satunya dokumentasi, tetapi agak mendetail
- **Contoh:** Tidak Tersedia
- **Struktur Data yang Direkomendasikan:** Tidak Tersedia
- **Karakteristik Lainnya:** Dilengkapi dengan antarmuka Credential Repository, memberikan panduan yang jelas tentang metode pengambilan database yang diperlukan.
- **Penilaian Pribadi:** Meskipun Anda harus mengelola database sendiri, repositori kredensial membantu secara signifikan dalam proses perancangan database. Secara alami, implementasi Java memiliki jumlah file yang ekstensif karena setiap atribut memerlukan kelas yang biasanya disimpan di filenya sendiri. Ini membuat proses mendapatkan ikhtisar menjadi tugas yang lebih memakan waktu.
- **Tautan GitHub:** [https://github.com/Yubico/java-webauthn-server](https://github.com/Yubico/java-webauthn-server)

![Tangkapan Layar java-webauthn-server](https://www.corbado.com/website-assets/657d7a5aeac136d96d1bb459_webauthn_server_java_webauthn_server_screenshot_0cc89ca1ab.png)

### 3.7 Rust: webauthn-rs

![webauthn-rs](https://www.corbado.com/website-assets/657d7a6dd61bd50a76f5d9ca_webauthn_server_webauthn_rs_1be32ca83b.png)

- **Bahasa Pemrograman:** Rust
- **Framework:** Berbasis Rust (Rocket, Axum, …)
- **Penulis:** Kanidm Identity Management Project
- **Bintang:** 351
- **Digunakan oleh:** 617
- **Kontributor:** 25
- **Kesesuaian FIDO:** Tidak Tersedia
- **Pengaturan Global:** Ya
- **Kriteria Pemilihan Autentikator:** Kemungkinan konfigurasi yang sangat terbatas. Library lain diimplementasikan persis sesuai dengan Standar W3C, menampilkan konfigurabilitas yang lebih besar
- **Dokumentasi:** Ada dokumentasi teknis yang dibuat secara otomatis, tetapi tidak terlalu mendetail
- **Contoh:** [Repositori tutorial](https://github.com/kanidm/webauthn-rs/tree/master/tutorial) dengan contoh untuk 3 framework web berbeda tersedia
- **Struktur Data yang Direkomendasikan:** Tidak Tersedia
- **Karakteristik Lainnya:** Library ini telah lulus audit keamanan yang dilakukan oleh keamanan produk SUSE.
- **Penilaian Pribadi:** Karena konfigurabilitas dan dokumentasi yang terbatas, kami hanya akan merekomendasikan library ini jika framework utama Anda berbasis Rust dan Anda mengetahui cara kerja kunci sandi
- **Tautan GitHub:** [https://github.com/kanidm/webauthn-rs](https://github.com/kanidm/webauthn-rs)

![Tangkapan Layar webauthn-rs](https://www.corbado.com/website-assets/657d7a7db359dbc15ca91760_webauthn_server_webauthn_rs_screenshot_cc92cc955d.png)

### 3.8 PHP: webauthn-framework

![webauthn-framework](https://www.corbado.com/website-assets/657d7bd762d48bffd4a9b34d_webauthn_server_webauthn_framework_07cf99330e.png)

- **Bahasa Pemrograman:** PHP
- **Framework:** Symfony
- **Penulis:** Florent Morselli
- **Bintang:** 347
- **Digunakan oleh:** Tidak Tersedia
- **Kontributor:** 18
- **Kesesuaian FIDO:** Ya
- **Pengaturan Global:** Ya
- **Kriteria Pemilihan Autentikator:** Seperti yang disarankan oleh W3C.
- **Dokumentasi:** Dokumentasi yang ekstensif termasuk detail teknis, tetapi juga menjelaskan kunci sandi dari dasar
- **Contoh:** [Repositori contoh](https://github.com/web-auth/symfony-webauthn-demo) tersedia
- **Struktur Data yang Direkomendasikan:**

```php
<?php

declare(strict_types=1);

namespace App\Entity;

use App\Repository\PublicKeyCredentialSourceRepository;
use DateTimeImmutable;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Uid\AbstractUid;
use Symfony\Component\Uid\Uuid;
use Webauthn\PublicKeyCredentialSource as BasePublicKeyCredentialSource;
use Webauthn\TrustPath\TrustPath;

#[ORM\Table(name: 'pk_credential_sources')]
#[ORM\Entity(repositoryClass: PublicKeyCredentialSourceRepository::class)]
class PublicKeyCredentialSource extends BasePublicKeyCredentialSource
{
    #[ORM\Column(type: Types::DATETIME_IMMUTABLE)]
    public readonly DateTimeImmutable $createdAt;

    #[ORM\Id]
    #[ORM\Column(type: Types::STRING, length: 255)]
    #[ORM\GeneratedValue(strategy: 'NONE')]
    private string $id;

    public function __construct(
        string $publicKeyCredentialId,
        string $type,
        array $transports,
        string $attestationType,
        TrustPath $trustPath,
        AbstractUid $aaguid,
        string $credentialPublicKey,
        string $userHandle,
        int $counter
    ) {
        $this->id = Uuid::v4()->toRfc4122();
        $this->createdAt = new DateTimeImmutable();
        parent::__construct($publicKeyCredentialId, $type, $transports, $attestationType, $trustPath, $aaguid, $credentialPublicKey, $userHandle, $counter);
    }

    public function getId(): string
    {
        return $this->id;
    }
}
```

- **Karakteristik Lainnya:** Tidak Tersedia
- **Penilaian Pribadi:** Bagus untuk orang-orang yang ingin mengenal kunci sandi, tetapi tidak memiliki pengetahuan sebelumnya
- **Tautan GitHub:** [https://github.com/web-auth/webauthn-framework](https://github.com/web-auth/webauthn-framework)

![Tangkapan Layar webauthn-framework](https://www.corbado.com/website-assets/657d7be96276ea8bd12cb5fd_webauthn_server_webauthn_framework_screenshot_9c1e9a3dd8.png)

### 3.9 Java: webauthn4j

![webauthn4j](https://www.corbado.com/website-assets/657d7c00fe6a1b80f0f03fd6_webauthn_server_webauthn4j_d8c4d2a9de.png)

- **Bahasa Pemrograman:** Java
- **Framework:** Maven
- **Penulis:** WebAuthn4j
- **Bintang:** 342
- **Digunakan oleh:** Tidak Tersedia
- **Kontributor:** 19
- **Kesesuaian FIDO:** Ya
- **Pengaturan Global:** Ya
- **Kriteria Pemilihan Autentikator:** Sebagai pengganti parameter UserVerificationRequirement yang disarankan W3C dengan nilai discouraged, preferred, required, webauthn4j menawarkan verificationRequired dan userPresenceRequired sebagai variabel Boolean
- **Dokumentasi:** Dokumentasi yang kering namun ekstensif dengan beberapa contoh kode tersedia
- **Contoh:** [Repositori contoh](https://github.com/webauthn4j/webauthn4j-spring-security) tersedia
- **Struktur Data yang Direkomendasikan:** Tidak Tersedia
- **Karakteristik Lainnya:** Tidak Tersedia
- **Penilaian Pribadi:** Membaca dokumentasinya dengan cepat menjadi membosankan dan kompleks, karena ini hanya satu halaman besar yang berfokus semata-mata pada fungsionalitas, bukan konsep di balik kunci sandi.
- **Tautan GitHub:** [https://github.com/webauthn4j/webauthn4j](https://github.com/webauthn4j/webauthn4j)

![Tangkapan Layar webauthn4j](https://www.corbado.com/website-assets/657d7c7fb359dbc15caa2007_webauthn_server_webauthn4j_screenshot_3d7616a5e5.png)

Tabel berikut memberikan ikhtisar tentang library server WebAuthn:

![Ikhtisar Server WebAuthn](https://www.corbado.com/website-assets/657d7c8fffd0b1429fd8d276_webauthn_server_implementation_overview_92a55c2e0f.png)

## 4. Rekomendasi: Menavigasi Lanskap Library WebAuthn

### 4.1 Langkah 1: Pilih Library WebAuthn Anda

Karena sebagian besar library sama-sama andal dan mengimplementasikan standar WebAuthn, kami merekomendasikan pohon keputusan berikut:

- **Tersedia Library Server WebAuthn di Framework & Bahasa Pemrograman Anda:** Kami belum mencantumkan library framework yang bergantung pada salah satu library di atas (misalnya ada penyesuaian untuk PHP yang tersedia untuk Symfony dan Laravel). Jika ada implementasi framework, pilih ini karena memungkinkan Anda untuk mengimplementasikan pemanggilan API WebAuthn secara native ke dalam struktur framework Anda saat ini dan menggunakan abstraksi database Anda untuk mengimplementasikan penyimpanannya.
- **Tersedia Library Server WebAuthn di Bahasa Pemrograman Anda:** Karena Anda memerlukan endpoint API backend, pilih library server WebAuthn dalam bahasa pemrograman asli Anda agar dapat disematkan secara native ke dalam endpoint API Anda saat ini.
- **Tidak Tersedia Library Server WebAuthn di Bahasa Pemrograman Anda:** Dalam hal ini, Anda harus mempertimbangkan untuk menggunakan solusi kunci sandi terkelola seperti Corbado. Jika itu bukan pilihan, kami sarankan menggunakan go-webauthn atau SimpleWebAuthn karena keduanya memiliki adopsi terbesar, ringan, dan juga digunakan oleh banyak proyek komersial serta open-source.

Jika Anda hanya ingin mempelajari lebih lanjut tentang server WebAuthn secara umum tanpa memiliki proyek yang spesifik, kami dapat memberikan beberapa rekomendasi karena ada beberapa perbedaan di antara library dan materi tambahannya seperti dokumentasi serta contoh implementasi. Jadi, untuk software developer yang ingin memulai perjalanan implementasi kunci sandi mereka, kami menyarankan untuk memilih implementasi berikut:

- **Untuk Pengujian Cepat:** Paket _py_webauthn_ menawarkan implementasi instan dengan [potongan kode](https://github.com/duo-labs/py_webauthn/blob/master/examples/registration.py) yang siap digunakan. Hanya dengan satu pemanggilan metode, Anda dapat menghasilkan opsi yang Anda perlukan untuk autentikasi. Karena Anda tidak perlu menanamkan library dalam suatu framework dan mengonfigurasinya, ini sangat ideal untuk pengujian cepat.
- **Untuk Implementasi Intuitif:** Paket _SimpleWebauthn_ yang ditulis dalam Typescript sangat jelas dan ramah developer. Seperti _py_webauthn_, implementasinya sangat minimalis, tetapi juga dilengkapi dengan dokumentasi yang memandu Anda melalui proses autentikasi. Namun, berbeda dengan _py_webauthn_, _SimpleWebAuthn_ tidak disertakan dengan contoh jelas yang berjalan tanpa modifikasi.
- **Untuk Pemahaman Mendalam:** Library _webauthn-framework_ untuk PHP menonjol dengan [dokumentasi](http://Link) yang ekstensif dan terstruktur dengan fokus pada konsep kunci sandi. Perbedaan utama dengan library lain yang memiliki jumlah dokumentasi yang baik seperti _webauthn4j_ adalah desain dan kejelasan dokumentasinya.

Untuk pemahaman yang lebih mendalam tentang bagaimana WebAuthn bekerja di sisi server, Anda dapat membaca bagian detail Operasi WebAuthn Relying Party di dalam RFC WebAuthn yang merincikan setiap langkah yang perlu diimplementasikan untuk [mendaftarkan kredensial baru (7.1)](https://www.w3.org/TR/webauthn-2/#sctn-registering-a-new-credential) dan [memverifikasi asersi autentikasi (7.2)](https://www.w3.org/TR/webauthn-2/#sctn-verifying-assertion).

### 4.2 Langkah 2: Tentukan Opsi Server WebAuthn Anda

Evaluasi persyaratan spesifik kunci sandi dan WebAuthn yang Anda miliki. Dalam postingan blog ini, kami mengasumsikan Anda hanya ingin mendukung kunci sandi sebagai discoverable credentials. Bacalah tentang PublicKeyCredentialCreationOptions dan PublicKeyCredentialRequestOptions bersama dengan pemanggilan API WebAuthn sisi klien navigator.credentials.create() dan navigator.credentials.get() untuk mengatur parameter di konfigurasi SDK server WebAuthn dengan benar untuk kasus penggunaan Anda.

### 4.3 Langkah 3: Tentukan Struktur Database

Untuk semua library server WebAuthn, Anda harus menyediakan struktur database yang tepat untuk menyimpan / mengakses informasi berikut:

- Kredensial
- Pengguna
- Tantangan (Challenges)
- Autentikator

Untuk beberapa library, terdapat rekomendasi dan contoh spesifik (jika kami merasa berguna, kami telah menyediakannya di atas). Sangat penting untuk memahami sepenuhnya field WebAuthn mana yang perlu disimpan di mana. Perhatikan secara khusus untuk mengidentifikasi nilai mana yang ingin Anda gunakan untuk ID Pengguna (user.id). Kami memiliki penjelasan yang lebih mendetail di sini. Selain itu, pertimbangkan apa yang terjadi jika pengguna menghapus kunci sandi. Di samping itu, Anda juga dapat membatasi penggunaan autentikator tertentu secara opsional. Daftar autentikator valid yang terkait dengan kunci sandi dapat ditemukan [di sini](https://github.com/passkeydeveloper/passkey-authenticator-aaguids). Jika Anda juga ingin mendukung dan memeriksa atestasi kunci keamanan (security keys), ini adalah bahasan yang sama sekali berbeda. Anda dapat menemukan informasi lebih lanjut [di sini](https://fidoalliance.org/metadata/).

### 4.4 Langkah 4: Uji Coba pada Perangkat Pengguna Anda

Identifikasi di perangkat mana pengguna Anda akan menggunakan kunci sandi dan metode autentikasi fallback. Jika Anda tidak yakin perangkat, browser, dan sistem operasi apa yang digunakan pengguna Anda, periksa [State of Passkeys](https://state-of-passkeys.io/) untuk data terbaru tentang tingkat kesiapan kunci sandi di seluruh platform, browser, dan sistem operasi. Jika Anda memiliki pertanyaan spesifik tentang adopsi kunci sandi dan pangsa kesiapan kunci sandi pada perangkat tertentu, jangan ragu untuk menghubungi kami. Kami dengan senang hati akan memberikan Anda wawasan lebih lanjut dan membantu Anda mengenai topik ini (lihat juga postingan blog terbaru kami tentang kesiapan kunci sandi). Dari perspektif observabilitas, pisahkan kegagalan WebAuthn sisi klien dan penolakan verifikasi server sebagai aliran yang terpisah; untuk definisi bucket sisi klien, gunakan kesalahan WebAuthn. Selain itu, Anda harus ingat bahwa untuk Windows 10 dan Linux, Anda perlu memunculkan solusi khusus karena sistem operasi ini memberikan dukungan kunci sandi paling minim (jika ada).

## 5. Kesimpulan

Untuk hampir setiap bahasa atau framework yang ada saat ini, terdapat library server WebAuthn yang sudah mapan. Membandingkan library dari berbagai bahasa tidak menunjukkan keunggulan yang jelas dari implementasi tertentu. Sebaliknya, Anda sebaiknya menggunakan framework / bahasa pemrograman yang paling Anda kuasai. Sebagai alternatif, jika Anda tidak ingin mengimplementasikan WebAuthn sendiri dan menangani semua hal yang menyertainya, Anda dapat mencoba solusi autentikasi kunci sandi siap pakai dan terdedikasi seperti Corbado. Menghadirkan solusi autentikasi serba ada yang berpusat pada kunci sandi, ia dilengkapi dengan [intelijen kunci sandi](https://docs.corbado.com/corbado-connect/features/passkey-intelligence) yang hebat, manajemen sesi, serta metode autentikasi fallback, sehingga Anda dapat berfokus pada pengembangan produk Anda dan melepaskan urusan autentikasi. Anda dapat mencobanya secara gratis dengan pengguna tak terbatas [di sini](https://app.corbado.com/signin#register).

## Pertanyaan yang Sering Diajukan

### Bagaimana cara memilih library server WebAuthn yang tepat untuk proyek saya?

Pertama periksa apakah ada library untuk framework spesifik Anda, kemudian untuk bahasa pemrograman Anda. Karena semua library yang terdaftar mengimplementasikan standar WebAuthn secara setara, pilihan sebaiknya memprioritaskan seberapa familier Anda dengan stack yang ada daripada perbedaan fitur antar library.

### Data apa yang perlu saya simpan di database ketika membangun server WebAuthn?

Setidaknya Anda harus menyimpan kredensial, pengguna, tantangan (challenge), dan autentikator. Perhatikan dengan saksama nilai mana yang Anda tetapkan sebagai ID Pengguna (userHandle), dan rencanakan skenario di mana pengguna mungkin menghapus kunci sandi dari perangkat mereka.

### Mengapa saya tidak mengimplementasikan verifikasi sisi server WebAuthn dari awal tanpa library saja?

Library server WebAuthn menangani operasi kriptografi yang paling kompleks: menghasilkan parameter PublicKeyCredentialCreationOptions dan PublicKeyCredentialRequestOptions serta memverifikasi tantangan yang ditandatangani. Melakukan hal ini dengan benar dari awal jauh lebih sulit daripada menggunakan library yang sesuai dengan FIDO yang telah diuji dan diaudit.

### Sistem operasi mana yang memiliki dukungan kunci sandi paling buruk dan memerlukan penanganan ekstra dalam implementasi WebAuthn?

Windows 10 dan Linux memberikan dukungan kunci sandi paling sedikit, sehingga solusi cadangan (fallback) khusus diperlukan untuk pengguna di platform ini. Memantau kegagalan WebAuthn di sisi klien dan penolakan verifikasi server sebagai aliran terpisah akan membantu mengidentifikasi masalah spesifik OS dalam produksi.
