Artikel ini menjelaskan cara mengimplementasikan passkey di aplikasi native (iOS + Android). Anda akan mempelajari jenis WebView mana yang direkomendasikan untuk autentikasi passkey.

Vincent
Created: June 20, 2025
Updated: November 13, 2025

Passkeys Series: Native Apps
See the original blog version in English here.
60-page Enterprise Passkey Whitepaper:
Learn how leaders get +80% passkey adoption. Trusted by Rakuten, Klarna & Oracle
| Pendekatan | Adopsi | Membuat Passkey | Menggunakan Passkey | Mengelola Passkey | Kompleksitas Teknis | Dukungan OAuth |
|---|---|---|---|---|---|---|
| Implementasi Native | 🟢🟢🟢 | Adopsi tinggi, UX terbaik, biometrik mulus | Autentikasi instan dan senyap | Kontrol native penuh | Sedang-Tinggi | Memerlukan alur terpisah |
| System WebView | 🟢🟢 | Adopsi baik, pengalaman seperti browser | UX browser standar, keychain bersama | Manajemen berbasis browser | Rendah | Sangat baik |
| Embedded WebView | 🟢 | Adopsi lebih rendah, perlu lebih banyak penyiapan | Dukungan native iOS & Android (WebKit 1.12.1+), tanpa Conditional UI | Kontrol terbatas | Sedang-Tinggi | T/A |
Catatan: System dan Embedded WebView sering digabungkan di mana System WebView menangani login (dengan pembagian kredensial otomatis), kemudian Embedded WebView merender manajemen passkey di pengaturan.
Faktor Keputusan Utama:
Platform seluler modern menyediakan tiga pendekatan berbeda untuk mengintegrasikan passkey ke dalam aplikasi native Anda, masing-masing dengan pertimbangan berbeda untuk pengalaman pengguna, kompleksitas teknis, dan kompatibilitas OAuth:
Implementasi Native: Membangun alur passkey langsung ke dalam aplikasi Anda menggunakan API platform (iOS AuthenticationServices, Android Credential Manager). Memberikan pengalaman pengguna terbaik dengan autentikasi biometrik yang mulus, tetapi memerlukan upaya implementasi teknis sedang hingga tinggi.
System WebView: Menggunakan komponen browser platform (iOS ASWebAuthenticationSession / SFSafariViewController, Android Chrome Custom Tabs) untuk menangani autentikasi. Sangat baik untuk alur login berbasis OAuth dan berbagi kredensial dengan browser sistem.
Embedded WebView: Menyematkan web view yang dapat disesuaikan (iOS WKWebView, Android WebView) di dalam aplikasi Anda untuk menggunakan kembali autentikasi web dengan kerangka aplikasi native. Memberikan tampilan seperti native tanpa bilah URL dan kontrol penuh atas UI web view. Memerlukan penyiapan tambahan termasuk izin dan entitlement (iOS), dan konfigurasi WebView dengan AndroidX WebKit 1.12.1+ (Android) untuk mengaktifkan fungsionalitas passkey.
Pilihan yang tepat tergantung pada arsitektur autentikasi aplikasi Anda, apakah Anda menggunakan penyedia OAuth, seberapa besar kontrol yang Anda butuhkan atas UI, dan apakah Anda membangun aplikasi yang mengutamakan native atau menggunakan kembali komponen web.
Implementasi passkey native memberikan pengalaman pengguna yang optimal, dengan alur autentikasi yang dibangun langsung ke dalam UI aplikasi Anda menggunakan API spesifik platform. Pengguna mendapat manfaat dari dialog native platform, verifikasi biometrik yang mulus, dan waktu login tercepat.
Kapan memilih Implementasi Native:
preferImmediatelyAvailableCredentials untuk secara otomatis menampilkan overlay
passkey saat passkey tersedia, memberikan pengalaman login tercepat tanpa perlu
memasukkan pengenalKeuntungan Utama: preferImmediatelyAvailableCredentials()
Implementasi native dapat memanfaatkan preferImmediatelyAvailableCredentials() untuk
membuat overlay passkey otomatis yang muncul segera saat aplikasi dimulai ketika passkey
tersedia. Alur tanpa nama pengguna ini memberikan pengalaman login tercepat—pengguna
melihat passkey mereka secara instan tanpa memasukkan pengenal terlebih dahulu. Kemampuan
ini eksklusif untuk implementasi native dan tidak tersedia dalam varian WebView.
Sementara implementasi WebView dapat menggunakan Conditional UI (saran passkey di kolom input), overlay otomatis dari implementasi native memberikan UX yang superior dengan tingkat penggunaan passkey yang lebih tinggi karena autentikasi dimulai segera setelah aplikasi diluncurkan.
Gambaran Persyaratan Teknis:
Integrasi passkey native memerlukan kepercayaan kriptografis antara aplikasi Anda dan domain web. Tanpa itu, OS akan menolak semua operasi WebAuthn. Persyaratan utama:
/.well-known/Manfaat utamanya: passkey yang dibuat di situs web Anda berfungsi mulus di aplikasi Anda dan sebaliknya.
Mengimplementasikan passkey secara native di iOS melibatkan kerangka AuthenticationServices Apple, yang menyediakan API untuk operasi WebAuthn:
Komponen Utama:
ASAuthorizationController: Mengelola alur autentikasiASAuthorizationPlatformPublicKeyCredentialProvider: Membuat permintaan passkeyTips Pengembangan
?mode=developer ke URL AASA Anda untuk memaksa pengambilan ulang
data baruImplementasi passkey native Android menggunakan Credential Manager API (atau API FIDO2 yang lebih lama untuk kompatibilitas mundur):
Komponen Utama:
CredentialManager: API pusat untuk semua operasi kredensialCreatePublicKeyCredentialRequest: Untuk registrasi passkeyGetCredentialRequest: Untuk
autentikasi passkeyCatatan: Android saat ini tidak memiliki saran keyboard Conditional UI seperti iOS di aplikasi native (meskipun Conditional UI berfungsi di aplikasi web)
Mengimplementasikan passkey secara native memiliki tantangan dan pelajaran penting: Mengintegrasikan di tingkat OS dapat memunculkan masalah di berbagai perangkat dan versi OS.
Meski Anda dapat mengimplementasikan passkey menggunakan API platform mentah, SDK yang dibuat khusus secara signifikan mempercepat pengembangan dengan menangani kompleksitas WebAuthn, kasus-kasus khusus, dan menyediakan telemetri bawaan. SDK juga menawarkan antarmuka yang dapat di-mock untuk pengujian unit (penting karena Anda tidak dapat menguji biometrik di simulator).
Rekomendasi: Untuk implementasi native, kami merekomendasikan penggunaan SDK Corbado (SDK Passkey iOS Swift, SDK Passkey Android Kotlin) yang menangani banyak kasus khusus yang ditemukan melalui penerapan produksi, menyediakan telemetri dan pengujian tambahan.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
Corbado proved to be a trusted partner. Their hands-on, 24/7 support and on-site assistance enabled a seamless integration into VicRoads' complex systems, offering passkeys to 5 million users.
Passkey yang diadopsi jutaan orang, dengan cepat. Mulai dengan Platform Adopsi Corbado.
Mulai Uji Coba GratisSystem WebView menggunakan komponen browser native platform untuk menangani autentikasi di dalam aplikasi Anda. Berbeda dari implementasi yang sepenuhnya native, System WebView menampilkan konten web menggunakan browser sistem yang sebenarnya (Safari di iOS, Chrome di Android), mempertahankan cookie bersama, kredensial tersimpan, dan indikator keamanan browser yang sudah dikenal.
Kapan memilih System WebView:
Keuntungan Utama:
Komponen Platform:
ASWebAuthenticationSession (direkomendasikan untuk alur autentikasi) atau
SFSafariViewController (penjelajahan umum)Perusahaan besar seperti Google dan GitHub mengadopsi pendekatan ini untuk menambahkan login passkey ke aplikasi seluler mereka melalui overlay WebView pada halaman autentikasi web yang ada. Ini berfungsi dengan baik ketika pembuatan ulang autentikasi yang sepenuhnya native tidak dapat segera dilakukan.
iOS menyediakan dua komponen System WebView utama untuk autentikasi:
ASWebAuthenticationSession (Direkomendasikan untuk Autentikasi):
SFSafariViewController (Penjelajahan Umum):
| Fitur | ASWebAuthenticationSession | SFSafariViewController |
|---|---|---|
| Kasus Penggunaan Utama | Alur autentikasi | Penjelajahan web umum |
| OAuth/OIDC | Sangat baik | Baik |
| Dukungan Passkey | Ya | Ya |
| Kustomisasi | Terbatas | Minimal |
Jika aplikasi Anda menggunakan login berbasis OAuth, ASWebAuthenticationSession
adalah pilihan yang direkomendasikan karena dirancang khusus untuk skenario autentikasi
dan memberikan keseimbangan terbaik antara
keamanan dan pengalaman pengguna.
Chrome Custom Tabs (CCT) menyediakan pengalaman autentikasi yang didukung Chrome di dalam aplikasi Anda:
Fitur Utama:
Integrasi OAuth: Chrome Custom Tabs adalah padanan Android dari iOS ASWebAuthenticationSession, memberikan dukungan OAuth yang sangat baik sambil mempertahankan akses ke passkey yang tersimpan.
Embedded WebView memberikan kontrol penuh atas rendering konten web di dalam aplikasi Anda, memungkinkan manipulasi langsung cookie, sesi, dan navigasi tanpa bilah URL. Namun, kontrol ini disertai dengan persyaratan teknis tambahan untuk mengaktifkan fungsionalitas passkey.
Kapan memilih Embedded WebView:
Konteks Penting:
Banyak aplikasi menggunakan pendekatan hibrida: System WebView menangani autentikasi OAuth awal (di mana passkey berfungsi mulus), lalu beralih ke Embedded WebView untuk pasca-autentikasi guna mengelola passkey di pengaturan. Tantangan muncul saat mencoba menggunakan passkey langsung di dalam Embedded WebView.
Persyaratan Teknis:
Embedded WebView memerlukan penyiapan tambahan dibandingkan dengan System WebView:
Komponen Platform:
WKWebViewandroid.webkit.WebViewPertimbangan:
Saat mengimplementasikan passkey melalui WebView, memahami perbedaan antara System WebView dan Embedded WebView sangat penting. Tiga pendekatan yang diuraikan di atas (Implementasi Native, System WebView, dan Embedded WebView) masing-masing melayani kasus penggunaan yang berbeda.
Di iOS, Anda memiliki beberapa opsi untuk menampilkan konten web di dalam aplikasi:
Di Android, pilihan utamanya adalah:
android.webkit.WebView), yang pada
dasarnya adalah browser mini yang dapat disematkan di aktivitas Anda. Ini sangat dapat
disesuaikan tetapi berjalan dalam proses aplikasi Anda.Di bagian berikut, kita akan membahas lebih dalam tentang jenis-jenis WebView ini untuk iOS dan Android, dan mendiskusikan mana yang mungkin paling cocok untuk alur autentikasi passkey.
Platform Apple menyediakan tiga opsi WebView yang tercantum di atas. Pilihan Anda akan memengaruhi seberapa lancar passkey dapat digunakan di dalam aplikasi:
Untuk menguji perilaku WebView yang berbeda di iOS, kami merekomendasikan aplikasi WebView - WKWebView and UIWebView rendering.
WKWebView adalah komponen WebView serbaguna untuk iOS. Pengembang dapat menyematkan WKWebView untuk merender konten web dengan tingkat kontrol yang tinggi atas UI dan perilaku. WKWebView menggunakan mesin rendering yang sama dengan Safari, jadi sangat berkinerja dan mendukung fitur web modern. Secara teori, WKWebView dapat menangani WebAuthn (dan dengan demikian passkey) jika dikonfigurasi dengan benar, tetapi perlu dicatat bahwa beberapa fitur browser canggih mungkin dibatasi untuk keamanan. Satu hal yang perlu diperhatikan adalah bahwa WKWebView secara default tidak berbagi cookie atau data keychain dengan Mobile Safari. Pengguna mungkin harus login kembali karena sesi WebView mereka terisolasi dari sesi Safari. Juga, karena konten WKWebView dapat sepenuhnya disesuaikan oleh aplikasi, pengguna tidak melihat bilah alamat atau UI Safari – yang bagus untuk branding, tetapi itu berarti pengguna memiliki lebih sedikit petunjuk untuk memverifikasi keabsahan halaman (kekhawatiran untuk anti-phishing). Beberapa aplikasi bahkan telah menyalahgunakan WKWebView untuk menyuntikkan skrip atau mengubah konten (misalnya, TikTok tercatat menyuntikkan JS pelacakan melalui browser dalam aplikasinya), jadi orang harus berhati-hati menggunakan WKWebView dengan cara yang aman dan dapat dipercaya oleh pengguna.
SFSafariViewController menyediakan pengalaman Safari di dalam aplikasi. Saat Anda membuka URL dengan SFSafariViewController, hampir seperti membukanya di browser Safari asli, kecuali pengguna tetap berada di dalam UI aplikasi Anda. Keuntungannya untuk passkey sangat signifikan: karena ini pada dasarnya adalah Safari, iCloud Keychain dan passkey tersimpan milik pengguna dapat diakses. Perhatikan bahwa cookie tidak dibagikan di iOS 11+. Ini berarti jika pengguna sudah memiliki passkey untuk situs Anda, Safari dapat menemukannya dan bahkan menampilkan Conditional UI untuk login yang mudah. SFSafariViewController kurang dapat disesuaikan (Anda tidak dapat banyak mengubah bilah alatnya), tetapi ia secara otomatis menangani banyak fitur keamanan dan privasi. Bilah URL ditampilkan, lengkap dengan ikon gembok untuk HTTPS, yang memberi pengguna keyakinan bahwa mereka berada di domain yang benar. Secara umum, SFSafariViewController dianggap lebih aman daripada WKWebView mentah dan lebih sederhana untuk diimplementasikan (Apple menyediakannya sebagai komponen siap pakai). Pertimbangan utamanya adalah Anda mengorbankan sebagian kontrol atas tampilan & nuansa. Untuk alur autentikasi, itu biasanya dapat diterima. Prioritas di sini adalah keamanan dan kemudahan login, di mana SFSafariViewController unggul dengan menggunakan konteks Safari.
| WKWebView | SFSafariViewController | |
|---|---|---|
| Pengalaman pengguna | - Terasa seperti native: Pengguna mungkin merasa bahwa konten web adalah bagian native dari aplikasi karena pengembang dapat menyesuaikan tampilan dan nuansa agar sesuai dengan desain aplikasi. - Isi Otomatis: Isi otomatis dengan data dari Safari dimungkinkan | - Mulus: Pengalaman pengguna yang mulus menggunakan pengaturan Safari pengguna memastikan penjelajahan web yang konsisten antara aplikasi native dan browser. |
| Pengalaman pengembang | - Sangat dapat disesuaikan: Kustomisasi dan konfigurasi yang luas tersedia - Fleksibel: Banyak API untuk berinteraksi dengan konten web | - Kustomisasi sedang: Opsi kustomisasi terbatas, terutama dibandingkan dengan WKWebView, - Sederhana: Lebih sederhana untuk diimplementasikan dibandingkan dengan WKWebView |
| Kinerja | - Cukup lambat: Tergantung pada implementasi dan konten web, kecepatan pemuatan dapat dioptimalkan, tetapi mungkin masih lebih lambat dibandingkan dengan SFSafariViewController karena pemrosesan tambahan dari fitur dan interaksi kustom. | - Cukup cepat: Biasanya menawarkan kinerja yang lebih baik karena memanfaatkan mesin Safari, yang dioptimalkan untuk kecepatan dan efisiensi, memberikan waktu muat yang cepat untuk halaman web. |
| Kepercayaan dan pengenalan | - Tampilan URL tidak wajib: WKWebView seringkali tidak menampilkan URL, sehingga lebih sulit bagi pengguna untuk memverifikasi halaman web. Potensi aplikasi berbahaya untuk meniru perilaku ini dan melakukan phising kredensial. | - Pengalaman Seperti Browser: Merender halaman web menggunakan Safari, memberikan pengalaman "seperti browser". Pengguna dapat melihat URL dan mengakses fitur isi otomatis Safari, yang berpotensi menanamkan lebih banyak kepercayaan karena antarmuka yang familier. |
| Isolasi | - Terpisah: Cookie dan sesi dipisahkan dari Safari; pengguna tidak akan secara otomatis login ke WKWebView. | - Terpisah: Cookie dan sesi dipisahkan dari Safari; pengguna juga tidak akan secara otomatis login ke SFSafariViewController. |
| Kerentanan | - Aman: Secara inheren aman karena sandboxing aplikasi Apple, tetapi perilaku dan keamanan bergantung pada implementasi aplikasi. Potensi kerentanan jika tidak diimplementasikan dengan benar. | - Lebih Aman: Mendapat manfaat dari fitur keamanan bawaan Safari, termasuk peringatan anti-phising dan situs web berbahaya. Umumnya dianggap lebih aman untuk menampilkan konten web daripada WKWebView karena fitur-fitur ini dan keakraban pengguna dengan Safari. |
| Lainnya | - Fitur tidak tersedia: Beberapa fitur browser (misalnya, WebAuthn) mungkin tidak sepenuhnya dapat diakses karena masalah keamanan dan WKWebView berjalan dalam konteks aplikasi. - Injeksi JavaScript: Beberapa aplikasi, mis. TikTok menyuntikkan JavaScript pelacakan ke dalam WKWebView dalam aplikasinya, atau membatasi kontrol pengguna (mis. Facebook) - Masalah privasi: Lebih banyak umpan balik komunitas mengenai privasi | - Tidak ada injeksi JavaScript: Tidak mengizinkan eksekusi JavaScript dari aplikasi, meningkatkan keamanan dan privasi. Juga tidak mendukung peringatan atau konfirmasi JavaScript, yang berpotensi memengaruhi pengalaman pengguna pada halaman web tertentu. - Mode Pembaca: Menyediakan mode pembaca untuk versi artikel yang bersih dan mudah dibaca. |
SFAuthenticationSession / ASWebAuthenticationSession – Kelas-kelas ini (yang terakhir adalah nama baru yang ramah Swift) dibuat khusus untuk alur login seperti OAuth atau OpenID Connect. Ketika Anda perlu mengautentikasi pengguna melalui halaman web (mungkin ke IdP eksternal), sesi ini adalah pilihan yang direkomendasikan di iOS. Mereka sangat mirip dengan SFSafariViewController karena mereka menggunakan browser Safari di belakang layar dan berbagi cookie/penyimpanan dengan Safari. Perbedaan utamanya adalah SFAuthenticationSession akan selalu meminta izin pengguna bahwa aplikasi ingin mengautentikasi menggunakan halaman web (untuk kesadaran pengguna) dan itu akan secara otomatis menggunakan sesi Safari yang ada jika tersedia.
Manfaatnya adalah pengalaman SSO yang mulus – jika pengguna sudah login ke penyedia di Safari, sesi ini dapat menggunakan cookie itu untuk menghindari login lain. Untuk passkey, ini penting karena berarti setiap kredensial passkey yang disimpan di Safari/iCloud Keychain dapat digunakan di sini juga. Panduan resmi Apple adalah menggunakan ASWebAuthenticationSession untuk apa pun yang terlihat seperti alur login. Keuntungannya adalah privasi yang ditingkatkan (aplikasi Anda tidak pernah melihat kredensial atau cookie, Safari yang menanganinya) dan dukungan SSO bawaan. Kelemahannya adalah itu terbatas pada alur autentikasi (Anda tidak akan menggunakannya hanya untuk merender konten web sewenang-wenang di aplikasi Anda). Singkatnya, jika Anda memilih pendekatan WebView di iOS, ASWebAuthenticationSession biasanya merupakan pilihan terbaik untuk mengimplementasikan passkey karena aman, berbagi status dengan Safari, dan dibuat khusus untuk autentikasi.
Di Android, keputusan WebView adalah antara WebView klasik dan Chrome Custom Tabs:
Untuk menguji perilaku WebView yang berbeda di Android, kami merekomendasikan aplikasi WebView vs Chrome Custom Tabs.
Android WebView (android.webkit.WebView) adalah komponen yang memungkinkan Anda menyematkan halaman web di tata letak aktivitas Anda. Ini mirip dengan WKWebView karena memberi Anda kontrol penuh: Anda dapat mencegat navigasi, menyuntikkan JavaScript, menyesuaikan UI, dll. Ia juga berjalan di dalam proses aplikasi Anda. Menggunakan WebView untuk passkey berarti aplikasi Anda memuat halaman login web Anda, dan halaman itu dapat memulai seremoni passkey WebAuthn. Android WebView modern mendukung WebAuthn (asalkan implementasi WebView perangkat diperbarui melalui Android System WebView atau komponen Chrome). Satu pertimbangan utama: secara default, Android WebView tidak berbagi cookie atau kredensial yang tersimpan dengan browser Chrome pengguna. Jadi setiap passkey yang dibuat atau digunakan di WebView mungkin tidak diketahui oleh Chrome, dan sebaliknya. Isolasi ini bisa baik untuk keamanan (aplikasi Anda tidak bisa membaca cookie browser), tetapi mungkin memaksa pengguna untuk login lagi jika mereka sudah diautentikasi di Chrome. Masalah lainnya adalah kepercayaan. WebView biasa tidak menampilkan URL atau ikon kunci SSL, jadi pengguna harus mempercayai aplikasi Anda sepenuhnya untuk tidak melakukan phising. Google bahkan telah melarang penggunaan WebView untuk login Google OAuth karena potensi risiko phising. Dari segi kinerja, WebView baik-baik saja, tetapi bisa lebih lambat atau lebih intensif memori daripada menggunakan browser default pengguna, terutama jika memuat halaman yang berat.
Chrome Custom Tabs (CCT) adalah pendekatan hibrida. Mereka memungkinkan aplikasi Anda untuk membuka halaman yang dirender Chrome yang terlihat seperti bagian dari aplikasi Anda. Anda dapat menyesuaikan warna bilah alat, menambahkan logo aplikasi, dll., tetapi kontennya dirender oleh Chrome dalam proses terpisah. Untuk passkey, CCT memiliki beberapa manfaat: mereka berbagi cookie dan kredensial pengguna dengan Chrome, yang berarti jika pengguna memiliki passkey yang disimpan melalui Chrome (Google Password Manager), Custom Tab dapat mengaksesnya. Pengguna juga akan melihat URL dan indikator keamanan yang sebenarnya, yang membangun kepercayaan. Kinerja seringkali lebih baik – Chrome dapat "dipanaskan" di latar belakang untuk pemuatan yang lebih cepat. Dan yang penting, keamanannya kuat: karena pada dasarnya ini adalah aplikasi Chrome, hal-hal seperti Google Safe Browsing melindungi sesi, dan aplikasi Anda tidak dapat menyuntikkan skrip sewenang-wenang ke halaman (mencegah serangan tertentu).
Kelemahannya adalah mengharuskan pengguna untuk memiliki Chrome (atau browser yang didukung) yang terpasang dan diperbarui. Sebagian besar pengguna Android memilikinya, tetapi pada beberapa perangkat di wilayah tertentu, ini bisa menjadi masalah. Secara keseluruhan, jika Anda menggunakan pendekatan web tertanam di Android, Chrome Custom Tabs direkomendasikan untuk alur passkey, karena mereka memberikan keseimbangan yang baik antara integrasi dan keamanan. Faktanya, mereka analog dengan SFSafariViewController/ASWebAuthSession iOS dalam banyak hal – memanfaatkan browser default untuk autentikasi.
(Catatan samping: WKWebView vs SFSafariViewController Apple dan WebView vs CCT Android memiliki banyak kesamaan. Baik Safari VC maupun Chrome Tabs berbagi status browser dan memberikan keamanan yang lebih baik, sedangkan WKWebView/Android WebView memberikan lebih banyak kontrol tetapi mengisolasi konten web. Untuk passkey, berbagi status (cookie, penyimpanan kredensial) biasanya diharapkan agar passkey dapat diakses dan dibuat dengan mulus.)
| Fitur | WebView | Chrome Custom Tab |
|---|---|---|
| Pengalaman pengguna | - Fleksibilitas: Menyediakan seperangkat API yang kaya untuk berinteraksi dengan konten web dan mengelola interaksi pengguna, termasuk menangani dialog JavaScript dan permintaan izin. - Konsistensi: Mengelola UX yang konsisten, terutama dengan konten web yang bervariasi, bisa menjadi tantangan. | - Fitur Browser: Berbagi fitur seperti Penghemat Data dan Isi Otomatis yang disinkronkan di seluruh perangkat. - Tombol Kembali: Memungkinkan pengguna untuk dengan mudah kembali ke aplikasi dengan tombol kembali yang terintegrasi. - Ketergantungan: Bergantung pada aplikasi Chrome, yang mungkin tidak tersedia atau diperbarui di semua perangkat pengguna - Pengalihan ke Browser: Fungsionalitas tertentu mungkin mengalihkan pengguna ke aplikasi Chrome, yang berpotensi mengganggu pengalaman pengguna. - Partial Custom Tabs: Hanya sebagian layar yang dapat digunakan untuk Chrome Custom Tab sementara sisanya menampilkan aplikasi native - Side-sheet: Dalam mode lanskap dan pada perangkat layar besar, Chrome Custom Tab hanya ditampilkan di satu sisi layar, sementara sisa layar menampilkan aplikasi native |
| Pengalaman pengembang | - Sangat Dapat Disesuaikan: Menawarkan opsi/kebutuhan kustomisasi yang luas. - Interaktivitas: Menyediakan banyak API untuk berinteraksi dengan konten web dan mengelola interaksi pengguna. | - Dapat Disesuaikan: Memungkinkan kustomisasi warna bilah alat, tombol tindakan, bilah alat bawah, item menu kustom, dan animasi masuk/keluar. - Callback: Mengirimkan callback ke aplikasi setelah navigasi eksternal. - Fitur Keamanan: Menyediakan fitur siap pakai, menghilangkan kebutuhan untuk mengelola permintaan, pemberian izin, atau penyimpanan cookie. |
| Kinerja | - Kinerja Biasa-Biasa Saja: Mungkin tidak menawarkan tingkat kinerja yang sama dengan Chrome Custom Tabs (CCT) | - Pre-Warming: Termasuk pemanasan Browser di latar belakang dan pemuatan spekulatif URL untuk meningkatkan waktu muat halaman. - Prioritas: Mencegah aplikasi yang meluncurkan Custom Tab dari penggusuran selama penggunaannya dengan meningkatkan kepentingannya ke tingkat "foreground". |
| Kepercayaan dan pengenalan | - URL & SSL tidak Terlihat: Informasi URL dan SSL tidak secara inheren terlihat di WebView. Kecuali pengembang aplikasi mengimplementasikan fitur-fitur ini, pengguna tidak akan tahu apakah mereka berada di situs web yang benar atau yang phising. | - URL & SSL Terlihat: Menggunakan browser Chrome yang sebenarnya untuk merender halaman. Pengguna dapat melihat URL dan sertifikat SSL (menunjukkan apakah koneksi aman). Ini dapat memberikan keyakinan kepada pengguna bahwa mereka tidak berada di situs phising. |
| Isolasi | - Berjalan dalam Proses Aplikasi: Jika sebuah aplikasi memiliki kerentanan yang memungkinkan eksekusi kode berbahaya, ada risiko bahwa WebView dapat disusupi. Namun, WebView juga menerima pembaruan, tetapi perilaku dan keamanannya bisa lebih bergantung pada aplikasi yang menggunakannya. - Tidak Ada Berbagi Cookie / Sesi: Tidak berbagi cookie atau sesi dengan browser utama perangkat, menawarkan isolasi tetapi mungkin mengharuskan pengguna untuk login lagi. | - Berjalan dalam Proses Chrome: Menjadi bagian dari Chrome, Custom Tabs berjalan dalam proses yang sama dan memiliki pembaruan dan fitur keamanan yang sama dengan Chrome. - Berbagi Cookie Jar dan Model Izin: Memastikan pengguna tidak perlu masuk kembali ke situs atau memberikan kembali izin. - Pengaturan & Preferensi Chrome: Memanfaatkan pengaturan dan preferensi Chrome. |
| Kerentanan | - Callback untuk Mencuri Kredensial: Potensi kerentanan termasuk bahwa terkadang JavaScript diperlukan yang membuka pintu bagi aplikasi lain untuk menjalankan kode berbahaya, seperti mendaftarkan callback yang mencoba mencegat nama pengguna dan kata sandi. - Phising: Selain itu, aplikasi berbahaya dapat membuka halaman web lain yang meniru alur Tautan dalam upaya phising. | - Google Safe Browsing: Menggunakan Google Safe Browsing untuk melindungi pengguna dan perangkat dari situs berbahaya. - Dekorasi Browser Aman: Memastikan pengguna selalu melihat URL yang tepat yang mereka interaksikan dan dapat melihat informasi sertifikat situs web, mengurangi risiko phising. Selain itu, tab kustom tidak mengizinkan injeksi JavaScript. |
| Lainnya | - Google melarang WebView untuk login pengguna ke akun Google |
Terlepas dari pendekatan implementasi mana yang Anda pilih, persyaratan teknis tertentu harus dipenuhi untuk mengaktifkan fungsionalitas passkey. Bagian ini memberikan panduan komprehensif tentang mengonfigurasi file asosiasi well-known, entitlement iOS, dan konfigurasi WebView Android.
Catatan tentang Perangkat Terkelola: Perilaku passkey berubah secara signifikan pada perangkat terkelola di mana kebijakan Mobile Device Management (MDM) mengontrol penyimpanan kredensial. Untuk menguji passkey pada perangkat terkelola, lihat Passkey di Perangkat iOS & Android Terkelola.
Alur Native dan Embedded WebView memerlukan file asosiasi untuk membangun kepercayaan kriptografis antara aplikasi dan domain web Anda. System WebView (ASWebAuthenticationSession) dan Chrome Custom Tabs tidak memerlukan asosiasi aplikasi-ke-situs.
File AASA membangun koneksi antara aplikasi iOS Anda dan domain web Anda, memungkinkan passkey berfungsi di kedua platform.
Lokasi File: https://yourdomain.com/.well-known/apple-app-site-association
Persyaratan Konfigurasi:
/.well-known/apple-app-site-association di domain Andaapplication/json.well-knownContoh File AASA:
{ "webcredentials": { "apps": ["TEAMID123.com.example.app"] } }
Caching dan Pengujian AASA:
Apple secara agresif melakukan cache file AASA (hingga 24-48 jam) menggunakan CDN, yang dapat menyulitkan pengembangan dan pengujian. Untuk melewati caching selama pengembangan:
?mode=developer ke domain terkait Anda di Xcode⚠️ Penting: JANGAN gunakan ?mode=developer dalam rilis produksi. Parameter ini hanya
untuk pengembangan—menggunakannya dalam produksi akan mencegah iOS mendeteksi file AASA
Anda dengan benar, merusak fungsionalitas passkey.
Validasi: Gunakan Validator AASA Apple untuk memverifikasi konfigurasi Anda.
Android menggunakan Digital Asset Links untuk memverifikasi hubungan antara aplikasi dan situs web Anda.
Lokasi File: https://yourdomain.com/.well-known/assetlinks.json
Persyaratan Konfigurasi:
/.well-known/assetlinks.json di domain Andaapplication/jsonContoh File assetlinks.json:
[ { "relation": [ "delegate_permission/common.handle_all_urls", "delegate_permission/common.get_login_creds" ], "target": { "namespace": "android_app", "package_name": "com.example.app", "sha256_cert_fingerprints": [ "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99" ] } } ]
Validasi: Gunakan Generator Digital Asset Links Google untuk membuat dan memverifikasi konfigurasi Anda.
Aplikasi iOS memerlukan entitlement yang tepat untuk mengakses fungsionalitas passkey. Persyaratannya berbeda sedikit berdasarkan pendekatan implementasi Anda.
File entitlement (sering dinamai Runner.entitlements di aplikasi
Flutter atau YourApp.entitlements di proyek iOS
native) mendefinisikan izin dan kapabilitas khusus yang diberikan oleh sistem Apple. Untuk
passkey, file ini mengonfigurasi Associated Domains.
Lokasi File: Biasanya di proyek Xcode Anda di ios/Runner/Runner.entitlements
Implementasi Native dan Embedded WebView memerlukan kapabilitas Associated Domains untuk menghubungkan aplikasi Anda dengan domain web Anda. System WebView (ASWebAuthenticationSession) tidak memerlukan ini karena berjalan dalam konteks Safari.
Pengaturan di Xcode:
webcredentials:Contoh Konfigurasi:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.developer.associated-domains</key> <array> <string>webcredentials:yourdomain.com</string> <string>webcredentials:subdomain.yourdomain.com</string> </array> </dict> </plist>
| Pendekatan | Associated Domains Diperlukan | Konfigurasi Tambahan |
|---|---|---|
| Implementasi Native | Ya | Implementasi Khusus |
| System WebView | Tidak diperlukan | Pengaturan web default berfungsi |
| Embedded WebView | Ya | Memerlukan konfigurasi AndroidX WebKit 1.12.1+ |
Beberapa Domain: Jika aplikasi Anda perlu bekerja dengan beberapa domain, Anda mungkin memerlukan Related Origin Requests (ROR).
Android Embedded WebView mendapatkan dukungan WebAuthn native dengan AndroidX WebKit 1.12, menghilangkan kebutuhan akan kode jembatan JavaScript kustom. System WebView (Chrome Custom Tabs) tidak memerlukan konfigurasi apa pun—kredensial bekerja secara otomatis.
Persyaratan:
Implementasi:
import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature // Periksa apakah Otentikasi Web didukung if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) { // Aktifkan Otentikasi Web WebSettingsCompat.setWebAuthenticationSupport( webView.settings, WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP ) // Aktifkan JavaScript webView.settings.javaScriptEnabled = true }
Poin Kunci:
WebViewFeature.WEB_AUTHENTICATION saat
runtimemediation:"conditional" (pengisian otomatis passkey
di kolom input) tidak berfungsi di Embedded WebViewCatatan Versi:
Sebelum AndroidX WebKit 1.12.0, dukungan WebAuthn native tidak ada di Embedded WebView. Tim harus:
Jika Anda perlu mendukung versi Android yang lebih lama atau perangkat tanpa APK WebView yang diperbarui, lihat panduan Integrasi WebView Credential Manager Android untuk pendekatan kode jembatan. Namun, kami sangat merekomendasikan penggunaan pendekatan native WebKit 1.12.1+ untuk aplikasi modern.
Rekomendasi: Gunakan dukungan WebAuthn native dengan AndroidX WebKit 1.12.1+. Jika tidak tersedia saat runtime, kembali ke Chrome Custom Tabs yang menyediakan dukungan passkey yang sangat baik dengan kredensial bersama.
Saat mengimplementasikan passkey di aplikasi native, Anda perlu membangun kepercayaan antara aplikasi Anda dan domain web. Bagian ini membahas cara menangani domain tunggal, beberapa domain terkait (ROR), dan cara memverifikasi file asosiasi well-known Anda dikonfigurasi dengan benar.
Untuk aplikasi yang menggunakan domain tunggal (mis. kayak.com), Anda memerlukan:
webcredentials:kayak.comRelated Origins (ROR) adalah fitur
WebAuthn yang memungkinkan satu set passkey berfungsi di beberapa domain terkait (mis.
kayak.com, kayak.de, kayak.co.uk).
ROR menggunakan endpoint
/.well-known/webauthn di setiap situs untuk mendefinisikan
related origins, BUKAN file AASA
atau assetlinks.
Poin Kunci:
/.well-known/webauthn dengan daftar
related originsContoh Konfigurasi:
Jika aplikasi Anda bekerja dengan kayak.com dan kayak.de, kedua domain harus:
Sebelum ditayangkan, verifikasi file well-known Anda dikonfigurasi dan dapat diakses dengan benar. Apple dan Google menyediakan URL pengujian berbasis CDN untuk memeriksa ketersediaan file:
| Domain | Verifikasi AASA Apple | Verifikasi Digital Asset Links Google |
|---|---|---|
| kayak.com | Uji file AASA Periksa apakah CDN Apple dapat mengambil file Anda | Uji assetlinks.json Verifikasi Google dapat mengakses asset links Anda |
| kayak.de | Uji file AASA Periksa apakah CDN Apple dapat mengambil file Anda | Uji assetlinks.json Verifikasi Google dapat mengakses asset links Anda |
Menggunakan URL Pengujian Ini:
?nocache=1 Apple memaksa pengambilan ulang, melewati cache CDNkayak.com atau kayak.de dengan domain Anda sendiri di pola URL di atasKendala Pengujian: Pastikan semua domain memiliki file well-known yang dikonfigurasi dengan benar. Sebuah file yang hilang atau salah konfigurasi di domain mana pun dapat merusak fungsionalitas passkey untuk domain tersebut.
Informasi Lebih Lanjut: WebAuthn Relying Party ID di Aplikasi Native
Memilih pendekatan implementasi yang tepat tergantung pada arsitektur autentikasi aplikasi Anda, persyaratan OAuth, dan kebutuhan akan kontrol sesi. Gunakan pohon keputusan ini untuk menentukan jalur terbaik ke depan.
Mulailah dengan pertanyaan kunci ini:
ASWebAuthenticationSessionWKWebView + entitlement Associated DomainsWebView + konfigurasi AndroidX WebKit 1.12.1+Berikut adalah bagaimana setiap pendekatan berkinerja di seluruh dimensi kunci:
| Pendekatan | Membuat Passkey | Menggunakan Passkey | Mengelola Passkey | Kompleksitas Teknis | Dukungan OAuth | Waktu Penyiapan |
|---|---|---|---|---|---|---|
| Implementasi Native | Adopsi tinggi Biometrik mulus, UX terbaik | Instan, senyappreferImmediatelyAvailableCredentials memungkinkan overlay otomatis saat aplikasi dimulai | Kontrol native penuh Integrasikan dengan pengaturan aplikasi | Sedang-Tinggi API spesifik platform | Memerlukan implementasi alur OAuth terpisah | Minggu hingga bulan |
| System WebView | Adopsi baik Pengalaman seperti browser, familier | UX browser standar Conditional UI di kolom input, keychain bersama | Berbasis browser Pengguna mengelola melalui browser | Rendah Kode native minimal | Sangat baik Dibuat khusus untuk OAuth | Hari hingga minggu |
| Embedded WebView | Adopsi lebih rendah Memerlukan konfigurasi | Dukungan WebAuthn native WebKit 1.12.1+, tanpa Conditional UI | Kontrol terbatas Tidak ada integrasi native | Sedang-Tinggi Konfigurasi WebView + izin | Memerlukan konfigurasi | 1-2 minggu |
Penjelasan Dimensi:
Direkomendasikan: System WebView
Jika aplikasi Anda mengautentikasi melalui OAuth2, OIDC, atau penyedia social login (Google, GitHub, Microsoft, dll.), System WebView adalah pilihan optimal:
ASWebAuthenticationSession dibuat khusus untuk alur OAuthContoh: Aplikasi travel seperti kayak.com dan kayak.de menggunakan OAuth untuk autentikasi. System WebView memungkinkan mereka untuk mempertahankan infrastruktur OAuth yang ada sambil menambahkan dukungan passkey melalui halaman autentikasi web mereka.
Direkomendasikan: Pendekatan Hibrida
Gunakan System WebView untuk autentikasi OAuth awal, lalu Embedded WebView untuk sesi pasca-autentikasi:
Kapan digunakan: Aplikasi yang mengautentikasi melalui OAuth tetapi kemudian perlu menampilkan konten web yang diautentikasi di mana manipulasi sesi langsung diperlukan.
Direkomendasikan: Implementasi Native
Membangun dari awal atau memiliki layar native? Lakukan sepenuhnya native:
preferImmediatelyAvailableCredentials untuk menampilkan
overlay passkey otomatis saat aplikasi dimulai - eksklusif untuk implementasi native dan
memberikan tingkat konversi tertinggiUntuk Aplikasi Baru: Sangat merekomendasikan membangun login native sejak hari pertama. Ini menyiapkan Anda untuk UX optimal dan menghindari migrasi WebView-ke-native di masa depan.
Direkomendasikan: Migrasi Bertahap
Pendekatan bertahap ini memungkinkan perbaikan inkremental tanpa mengganggu pengguna yang ada.
| Persyaratan | Native | System WebView | Embedded WebView |
|---|---|---|---|
| File well-known (AASA/assetlinks) | Diperlukan | Tidak diperlukan | Diperlukan |
| iOS Associated Domains | Diperlukan | Tidak diperlukan | Diperlukan |
| Pustaka WebKit Android | Tidak berlaku | Tidak diperlukan | Diperlukan (1.12.1+) |
| Relying Party ID | Harus cocok dengan domain | Harus cocok dengan domain | Harus cocok dengan domain |
Lihat Bagian 5 untuk instruksi konfigurasi terperinci.
Menguji passkey di aplikasi native memerlukan pendekatan terstruktur dan berlapis. Ikuti piramida pengujian: pengujian unit (logika terisolasi), pengujian integrasi (seremoni WebAuthn di simulator/emulator) dan pengujian sistem (end-to-end pada perangkat fisik).
Kategori Pengujian Esensial:
Untuk panduan pengujian komprehensif termasuk strategi otomatisasi, kendala spesifik platform, dan daftar periksa pra-penerbangan lengkap, lihat panduan khusus kami: Menguji Alur Passkey di Aplikasi iOS & Android Native.
Pertimbangkan untuk meminta pengguna membuat passkey setelah login tradisional yang berhasil (kata sandi, OAuth). Pendekatan konversi bertahap ini:
Contoh: Setelah login OAuth melalui System WebView, tampilkan prompt native: "Aktifkan login lebih cepat dengan Face ID?" Jika diterima, buat passkey melalui halaman web yang dimuat di System WebView.
Memutuskan cara mengimplementasikan passkey - melalui Implementasi Native, System WebView atau Embedded WebView adalah pilihan desain krusial yang memengaruhi keamanan, pengalaman pengguna, dan kompleksitas pengembangan. Tidak ada jawaban satu ukuran untuk semua.
Untuk aplikasi berbasis OAuth: System WebView (ASWebAuthenticationSession, Chrome Custom Tabs) adalah titik awal yang direkomendasikan. Ini memberikan dukungan OAuth yang sangat baik, upaya implementasi minimal, dan pembagian kredensial otomatis.
Untuk aplikasi yang mengutamakan native: Lakukan native lebih cepat daripada nanti.
Login passkey native menawarkan UX paling mulus dengan kemampuan eksklusif seperti
preferImmediatelyAvailableCredentials, yang memungkinkan overlay passkey otomatis saat
aplikasi dimulai - sesuatu yang tidak dapat disediakan oleh implementasi WebView. Dengan
iOS dan Android sekarang memberikan dukungan kelas satu untuk passkey, keberhasilan dunia
nyata menunjukkan adopsi yang tinggi. Peralatan (termasuk SDK sumber terbuka dan pustaka
platform) telah matang untuk membuat integrasi native dapat dicapai dalam kerangka waktu
yang wajar. Meskipun Anda harus memperhatikan kebijakan manajemen perangkat, sinkronisasi
lintas perangkat, dan penyedia pihak ketiga, tantangan-tantangan ini dapat dikelola dengan
rekayasa dan pengujian yang cermat. Hasilnya adalah login aplikasi yang menyenangkan
pengguna dengan kemudahan dan kecepatannya sambil meningkatkan keamanan secara signifikan.
Untuk persyaratan bingkai WebView tertanam: Embedded WebView umumnya digunakan dalam dua skenario dunia nyata. Pertama, aplikasi berbasis OAuth sering menggunakan System WebView untuk alur login awal, kemudian beralih ke Embedded WebView untuk merender opsi manajemen passkey di layar pengaturan di mana kontrol sesi diperlukan—meskipun beberapa aplikasi menyederhanakan ini dengan tetap menggunakan System WebView untuk kedua alur. Kedua, aplikasi yang sudah menyematkan alur autentikasi mereka di bingkai WebView sebelum mengadopsi passkey melanjutkan pola ini untuk konsistensi. Embedded WebView dengan dukungan WebAuthn native (AndroidX WebKit 1.12.1+) memerlukan konfigurasi dan penyiapan (izin, entitlement, pengaturan WebView) tetapi tidak lagi memerlukan kode jembatan JavaScript kustom. Perhatikan bahwa Conditional UI tidak didukung di Embedded WebView. Pilih pendekatan ini saat mempertahankan pola autentikasi tertanam yang ada atau saat Anda memerlukan kontrol sesi/cookie untuk layar pasca-autentikasi.
Pada akhirnya, passkey di aplikasi native merupakan lompatan besar ke depan dalam kenyamanan pengguna dan keamanan. Baik diimplementasikan melalui Native, System WebView, atau Embedded WebView, mereka menghilangkan risiko phising dan beban manajemen kata sandi untuk pengguna Anda. Implementasi dunia nyata seperti integrasi passkey aplikasi native VicRoads menunjukkan bahwa pendekatan yang mengutamakan native memberikan adopsi dan kepuasan pengguna tertinggi ketika dieksekusi dengan benar dengan fitur seperti overlay passkey otomatis. Mengikuti praktik terbaik untuk autentikasi yang ramah pengguna dan memilih pendekatan implementasi yang sesuai dengan arsitektur aplikasi Anda—mengutamakan native untuk aplikasi baru, System WebView untuk alur OAuth, atau Embedded WebView untuk pola tertanam yang ada—Anda dapat menawarkan login tanpa kata sandi dan biometrik yang benar-benar mewujudkan visi passkey: autentikasi yang sederhana, aman, dan menyenangkan untuk semua orang.
Jika passkey tidak berfungsi di aplikasi native Anda, periksa masalah umum ini berdasarkan pendekatan implementasi:
application/json.well-knownhttps://your-domain.com (bukan app://)webcredentials:yourdomain.comASWebAuthenticationSession (direkomendasikan) atau
SFSafariViewController?mode=developer selama pengembangan (hapus untuk produksi)WebViewFeature.WEB_AUTHENTICATIONsetWebAuthenticationSupport() dipanggil dengan
WEB_AUTHENTICATION_SUPPORT_FOR_APP"NotAllowedError: The request is not allowed by the user agent or the platform in the current context"
setWebAuthenticationSupport()Tidak ada prompt passkey yang muncul
?mode=developer di iOS untuk pengujian,
verifikasi jenis WebViewUntuk debugging terperinci, lihat artikel kami tentang ID Relying Party di aplikasi native.
SDK Native Corbado:
Dokumentasi Platform:
Alat Validasi:
Passkeys Series: Native Apps
Related Articles
Passkey Tutorial: How to Implement Passkeys in Web Apps
Vincent - December 7, 2023
The High-Level Architecture of an Integrated Passkey Flow
Janina - December 21, 2022
Table of Contents