Kesalahan konfigurasi pada pengaturan server WebAuthn dapat menyebabkan masalah UX dan mengganggu passkeys yang ada. Panduan ini membantu developer untuk menyiapkan server WebAuthn.
Vincent
Created: August 20, 2025
Updated: August 21, 2025
See the original blog version in English here.
Our mission is to make the Internet a safer place, and the new login standard passkeys provides a superior solution to achieve that. That's why we want to help you understand passkeys and its characteristics better.
Passkeys dan protokol yang mendasarinya, WebAuthn, sedang merevolusi lanskap autentikasi. Namun, menyiapkan server WebAuthn dengan benar bisa menjadi pekerjaan yang rumit. Kesalahan konfigurasi tidak hanya dapat menimbulkan kerentanan, tetapi juga merusak passkeys yang sudah ada jika kita perlu mengubahnya nanti. Postingan blog berikut seharusnya membantu kita lebih memahami spesifikasi WebAuthn yang sering kali kompleks dan memberikan saran tentang pengaturan mana yang terbaik untuk kasus penggunaan kita.
Recent Articles
WebAuthn beroperasi dengan tiga entitas utama:
Berikut ini, alur data tingkat tinggi selama proses autentikasi (baik login maupun sign-up) dijelaskan.
Ben Gould
Head of Engineering
I’ve built hundreds of integrations in my time, including quite a few with identity providers and I’ve never been so impressed with a developer experience as I have been with Corbado.
10.000+ developer memercayai Corbado & membuat Internet lebih aman dengan passkeys. Punya pertanyaan? Kami telah menulis 150+ postingan blog tentang passkeys.
Gabung Komunitas PasskeysAlur proses tingkat tinggi yang dijelaskan di atas menggambarkan proses sign-up dan login WebAuthn. Passkeys dibangun di atas WebAuthn. Awalnya, istilah passkeys digunakan sebagai istilah yang lebih mudah diingat dan non-teknis daripada WebAuthn yang menggambarkan hal yang sama. Selain itu, passkeys menyediakan lebih banyak fitur dibandingkan dengan WebAuthn standar, misalnya, kemungkinan untuk menyinkronkan passkeys melalui akun cloud atau manajer kata sandi.
Untuk lebih memahami bagian-bagian berikut, kami mendefinisikan beberapa istilah penting dalam protokol WebAuthn agar memiliki pemahaman yang sama.
Resident keys (RKs) dan non-resident keys (NRKs) adalah dua jenis kunci kriptografis _yang digunakan dalam protokol WebAuthn, dan keduanya berbeda terutama dalam lokasi penyimpanan dan mekanisme pengambilannya.
Definisi:
Resident keys disimpan langsung di dalam authenticator itu sendiri. Ini bisa berupa kunci keamanan (misalnya, YubiKey), secure enclave platform (misalnya, Secure Enclave iPhone), _atau trusted platform module (TPM) di laptop. Conditional UI (passkey autofill) hanya berfungsi untuk resident keys dan kelompok kerja WebAuthn saat ini mensyaratkan resident keys agar dianggap sebagai passkey.
Resident keys sering juga disebut discoverable credentials, karena klien dapat menemukan daftar kunci yang mungkin dari authenticator yang cocok dengan Relying Party ID (rpID) yang bersangkutan dan menampilkan daftar user handle yang mungkin / tersimpan (misalnya, email, nomor telepon, nama pengguna) dari perangkat tersebut.
Pada tangkapan layar berikut, Anda melihat daftar semua resident keys (credential ID, rpID, nama pengguna, nama tampilan) yang disimpan di YubiKey. Non-resident keys tidak ada dalam daftar, karena tidak disimpan di authenticator:
Alur login:
Sumber: William Brown
Selama proses login, Relying Party mengirimkan permintaan tanpa menentukan kredensial ke klien (browser) yang mulai menanyakan authenticator (di sini dalam bagan: kunci keamanan). Authenticator menemukan semua resident keys untuk Relying Party yang sesuai dan klien (browser) memilih resident key yang diinginkan. Resident key ini digunakan untuk menandatangani tantangan. Tanda tangan dikirim dari authenticator melalui klien ke Relying Party.
Kelebihan:
Kekurangan:
Kasus Penggunaan: Ideal untuk perangkat di mana pengguna sering melakukan autentikasi, seperti smartphone atau laptop pribadi.
Definisi:
Non-resident keys, sebaliknya, tidak disimpan di authenticator. Sebaliknya, authenticator menghasilkan pasangan kunci baru (berdasarkan kunci master yang dilindungi secara internal) dan mengirimkan kunci publik dari pasangan kunci baru ini ke server (Relying Party) bersama dengan credential ID (yang berisi seed) selama sign-up. Server kemudian mengaitkan kunci publik ini dengan akun pengguna. Untuk autentikasi selanjutnya, authenticator menurunkan kembali kunci privat dengan menerima credential ID, mengekstrak seed, dan menggabungkannya dengan kunci master. Karena kunci tersebut hanya tersedia sementara di memori yang dilindungi dari authenticator, kadang-kadang disebut kunci fana (ephemeral key) dalam bahasa kriptografi.
Non-resident keys juga sering disebut non-discoverable credentials, karena authenticator tidak dapat menemukan / mencari kunci untuk Relying Party ID (rpID) tertentu. Tanpa credential ID, authenticator bahkan tidak tahu bahwa mungkin ada sebuah kunci.
Alur login:
Sumber: William Brown
Selama proses login, Relying Party pertama-tama harus mengidentifikasi pengguna mana yang meminta autentikasi (misalnya, dengan meminta user handle, contohnya email, nomor telepon, atau nama pengguna) dan kemudian mengirimkan credential ID yang diketahuinya untuk pengguna yang meminta ke klien (browser). Klien meneruskannya ke authenticator (di sini: kunci keamanan). Authenticator menggunakan credential ID bersama dengan kunci master authenticator untuk menurunkan kunci privat sementara, menandatangani tantangan dengan kunci yang dihasilkan dan mengembalikannya ke klien (di sini: browser), yang meneruskannya ke Relying Party. Non-resident keys awalnya digunakan sebagai faktor kedua sebelum pengenalan passkeys. Oleh karena itu, mengidentifikasi pengguna terlebih dahulu adalah bagian dari proses login biasa.
Kelebihan:
Kekurangan:
Kasus Penggunaan: Ideal untuk authenticator roaming seperti kunci keamanan (misalnya, YubiKeys) yang digunakan di berbagai layanan atau platform.
Bayangkan Anda memiliki kunci keamanan (misalnya, YubiKey), dan Anda mendaftarkannya dengan dua layanan online: Layanan A dan Layanan B. Untuk Layanan A, Anda menggunakan resident key. Untuk Layanan B, non-resident key. Ketika Anda mengautentikasi ke Layanan A, Anda cukup mengetuk kunci keamanan Anda (misalnya, YubiKey), dan Anda masuk - tidak perlu menyebutkan nama pengguna. Untuk Layanan B, Anda pertama-tama akan memberikan nama pengguna Anda di browser / aplikasi native. Layanan tersebut kemudian mengirimkan credential ID yang terkait ke kunci keamanan Anda (misalnya, YubiKey), yang kemudian menghasilkan kembali kunci privat fana untuk autentikasi.
Intinya, sementara resident dan non-resident keys meningkatkan keamanan dengan memanfaatkan autentikasi kriptografis, pengalaman pengguna dan mekanisme penyimpanannya berbeda, melayani berbagai kasus penggunaan.
Conditional UI adalah fitur tonggak sejarah dari passkeys / WebAuthn. Ini mengambil lebih banyak beban dari pengguna, karena pengguna tidak hanya tidak perlu mengingat kata sandi, tetapi juga tidak perlu mengingat user handle (misalnya, email, nomor telepon, nama pengguna) yang digunakannya untuk mendaftar ke Relying Party. Terutama, dalam kasus di mana layanan Relying Party hanya sesekali digunakan, ini adalah langkah besar.
Ini berfungsi karena begitu halaman login dibuka, server Relying Party mengirimkan tantangan di latar belakang ke klien (ingat tidak ada credential ID yang perlu dikirim dalam panggilan ini). Klien mengambil tantangan ini dan memeriksa passkeys mana yang cocok dengan Relying Party ID pada authenticator ini dan menawarkan pilihan melalui menu autofill, di mana pengguna dapat memilih passkey yang sesuai.
Selain itu, ini juga menghemat pengguna dari klik ekstra pada tombol login, karena begitu passkey dipilih dari menu autofill, proses login dimulai.
Conditional UI (passkeys autofill) hanya berfungsi untuk resident keys.
CTAP adalah protokol dasar dalam standar FIDO2 , menjembatani kesenjangan komunikasi antara klien (seperti browser) dan authenticator (seperti kunci keamanan, misalnya, YubiKeys, atau smartphone). Untuk lebih memahami CTAP, mari kita lihat sekilas versi protokol yang berbeda sebelum menganalisis dampaknya pada resident dan non-resident keys.
Versi sebelumnya, sering disebut sebagai Universal 2nd Factor (U2F), terutama dirancang untuk autentikasi faktor kedua. Dalam U2F, server memberikan tantangan, dan authenticator memberikan respons, membuktikan kepemilikan kunci privat. Namun, U2F tidak mendukung resident keys, yang berarti selalu memerlukan pencarian sisi server untuk mengidentifikasi kunci mana yang akan digunakan untuk seorang pengguna, karena ini adalah bagian dari proses ketika meminta faktor kedua.
Sebagai penerus U2F, CTAP2 memperkenalkan dukungan untuk resident keys, memungkinkan autentikasi tanpa kata sandi dan tanpa nama pengguna. Dengan resident keys, authenticator menyimpan nama pengguna dan credential ID pengguna (bersama dengan Relying Party ID), menghilangkan kebutuhan bagi server Relying Party untuk menyediakannya selama autentikasi. Ini adalah lompatan signifikan menuju UX yang lebih mulus.
Namun, CTAP2 datang dengan tantangan. Salah satu masalah penting adalah pengelolaan resident keys. Misalnya, menghapus resident key tertentu di perangkat CTAP2.0 seringkali memerlukan reset perangkat lengkap (sehingga kunci master Anda juga direset, yang berarti semua non-resident keys Anda juga tidak akan berfungsi lagi), yang tidak ramah pengguna dan dapat menjadi masalah dalam skenario di mana beberapa resident keys disimpan pada satu perangkat. Ini membuat resident keys pada perangkat CTAP2.0 menjadi komitmen yang serius. Anda benar-benar tidak ingin secara tidak sengaja mengisi ruang terbatas yang sering Anda miliki, terutama pada kunci keamanan (misalnya, YubiKeys).
CTAP2.1 adalah versi selanjutnya dari CTAP2, membawa fitur tambahan dan perbaikan pada protokol. Beberapa poin kunci tentang CTAP 2.1 meliputi:
Setelah melihat resident keys, non-resident keys, dan berbagai versi CTAP, sekarang kita akan menganalisis sisi Relying Party dan dengan demikian sisi server WebAuthn secara lebih mendalam.
Fleksibilitas (tetapi juga kompleksitas) WebAuthn sebagian besar disebabkan oleh pengaturan servernya, terutama di dalam objek authenticatorSelection. Objek ini memandu klien dalam memilih authenticator yang tepat untuk tugas tersebut.
{ "rp": { "name": "corbado.com", "id": "corbado.com" }, "user": { "id": "dGVzdefEyMjE", "name": "test-username", "displayName": "test-username" }, "challenge": "mhanjsapJjCNaN_Ttasdfk1C0DymR-V_w_0UVOPsdfdfJG2ON_FK5-ODtqp33443tgqHzuuDjv-NUUmMAE4hg", "pubKeyCredParams": [ { "type": "public-key", "alg": -7 }, { "type": "public-key", "alg": -257 } ], "timeout": 60000, "excludeCredentials": [], "authenticatorSelection": { "authenticatorAttachment": "platform", "residentKey": "preferred", "requireResidentKey": false, "userVerification": "preferred" }, "attestation": "none", "extensions": { "credProps": true } }
Opsi server ini menentukan bagaimana authenticator terpasang pada perangkat klien. Ini memberikan wawasan tentang bagaimana authenticator berkomunikasi dengan klien:
Nilai yang Mungkin
Kasus Penggunaan & Contoh
Dalam spesifikasi WebAuthn Level 1, opsi server ini disebut requireResidentKey dan dapat berisi nilai Boolean true (authenticator harus membuat resident key) atau false (authenticator harus membuat non-resident key). WebAuthn Level 2 menggantikan opsi server ini dengan opsi server baru residentKey:
Nilai yang Mungkin
Kasus Penggunaan & Contoh
Verifikasi pengguna mengacu pada proses yang memastikan orang yang berinteraksi dengan authenticator adalah pemilik yang sah, biasanya dengan mewajibkan gerakan autentikasi tertentu seperti memasukkan PIN, memberikan sidik jari, atau menggunakan pengenalan wajah.
Terkadang kehadiran pengguna (UP) juga disebutkan atau digunakan mirip dengan verifikasi pengguna tetapi memang memiliki beberapa perbedaan. Kehadiran pengguna hanya mengonfirmasi bahwa seseorang—siapa pun— hadir secara fisik dan berinteraksi dengan perangkat. Ini tidak memverifikasi identitas orang tersebut. Sentuhan sederhana pada kunci keamanan, tanpa pemeriksaan identitas lebih lanjut, dapat mencukupi untuk kehadiran pengguna. Untuk passkeys / WebAuthn, pengguna selalu harus hadir.
Nilai yang Mungkin
Kasus Penggunaan & Contoh
Pola
Contoh: Sebuah aplikasi perusahaan ingin karyawan login tanpa kata sandi di laptop yang dikeluarkan perusahaan menggunakan pembaca sidik jari bawaan. Kredensial disimpan di perangkat, dan pengguna harus memverifikasi dengan sidik jari setiap kali.
Pola
Contoh: Seorang pengguna mendaftarkan kunci keamanan (misalnya, YubiKey) untuk perbankan online mereka. Mereka dapat menggunakan kunci ini untuk mengautentikasi di perangkat apa pun dengan menyediakan kunci keamanan (misalnya, YubiKey), tanpa perlu memasukkan nama pengguna.
Banyak kunci keamanan berbasis perangkat keras (misalnya, YubiKeys) memiliki batasan penyimpanan yang melekat. Batasan ini disebabkan oleh memori fisik yang tersedia di perangkat dan pertimbangan desain dari produsen.
Contoh: Sebuah YubiKey mungkin memiliki kapasitas untuk menyimpan hanya 20 resident keys. Setelah batas ini tercapai, tidak ada resident key tambahan yang dapat ditambahkan tanpa menghapus yang sudah ada.
Solusi:
Authenticator yang berbeda mungkin menangani permintaan resident key secara berbeda. Beberapa mungkin secara default membuat resident key meskipun tidak diminta secara eksplisit, sementara yang lain mungkin memerlukan instruksi eksplisit.
Perilaku yang tidak konsisten untuk opsi server WebAuthn yang berbeda pada platform yang berbeda adalah masalah utama. Misalnya, iOS akan selalu membuat resident key terlepas dari opsi server WebAuthn yang diteruskan, sementara Android memerlukan persetujuan (misalnya, dengan residentKey: preferred atau residentKey: required).
Selain perilaku, yang lebih buruk adalah bahwa berdasarkan data yang disimpan di sisi server, Anda tidak dapat mengatakan dengan kepastian 100% apakah kredensial yang disimpan adalah resident key atau non-resident key. Sebaliknya, Anda dapat mengikuti beberapa pemeriksaan dan mempersempitnya (lihat di bawah), tetapi masih perlu berharap bahwa perilaku kredensial sesuai dengan keyakinan Anda.
Alasannya adalah bahwa ada saran WebAuthn untuk menyimpan informasi tentang jenis kredensial (resident key atau non-resident key) dalam ekstensi properti kredensial (clientExtensionResults.credProps.rk yang bernilai true atau false). Namun, memberikan informasi ini ke RP tidak dijamin karena semua ekstensi WebAuthn bersifat opsional, misalnya, iOS tidak mengirimkannya (sehingga Anda tidak tahu apakah itu resident key atau non-resident key).
Selama penelitian kami, kami mencoba menguji perilaku pada platform dan authenticator yang berbeda (Windows 10, Windows 11, Android 7, Android 13, iOS17, macOS Ventura, YubiKey) dengan dua halaman demo WebAuthn yang memberikan detail lebih lanjut tentang kredensial yang dibuat: https://webauthn.io dan https://webauthntest.identitystandards.io/. Yang terakhir menawarkan kemungkinan untuk bekerja dengan properti requireResidentKey warisan (WebAuthn Level 1) dan bahkan menggabungkannya dengan properti residentKey (WebAuthn Level 2). Namun, hasilnya tidak dapat diandalkan (misalnya, dinyatakan non-resident key untuk iOS tetapi jelas conditional UI berfungsi).
Skema pemeriksaan yang paling dapat dipercaya yang kami temukan adalah sebagai berikut:
Seperti yang Anda lihat, ini membantu mempersempitnya, namun opsi tidak diketahui tetap ada dan Anda tidak dapat menentukan jenis kunci dengan kepastian 100%.
Ini juga sejalan dengan temuan William Brown dari SUSE dalam artikel hebatnya yang menguraikan bagaimana kunci keamanan (misalnya, YubiKeys) bisa menjadi tidak berguna jika resident keys disyaratkan oleh Relying Parties (kami memperluas tabelnya):
Dalam tabel, Anda melihat untuk opsi resident key server WebAuthn yang berbeda apakah resident key dibuat (true), apakah non-resident key dibuat (false), atau sesuatu yang lain terjadi.
Solusi:
Jika pengguna mencapai batas penyimpanan pada kunci keamanan mereka (misalnya, YubiKey), mereka mungkin menghadapi kesalahan atau tidak dapat mendaftarkan kredensial baru. Hal ini dapat menyebabkan kebingungan dan frustrasi.
Solusi:
Seperti yang telah Anda lihat di atas, pengaturan server WebAuthn yang Anda pilih dapat secara signifikan memengaruhi pengalaman pengguna dan keamanan proses autentikasi Anda. Sangat penting untuk memahami nuansa pengaturan ini untuk membuat keputusan yang tepat.
Resident vs. Non-resident Keys: Jika sebagian besar pengguna Anda terutama mengakses layanan Anda dari perangkat pribadi seperti smartphone atau laptop, resident keys adalah pilihan yang cocok. Resident keys disimpan di perangkat itu sendiri dan menawarkan pengalaman autentikasi yang mulus bagi pengguna yang sering menggunakan perangkat yang sama. Namun, bagi pengguna yang menggunakan kunci keamanan (misalnya, YubiKeys), non-resident keys mungkin lebih sesuai.
Pengaturan Verifikasi Pengguna (UV): Bergantung pada tingkat keamanan yang ingin Anda capai, Anda dapat memutuskan seberapa ketat proses verifikasi pengguna seharusnya. Jika Anda mengincar keamanan tinggi, memerlukan PIN, sidik jari, atau pengenalan wajah (userVerification: preferred atau userVerification: required) adalah tindakan yang disarankan.
Attestation dan Kepercayaan: Attestation memungkinkan Anda untuk memverifikasi asal dan integritas authenticator. Putuskan apakah Anda ingin mempercayai semua authenticator atau hanya yang berasal dari produsen tertentu. Ini bisa menjadi sangat penting jika Anda berurusan dengan data sensitif dan ingin memastikan bahwa hanya authenticator berkualitas tinggi dan tepercaya yang digunakan.
Mekanisme Fallback: Selalu siapkan mekanisme fallback. Jika pengguna kehilangan authenticator mereka atau jika terjadi malfungsi, mereka harus memiliki cara alternatif untuk mengakses akun mereka. Ini bisa melalui kode cadangan, verifikasi SMS, tautan ajaib email, atau metode autentikasi multifaktor lainnya.
Edukasi Berkelanjutan: Lanskap passkeys dan WebAuthn terus berkembang. Tetap update dengan perkembangan terbaru, kerentanan, dan perbaikan. Dorong tim pengembangan Anda untuk berpartisipasi dalam lokakarya, webinar, dan konferensi terkait passkeys dan WebAuthn.
Onboarding dan Edukasi Pengguna: Saat memperkenalkan autentikasi passkey, pastikan pengguna Anda memahami manfaatnya dan cara kerjanya. Tawarkan instruksi yang jelas selama proses pendaftaran dan sediakan sumber daya (seperti FAQ atau tutorial video) untuk membantu pengguna dalam menyiapkan dan menggunakan passkeys.
Dengan mematuhi praktik terbaik ini, developer dan manajer produk dapat memastikan bahwa mereka menerapkan autentikasi passkey secara efektif, menyeimbangkan keamanan dan pengalaman pengguna.
Jika Anda ingin mengimplementasikan passkeys untuk adopsi massal di situs web atau aplikasi Anda dan tidak perlu mendukung kunci keamanan (misalnya, YubiKeys), karena sebagian besar pengguna Anda hanya akan menggunakan smartphone atau laptop mereka, kami merekomendasikan pengaturan berikut.
Manfaat:
Pengaturan server WebAuthn, meskipun kompleks, menawarkan kerangka kerja yang kuat dan fleksibel untuk autentikasi. Menguasai pengaturan ini sangat penting, karena ini bukan hanya tentang mengimplementasikan standar baru; ini tentang memperbaiki keamanan dan efisiensi autentikasi pengguna secara fundamental.
Intinya, memahami pengaturan server WebAuthn adalah investasi dalam membangun aplikasi yang lebih aman, efisien, dan berwawasan ke depan. Seiring berkembangnya lanskap digital, menguasai teknologi semacam itu akan menjadi sangat diperlukan. Untuk tetap update, bergabunglah dengan komunitas passkeys kami atau berlangganan buletin kami di bawah ini.
Related Articles
Table of Contents