Cache di MSAL.js

Ketika MSAL memperoleh token, MSAL menyimpannya untuk penggunaan di masa mendatang. MSAL mengelola masa berlaku token dan memperbaruinya untuk Anda. acquireTokenSilent() API mengambil token akses dari cache untuk akun tertentu dan memperbaruinya jika diperlukan.

Penyimpanan cache

Anda dapat mengonfigurasi lokasi penyimpanan cache melalui objek konfigurasi yang digunakan untuk membuat instans MSAL:

import { PublicClientApplication, BrowserCacheLocation } from "@azure/msal-browser";

const pca = new PublicClientApplication({
    auth: {
        clientId: "Enter_the_Application_Id_Here", // e.g. "00001111-aaaa-2222-bbbb-3333cccc4444" (guid)
        authority: "https://login.microsoftonline.com/Enter_the_Tenant_Info_Here", // e.g. "common" or your tenantId (guid),
        redirectUri: "/"
    },
    cache: {
       cacheLocation: BrowserCacheLocation.SessionStorage // "sessionStorage"
    }
});

Secara default, MSAL menyimpan berbagai artefak autentikasi yang diperolehnya dari IdP di penyimpanan browser menggunakan WEB Storage API yang didukung oleh semua browser modern. Dengan demikian, MSAL menawarkan dua metode penyimpanan persisten: sessionStorage (default) dan localStorage. Selain itu, MSAL menyediakan memoryStorage opsi yang memungkinkan Anda untuk menolak penyimpanan cache di penyimpanan browser.

Lokasi Cache Dihapus pada Digunakan bersama antara jendela atau tab Alur pengalihan didukung
sessionStorage tutup jendela/tab No Yes
localStorage browser tutup (kecuali pengguna memilih tetap masuk) Yes Yes
memoryStorage muat ulang/navigasi halaman No No

Note

Meskipun status autentikasi mungkin hilang dalam penyimpanan sesi dan memori karena penutupan jendela/tab atau refresh/navigasi halaman, masing-masing, pengguna masih memiliki sesi aktif dengan IdP selama cookie sesi tidak kedaluwarsa dan mungkin dapat mengautentikasi ulang tanpa perintah apa pun.

Pilihan antara lokasi penyimpanan yang berbeda mencerminkan trade-off antara pengalaman pengguna yang lebih baik vs. peningkatan keamanan. Seperti yang ditunjukkan tabel di atas, penyimpanan lokal menghasilkan pengalaman pengguna terbaik, sementara penyimpanan memori memberikan keamanan terbaik karena tidak ada informasi sensitif yang disimpan di penyimpanan browser. Lihat bagian tentang keamanan dan artefak cache di bawah ini untuk informasi selengkapnya.

Catatan LocalStorage

Mulai v4, jika Anda menggunakan lokasi cache localStorage, artefak autentikasi dienkripsi kecuali pengguna memilih "Tetap masuk" saat masuk. Algoritma enkripsi yang digunakan adalah AES-GCM menggunakan HKDF untuk mendapatkan kunci. Kunci dasar disimpan dalam cookie sesi berjudul msal.cache.encryption.

Cookie ini secara otomatis dihapus ketika instans browser (bukan tab) ditutup, sehingga tidak mungkin untuk mendekripsi artefak autentikasi apa pun setelah sesi berakhir. Artefak autentikasi yang kedaluwarsa ini dihapus saat MSAL diinisialisasi berikutnya dan pengguna mungkin perlu mengautentikasi ulang. Lokasi localStorage masih menyediakan persistensi cache lintas tab untuk semua pengguna tetapi hanya bertahan di seluruh sesi browser untuk pengguna yang memilih "Tetap masuk" (KMSI).

Important

Tujuan enkripsi ini adalah untuk mengurangi kebertahanan artefak otentikasi, bukan untuk memberikan keamanan tambahan. Jika aktor jahat mendapatkan akses ke penyimpanan browser, mereka juga akan memiliki akses ke kunci atau memiliki kemampuan untuk meminta token atas nama Anda tanpa perlu cache sama sekali. Anda bertanggung jawab untuk memastikan aplikasi Anda tidak rentan terhadap serangan XSS. Lihat bagian keamanan untuk informasi selengkapnya.

Note

Penyimpanan cookie untuk artefak autentikasi sementara tidak digunakan lagi di MSAL.js v4. Bagian ini dipertahankan untuk aplikasi yang masih menggunakan MSAL.js v3 atau yang lebih lama.

Browser MSAL dapat dikonfigurasi untuk menggunakan cookie untuk menyimpan artefak autentikasi sementara. Opsi ini memungkinkan Anda mendukung browser yang dapat menghapus penyimpanan lokal/sesi selama alur masuk berbasis pengalihan (misalnya Internet Explorer, Firefox dalam mode privat). Perhatikan bahwa ketika opsi ini dipilih, token itu sendiri masih disimpan di browser atau penyimpanan memori. Silakan merujuk ke konfigurasi untuk lebih lanjut.

Keamanan

Kami menganggap penyimpanan sesi/lokal aman selama aplikasi Anda tidak memiliki scripting lintas situs (XSS) dan kerentanan terkait. Lihat Contekan Pencegahan OWASP XSS untuk mengamankan aplikasi Anda terhadap XSS. Jika Anda masih khawatir, sebaiknya gunakan opsi sebagai gantinya memoryStorage .

Artefak dalam cache

Untuk memfasilitasi akuisisi token yang efisien sambil mempertahankan UX yang baik, MSAL menyimpan berbagai artefak yang dihasilkan dari panggilan API-nya. Di bawah ini adalah ringkasan entitas dalam cache MSAL:

  • Artefak persisten (tetap ada setelah permintaan selesai -lihat juga: masa pakai token)
    • token akses
    • token identitas
    • token penyegaran
    • accounts
  • Artefak sementara (terbatas pada durasi permintaan)
    • metadata permintaan (misalnya status, nonce, otoritas)
    • Kesalahan
    • status interaksi
  • Telemetri
    • permintaan yang gagal sebelumnya
    • data kinerja

Note

Entri cache sementara selalu disimpan dalam penyimpanan sesi atau dalam memori. MSAL kembali ke penyimpanan memori jika penyimpanan sesi tidak tersedia.

Note

Kode otorisasi hanya disimpan dalam memori dan dibuang setelah menukarkannya dengan token.

penggantian temporaryCacheLocation

Note

Opsi temporaryCacheLocation konfigurasi tidak digunakan lagi di MSAL.js v4. Bagian ini dipertahankan untuk aplikasi yang masih menggunakan MSAL.js v3 atau yang lebih lama.

Warning

Penimpaan temporaryCacheLocation harus dilakukan dengan hati-hati, khususnya saat memilih localStorage. Interaksi di lebih dari satu tab/jendela tidak didukung dan Anda mungkin menerima interaction_in_progress kesalahan secara tidak terduga. Ini adalah solusi darurat, bukan fitur yang didukung penuh.

Saat menggunakan MSAL.js dengan konfigurasi default dalam skenario di mana pengguna dialihkan setelah autentikasi berhasil di jendela atau tab baru, Kode Otorisasi OAuth 2.0 dengan alur PKCE akan terganggu. Dalam hal ini, jendela atau tab asli tempat status autentikasi (pemverifikasi kode dan tantangan) disimpan, akan hilang, dan alur autentikasi akan gagal.

Untuk menangani skenario ini, Anda dapat mengonfigurasi MSAL agar menggunakan localStorage sebagai lokasi cache dengan menimpa properti konfigurasi temporaryCacheLocation. Ini memungkinkan verifikator kode dan challenge disimpan dalam localStorage browser, yang tetap tersedia di beberapa tab dan jendela.

Persistensi cache selama pemutakhiran dan pengembalian MSAL.js

Terkadang MSAL.js perlu membuat perubahan pada bentuk artefak yang di-cache untuk mendukung persyaratan, fitur, atau perbaikan bug baru. Sesering mungkin, perubahan ini dilakukan dengan cara yang kompatibel mundur sehingga memastikan bahwa ketika aplikasi meningkatkan ke versi baru atau kembali ke versi yang lebih lama, cache yang ada di browser pengguna masih dapat digunakan. Namun, ini tidak selalu mungkin dan Anda mungkin berakhir dalam keadaan di mana beberapa salinan cache ada secara bersamaan, yang digunakan oleh versi MSAL.js berjalan saat ini dan yang lain yang ditulis oleh versi yang digunakan sebelum peningkatan. Hal ini dilakukan untuk memungkinkan aplikasi kembali ke versi sebelumnya dengan mulus jika diperlukan. Dalam sebagian besar peningkatan, MSAL.js memigrasikan cache yang ada ke format baru untuk pengalaman peningkatan yang mulus. Dalam kasus yang jarang terjadi, seperti peningkatan dari v3 ke v4, hal ini mungkin tidak dapat dilakukan karena persyaratan keamanan atau privasi, dan hal ini selalu mengakibatkan kenaikan versi mayor.

Saat dilakukan perubahan pada cache yang menyebabkan inkompatibilitas, cache lama disimpan selama 5 hari secara bawaan untuk memungkinkan rollback jika diperlukan. Lama waktu penyimpanan cache lama dapat dikonfigurasi melalui konfigurasi cache cacheRetentionDays pada PublicClientApplication. Jika cache belum digunakan secara aktif dalam waktu tersebut, cache dibersihkan lain kali MSAL.js diinisialisasi. Selain itu, jika Anda tidak mengantisipasi perlu menggulung balik, Anda dapat mengatur nilai ini ke 0 untuk menunjukkan bahwa cache lama harus selalu dihapus segera setelah meningkatkan ke versi baru MSAL.js. Sebaliknya, jika Anda memiliki jendela peluncuran yang lebih panjang untuk peningkatan, Anda dapat memilih untuk mengatur ini ke nilai yang lebih panjang.

Note

Token akses dan token penyegaran akan dihapus setelah kedaluwarsa, meskipun cacheRetentionDays yang dikonfigurasi belum tercapai. Token akses yang valid juga dapat dihapus kapan saja jika penyimpanan browser mencapai kuota penyimpanannya. Ketika kuota penyimpanan tercapai, token akses dihapus berdasarkan urutan masuk pertama, keluar pertama, dimulai dengan entri yang dibuat oleh MSAL.js versi sebelumnya, lalu berlanjut ke entri yang dibuat oleh MSAL.js versi saat ini.

const config = {
    auth: {
        clientId: "<your-client-id>"
    },
    cache: {
        cacheLocation: "localStorage",
        cacheRetentionDays: 0 // Set this to the number of days you want old cache to be preserved in the event a rollback is needed (Default 5 days)
    }
}

const pca = new PublicClientApplication(config);
await pca.initialize();

Komentar

  • Kami tidak menyarankan aplikasi yang memiliki logika bisnis bergantung pada penggunaan entitas secara langsung di cache. Sebagai gantinya, gunakan API MSAL yang sesuai saat Anda perlu memperoleh token atau mengambil akun.
  • Kunci yang digunakan untuk mengenkripsi token bukti kepemilikan (PoP) disimpan menggunakan kombinasi API IndexedDB dan penyimpanan memori. Untuk informasi lebih lanjut, silakan merujuk ke akses-token-proof-of-possession.

Informasi selengkapnya