Dokumen ini membahas apa yang dimaksud dengan userVerification
di WebAuthn, dan perilaku browser yang terjadi saat userVerification
ditentukan selama pembuatan atau autentikasi kunci sandi.
Apa yang dimaksud dengan "verifikasi pengguna" di WebAuthn?
Kunci sandi dibuat berdasarkan kriptografi kunci publik. Dengan membuat kunci sandi, pasangan kunci pribadi publik akan dibuat, kunci pribadi disimpan oleh penyedia kunci sandi, dan kunci publik ditampilkan ke server pihak tepercaya (RP) untuk disimpan. Server dapat mengautentikasi pengguna dengan memverifikasi tanda tangan yang ditandatangani oleh kunci sandi yang sama menggunakan kunci publik yang disambungkan. "Presentasi pengguna" Flag (UP) pada kredensial kunci publik membuktikan bahwa seseorang berinteraksi dengan perangkat selama autentikasi.
Verifikasi pengguna adalah lapisan keamanan opsional yang berupaya menegaskan bahwa orang yang tepat hadir selama autentikasi, bukan hanya beberapa orang, seperti yang ditegaskan oleh kehadiran pengguna. Di smartphone, hal ini biasanya dilakukan dengan menggunakan mekanisme kunci layar, baik itu berupa biometrik maupun PIN atau sandi. Apakah verifikasi pengguna telah dilakukan dilaporkan di "UV" flag yang ditampilkan di data pengautentikasi selama pendaftaran dan autentikasi kunci sandi
Cara UP dan UV divalidasi di server
Tanda boolean keberadaan pengguna (UP) dan yang diverifikasi pengguna (UV) akan ditandai ke server di kolom data pengautentikasi. Selama autentikasi, konten kolom data pengautentikasi dapat divalidasi dengan memverifikasi tanda tangan menggunakan kunci publik yang disimpan. Selama tanda tangan valid, server dapat menganggap tanda tersebut asli.
Saat pendaftaran dan autentikasi kunci sandi, server harus memeriksa apakah tanda UP adalah true
, dan apakah tanda UV adalah true
atau false
, bergantung pada persyaratannya.
Menentukan parameter userVerification
Berdasarkan spesifikasi WebAuthn, RP dapat meminta verifikasi pengguna dengan parameter userVerification
pada pembuatan dan pernyataan kredensial. Class ini menerima 'preferred'
, 'required'
, atau 'discouraged'
yang masing-masing berarti:
'preferred'
(default): Menggunakan metode verifikasi pengguna di perangkat lebih disarankan, tetapi dapat dilewati jika tidak tersedia. Kredensial respons berisi nilai flag UVtrue
jika verifikasi pengguna dilakukan, danfalse
jika UV tidak dilakukan.'required'
: Memerlukan metode verifikasi pengguna yang tersedia di perangkat. Jika tidak tersedia, permintaan akan gagal secara lokal. Ini berarti kredensial respons selalu ditampilkan dengan tanda UV yang disetel ketrue
.'discouraged'
: Menggunakan metode verifikasi pengguna tidak disarankan. Namun, bergantung pada perangkatnya, verifikasi pengguna mungkin tetap dilakukan, dan tanda UV dapat berisitrue
ataufalse
.
Kode contoh untuk pembuatan kunci sandi:
const publicKeyCredentialCreationOptions = {
// ...
authenticatorSelection: {
authenticatorAttachment: 'platform',
residentKey: 'required',
requireResidentKey: true,
userVerification: 'preferred'
}
};
const credential = await navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions
});
Kode contoh untuk autentikasi kunci sandi:
const publicKeyCredentialRequestOptions = {
challenge: /* Omitted challenge data... */,
rpId: 'example.com',
userVerification: 'preferred'
};
const credential = await navigator.credentials.get({
publicKey: publicKeyCredentialRequestOptions
});
Opsi mana yang harus Anda pilih untuk userVerification
?
Nilai userVerification
yang harus Anda gunakan bergantung pada persyaratan aplikasi, serta kebutuhan pengalaman pengguna Anda.
Kapan menggunakan userVerification='preferred'
Gunakan userVerification='preferred'
jika Anda lebih memprioritaskan pengalaman pengguna daripada perlindungan.
Ada lingkungan di mana verifikasi pengguna lebih menyulitkan daripada perlindungan. Misalnya, di macOS yang tidak memiliki Touch ID (karena perangkat tidak mendukungnya, dinonaktifkan, atau perangkat dalam mode konvensional), pengguna akan diminta untuk memasukkan sandi sistemnya. Hal ini menyebabkan hambatan, dan pengguna dapat meninggalkan autentikasi sepenuhnya. Jika menghilangkan hambatan lebih penting bagi Anda, gunakan userVerification='preferred'
.
Dengan userVerification='preferred'
, tanda UV adalah true
jika verifikasi pengguna berhasil dilakukan, dan false
jika verifikasi pengguna dilewati. Misalnya, di macOS yang tidak memiliki Touch ID, fitur ini akan meminta pengguna mengklik tombol untuk melewati verifikasi pengguna, dan kredensial kunci publik menyertakan flag UV false
.
Penanda UV kemudian dapat menjadi sinyal dalam analisis risiko Anda. Jika upaya login tampak berisiko karena faktor lain, sebaiknya berikan verifikasi login tambahan kepada pengguna jika verifikasi pengguna tidak dilakukan.
Kapan menggunakan userVerification='required'
Gunakan userVerification='required'
jika menurut Anda UP dan UV benar-benar diperlukan.
Kelemahan opsi ini adalah pengguna mungkin mengalami lebih banyak hambatan saat login. Misalnya, di macOS yang tidak memiliki Touch ID, pengguna akan diminta untuk memasukkan sandi sistemnya.
Dengan userVerification='required'
, Anda dapat memastikan bahwa verifikasi pengguna dilakukan di perangkat. Pastikan server memverifikasi bahwa tanda UV adalah true
.
Kesimpulan
Dengan memanfaatkan verifikasi pengguna, pihak yang mengandalkan kunci sandi dapat mengukur kemungkinan pemilik perangkat login. Pilihan mereka menentukan apakah akan mewajibkan verifikasi pengguna, atau menjadikannya opsional, bergantung pada seberapa penting mekanisme login penggantian terhadap alur penggunaan. Pastikan server memeriksa flag UP dan UV untuk autentikasi pengguna kunci sandi.