Studi Kasus

Cara WhatsApp Mengupgrade ke Login yang Aman dan Lancar untuk 1 Miliar Pengguna dengan Kunci Sandi

Waktu baca: 8 menit

WhatsApp adalah platform pesan terbesar di dunia, yang melayani miliaran pengguna secara global. WhatsApp adalah alat komunikasi default bagi orang-orang di berbagai wilayah, yang menghubungkan pengguna melalui pesan pribadi, andal, dan aman.

"Hal yang paling membuat saya bersemangat adalah besarnya dampak WhatsApp. Bahkan peningkatan kecil pada WhatsApp akan berdampak pada miliaran pengguna di seluruh dunia," kata Mayank Manuja, Android Engineer di tim Pendaftaran dan Akses WhatsApp yang memimpin desain dan penerapan autentikasi berbasis kunci sandi untuk WhatsApp. 

Membangun untuk audiens sebesar ini memerlukan pemahaman yang mendalam tentang berbagai kondisi jaringan, kemampuan perangkat, dan tingkat literasi digital. Menyadari potensi ini sejak awal, WhatsApp berkomitmen untuk mengadopsi kunci sandi pada tahun 2023, sehingga menjadi salah satu aplikasi konsumen besar pertama yang mengintegrasikan teknologi ini. Dengan menerapkan kunci sandi, WhatsApp bertujuan untuk memberikan opsi yang cepat dan tahan phishing yang secara signifikan mengurangi hambatan bagi pengguna sekaligus memberikan perlindungan yang kuat terhadap pengambilalihan akun dan pencurian kredensial.   

1787852638767.gif
Pengguna membuat kunci sandi di WhatsApp untuk login yang lebih cepat dan aman.

Keputusan untuk Mengadopsi Kunci Sandi

Untuk WhatsApp, menawarkan beberapa metode akses adalah kunci untuk memudahkan pengguna tetap terhubung dan mendapatkan kembali akses saat diperlukan. Kunci sandi menawarkan pengalaman login sekali ketuk yang efisien kepada pengguna, yang menghilangkan risiko phishing dan berfungsi dengan andal bahkan di wilayah tempat pengiriman pesan OTP dapat tidak konsisten. 

Di balik layar, kunci sandi memanfaatkan kriptografi kunci publik-pribadi untuk menggantikan entri manual dengan autentikasi biometrik atau kunci layar. Alur kerja ini meningkatkan kecepatan login secara drastis dengan mengurangi proses menjadi sekali ketuk melalui antarmuka panel bawah terpadu yang membuat pengguna tetap berinteraksi dalam konteks aplikasi. Manfaatnya ada dua: kunci sandi menawarkan pengalaman login yang efisien kepada pengguna sekaligus memberikan perlindungan native yang kuat terhadap serangan phishing. Yang terpenting, fitur ini berfungsi dengan andal bahkan di wilayah tempat pengiriman OTP SMS tradisional dapat tidak konsisten.

unnamed.png
Cara kunci sandi disimpan dan digunakan untuk mengautentikasi menggunakan kriptografi kunci publik-pribadi
AANDDM_KARROT_Quote_02.png

Memiliki metode akses akun yang kuat dan beragam akan memastikan pengguna tidak pernah terkunci dari hal yang paling penting bagi mereka.

Integrasi Sisi Klien

Dari perspektif developer WhatsApp, Credential Manager API menyediakan antarmuka yang bersih dan terpadu yang mengabstraksi kompleksitas penyedia kredensial yang mendasarinya. Setelah alur integrasi awal dipetakan, platform API menjadi mudah, dengan pembuatan dan pengambilan kredensial mengikuti pola permintaan dan respons yang jelas. Temukan panduan penerapan di dokumentasi developer Android. 

Meskipun happy path berfungsi sejak awal, menavigasi basis pengguna yang beragam di berbagai OEM, beberapa versi Android, dan berbagai konfigurasi perangkat (seperti hanya PIN versus biometrik, atau Android 13 versus 14+) memunculkan kasus ekstrem yang belum pernah terjadi sebelumnya. Hal ini mencakup pengguna tanpa kunci layar, jenis pengecualian yang tidak terduga, Layanan Play yang sudah tidak berlaku, dan perilaku penyedia kredensial yang tidak konsisten.

Untuk mengatasi rintangan ini, tim WhatsApp dan Google berkolaborasi secara mendalam dan mengatasi beberapa tantangan:

  • Mengoptimalkan alur pencarian kredensial: Alur pencarian awal menunjukkan latensi yang buruk, terutama bagi pengguna yang belum membuat kunci sandi. Karena sebagian besar pengguna WhatsApp termasuk dalam kategori ini pada tahap awal, hal ini menyebabkan keterlambatan yang signifikan pada hampir setiap login. Dengan menginstrumentasikan jalur panggilan dan mengidentifikasi bottleneck bersama-sama, WhatsApp mempercepat proses secara signifikan, sehingga mencapai peningkatan performa yang pada akhirnya menguntungkan seluruh ekosistem Android.
  • Menangani status sementara: WhatsApp membangun lapisan penanganan error yang komprehensif untuk mengatasi hambatan khusus perangkat seperti ketersediaan pengelola sandi, kunci layar yang tidak dikonfigurasi, masalah konektivitas yang terputus-putus, hardware yang tidak kompatibel, layanan Play yang sudah tidak berlaku, serta mengategorikan pengecualian ke dalam status yang dapat dipulihkan dan status terminal. Hal ini memungkinkan degradasi halus. Jika alur kunci sandi tidak dapat diselesaikan, sistem akan beralih dengan aman ke autentikasi tradisional tanpa membuat pengguna mengalami error.
  • Mengatasi pengecualian khusus OS: Saat telemetri mengungkapkan hambatan khusus perangkat seperti GetPublicKeyCredentialDomException (Gagal mendekripsi kredensial) di perangkat Android 13 tertentu, dan CreatePublicKeyCredentialDomException (Tidak dapat mendapatkan akun sinkronisasi)  selama pembuatan kunci sandi di Android 14, Google dan tim WhatsApp menyelidiki akar masalahnya dan menerapkan peningkatan di tingkat platform untuk memastikan alur pembuatan yang lebih lancar. Anda dapat menemukan panduan error yang komprehensif di sini yang mencantumkan kode dan deskripsi error umum terkait Credential Manager, serta memberikan beberapa informasi tentang penyebabnya. 
Catatan: Untuk panduan lebih lanjut, pelajari blog praktik terbaik Kunci sandi untuk mempelajari cara mengoptimalkan pengalaman pengguna saat mengadopsi kunci sandi.

Menyempurnakan Pengalaman Pengguna

Karena kunci sandi merupakan konsep yang sepenuhnya baru pada awal tahun 2023, tidak ada pola yang ditetapkan untuk meminta pembuatannya. Melalui pengujian A/B yang ekstensif, WhatsApp mengembangkan framework kontekstual yang menargetkan pengguna yang akan mendapatkan manfaat paling besar. Strategi ini terus berkembang: seiring alur Android OS yang semakin matang menjadi pengalaman satu layar yang efisien, WhatsApp menyederhanakan dialognya sendiri untuk menghindari UI yang redundan atau membingungkan.

Case-Study-1.png
Alur pembuatan kunci sandi satu layar yang disederhanakan di WhatsApp

Arsitektur Sisi Server dan Hambatan Lintas Platform

Di backend, server WhatsApp menerapkan upacara WebAuthn/FIDO2 standar. Backend ditulis dalam Erlang dan memanggil library Rust webauthn-rs melalui antarmuka native. Library Rust ini menangani verifikasi tanda tangan dan penguraian kredensial, sehingga kode internal tetap berfokus pada orkestrasi, penyimpanan, dan aturan produk seperti kelayakan, pembatasan kapasitas, dan siklus proses kredensial.

Arsitektur server mengatur upacara inti ini melalui empat titik entri utama, yang dipasangkan ke dalam urutan Begin dan Finish untuk Pendaftaran dan Autentikasi:

1. Pendaftaran kunci sandi

Urutan ini menangani penerbitan opsi pembuatan ke klien, memverifikasi pengesahan setelah klien mengonfirmasi keberhasilan pembuatan, dan mempertahankan kredensial dengan aman.

unnamed (1).png
Arsitektur interaksi server & klien selama pendaftaran kunci sandi

Erlang: Memulai Pendaftaran

begin_registration(UserId) ->
    Existing = list_credentials(UserId),
    %% reuse the existing user handle, or mint a new one
    {UserHandle, IsNew} = user_handle(Existing),
    %% returns the client creation options and the server-side challenge state
    #{client_safe := CreationOptions, server_only := ChallengeState} =
        webauthn:start_registration(UserId, UserHandle, rp_config()),
    %% excludeCredentials: the user's existing credential IDs, so the device won't re-enroll one
    Options = with_exclude_credentials(CreationOptions, credential_ids(Existing)),
    store_challenge(UserId, ChallengeState),          %% short TTL
    IsNew andalso reserve_user_handle(UserId, UserHandle),
    Options.
  • Mengidentifikasi pengguna: Server akan memeriksa kredensial yang ada terlebih dahulu untuk menggunakan kembali nama sebutan channel pengguna yang ada atau membuat yang baru.
  • Membuat opsi dan verifikasi: Server memanggil library WebAuthn untuk membuat opsi pembuatan bagi klien dan status verifikasi yang aman untuk server.
  • Mencegah duplikat: API ini secara eksplisit mengecualikan ID kredensial pengguna yang ada sehingga perangkat tidak secara tidak sengaja mendaftarkan ulang kunci sandi yang sudah terdaftar.
  • Menyimpan verifikasi: Server menyimpan verifikasi untuk sementara dengan time to live (TTL) yang singkat dan mengirimkan kembali opsi ke perangkat klien.

Erlang: Selesaikan Pendaftaran

finish_registration(UserId, Attestation) ->
    ChallengeState = get_challenge(UserId),          %% must exist and be unexpired
    #{credential_id := CredId, public_key := PubKey} =
        webauthn:finish_registration(Attestation, ChallengeState, rp_config()),
    ok = index_credential(CredId, UserId),            %% map credential_id -> account
    case multi_passkey_enabled(UserId) of
        true  -> add_credential(UserId, CredId, PubKey);      %% append (oldest evicted past the cap)
        false -> replace_credential(UserId, CredId, PubKey)   %% single-passkey mode
    end,
    notify_client(UserId, {passkey_created, CredId}),
    ok.
  • Mengambil verifikasi: Server mengambil verifikasi yang disimpan, memastikan verifikasi tersebut masih ada dan belum habis masa berlakunya.
  • Memverifikasi pengesahan: Langkah ini meneruskan respons klien (Pengesahan) dan verifikasi ke library WebAuthn untuk memverifikasi permintaan dan mengekstrak ID kredensial dan kunci publik baru.
  • Mengindeks kredensial: ID kredensial baru dipetakan langsung ke akun pengguna untuk pencarian cepat nanti.
  • Simpan dan kelola batas: Bergantung pada apakah fitur multi-kunci sandi diaktifkan, server akan menambahkan kredensial baru ke daftar pengguna (menghapus kredensial terlama jika batas tercapai) atau mengganti kredensial yang ada dalam mode kunci sandi tunggal.

2. Autentikasi Kredensial

Sama seperti pembuatan, server aplikasi menangani alur autentikasi dengan mengatur urutan login. Hal ini mencakup verifikasi pernyataan setelah autentikasi klien berhasil, dan memperbarui kredensial yang disimpan secara dinamis setiap kali WebAuthn memberi sinyal bahwa pembaruan diperlukan.

Erlang: Memulai Autentikasi

begin_authentication(UserId) ->
    Credentials = list_valid_credentials(UserId),
    #{client_safe := RequestOptions, server_only := ChallengeState} =
        webauthn:start_authentication(Credentials, rp_config()),
    store_challenge(UserId, ChallengeState),          %% short TTL
    RequestOptions.
  • Mengambil kredensial yang valid: Server mencari semua kredensial yang saat ini valid dan terkait dengan pengguna.
  • Membuat verifikasi: API ini menggunakan kredensial tersebut untuk membuat opsi permintaan bagi klien dan membuat verifikasi sisi server baru.
  • Menyimpan dan menampilkan: Sama seperti dalam pendaftaran, verifikasi disimpan sementara, dan opsi permintaan diteruskan ke aplikasi klien.

Erlang: Menyelesaikan Autentikasi

finish_authentication(UserId, Assertion) ->
    ChallengeState = get_challenge(UserId),
    Credentials = list_valid_credentials(UserId),
    case webauthn:finish_authentication(Credentials, Assertion, ChallengeState) of
        #{user_verified := true, credential_id := CredId, needs_update := NeedsUpdate} = Result ->
            %% webauthn tells us when the stored credential should be refreshed
            NeedsUpdate andalso refresh_credential(UserId, CredId, Result),
            mark_credential_used(UserId, CredId),
            {ok, CredId};
        _ ->
            {error, not_allowed}
    end.
  • Memverifikasi pernyataan: Server mengambil verifikasi yang disimpan dan kredensial yang valid, lalu meminta library WebAuthn untuk memverifikasi Pernyataan klien.
  • Perbarui jika diperlukan: Jika pengguna berhasil diverifikasi, server akan memeriksa flag needs_update. Library WebAuthn menggunakan flag ini untuk memberi sinyal jika status kredensial yang disimpan perlu diperbarui di server.
  • Finalisasi: Server menandai kredensial sebagai telah digunakan dan berhasil menyelesaikan proses login.
Case-Study-2.png
Pengalaman login dengan kunci sandi langkah demi langkah di aplikasi WhatsApp.

Untuk mengetahui lebih lanjut pendaftaran server, ikuti panduan integrasi di sini. 

Pertimbangan Arsitektur Lanjutan 

Penerapan kunci sandi di server dalam skala besar menghadirkan tantangan unik, terutama terkait arsitektur akun dan sinkronisasi perangkat. Ashish Choudhary dari tim backend WhatsApp menyoroti rintangan utama yang mereka hadapi:

  1. Bermigrasi ke beberapa kunci sandi per akun: Logika server lama WhatsApp sangat terkait dengan asumsi satu kredensial per pengguna. Untuk mendukung realitas multiperangkat modern, mereka merancang sistem daftar terbatas yang secara cerdas menghapus kredensial terlama setelah batas tercapai. Untuk memastikan stabilitas mutlak, perubahan struktural besar ini diluncurkan secara bertahap melalui eksperimen yang ketat.
  2. Menyeimbangkan siklus proses kredensial: Mengelola validitas kredensial memerlukan penanganan yang cermat. Membatalkan kredensial secara terlalu agresif akan memaksa pendaftaran ulang yang tidak perlu, sedangkan terlalu longgar akan membuat kredensial usang menumpuk. WhatsApp mengatasi masalah ini dengan menerapkan status siklus proses yang seimbang untuk menjaga keamanan yang ketat tanpa membuat pengguna frustrasi, dilengkapi dengan pembersihan latar belakang otomatis untuk kunci sandi yang tidak aktif.

Memikirkan Kembali Sinkronisasi Lintas Perangkat

Arsitektur multi-kunci sandi yang andal ini juga memungkinkan WhatsApp untuk sepenuhnya memikirkan ulang kegunaan lintas platform. Alur lintas perangkat WebAuthn standar memerlukan pemindaian kode QR di satu perangkat dan autentikasi melalui Bluetooth di perangkat lain. Namun, WhatsApp mendapati bahwa dependensi Bluetooth tidak dapat diandalkan, dan pengguna sering kali bingung membedakan kode QR baru dengan proses penautan WhatsApp Web yang sudah ada.

Alih-alih memaksakan mekanisme transfer lintas perangkat yang rentan, WhatsApp memungkinkan pengguna menyimpan kunci sandi secara native di beberapa ekosistem seperti Pengelola Sandi Google di Android dan iCloud Keychain di iOS. Saat bermigrasi ke platform baru, pengguna cukup membuat kunci sandi baru saat login berikutnya. Pendekatan ini sepenuhnya lancar bagi pengguna dan beroperasi dengan lancar di atas infrastruktur server multi-kunci sandi yang baru.

Rencana ke Depan

Sejak meluncurkan kunci sandi, WhatsApp telah menyaksikan adopsi organik yang kuat di seluruh basis penggunanya yang luas. Dengan mengubah proses login multi-langkah tradisional menjadi satu gestur biometrik yang lancar, aplikasi ini telah meningkatkan pengalaman pengguna secara signifikan. Berdasarkan momentum ini, WhatsApp kini memperluas utilitas kunci sandi di luar login awal, dengan mengeksplorasi autentikasi ulang dalam aplikasi yang lancar untuk tindakan akun yang sensitif seperti pencadangan yang dienkripsi dengan kunci sandi.

Ke depannya, WhatsApp secara aktif berkolaborasi dengan partner platform untuk memelopori jalur pembuatan kredensial yang lebih mudah, dengan mengantisipasi bahwa hambatan untuk masuk akan berkurang secara alami seiring dengan berkembangnya kemampuan biometrik perangkat. 

Rekomendasi untuk Developer yang Membangun dalam Skala Besar

Bagi developer yang bersiap mengintegrasikan kunci sandi dalam skala besar, tim WhatsApp memberikan rekomendasi penting berikut:

  • Investasikan taksonomi error sejak awal: Kategorikan berbagai pengecualian Credential Manager ke dalam status yang dapat dipulihkan versus status terminal, dan tentukan jalur penggantian yang jelas dan lancar untuk setiap skenario.
  • Pahami funnel kelayakan Anda: Lakukan pemeriksaan kemampuan perangkat seperti keberadaan kunci layar, hardware biometrik, dan versi Layanan Play, serta rancang alur untuk mengecualikan pengguna yang tidak memenuhi syarat secara proaktif, bukan gagal di tengah alur.
  • Siapkan aplikasi Anda untuk penggantian: Gunakan kunci sandi sebagai metode autentikasi utama yang optimal untuk perangkat yang kompatibel, tetapi selalu pertahankan metode tradisional sebagai penggantian universal yang andal.
  • Rencanakan fragmentasi versi OS: Perilaku kunci sandi dapat berbeda di berbagai sistem operasi. Lakukan pengujian menyeluruh di Android 13, 14, dan 15+, serta perhitungkan variasi khusus OEM di UI pemilihan kredensial.
  • Lakukan upsell secara kontekstual dan berikan edukasi: Tampilkan pembuatan kunci sandi secara alami selama tindakan yang relevan dengan keamanan. Tekankan proposisi nilai (kecepatan dan keamanan) dengan jelas menggunakan bahasa yang mudah dipahami untuk mendorong adopsi pengguna.
  • Pantau secara proaktif: Ekosistem berkembang seiring setiap update OS. Lacak pola latensi dan error secara terus-menerus agar selalu siap menghadapi perubahan lanskap perangkat.
AANDDM_Passkeys_Quote_01.png

Mulai Menggunakan Kunci Sandi dan Credential Manager

Coba langsung kunci sandi dan Credential Manager di Android menggunakan panduan integrasi dan kode contoh publik kami.

Jika ada pertanyaan atau masalah, Anda dapat menyampaikannya kepada kami melalui Issue Tracker Kredensial Android.

Ditulis oleh:
Lanjutkan membaca