Appearance
Limitasi & Keamanan (Limitations & Security)
Proses integrasi autentikasi SSO di dalam lingkungan <iframe> memiliki beberapa pembatasan teknis (browser constraints) serta persyaratan keamanan yang WAJIB dipenuhi oleh setiap pengembang sub-aplikasi.
1. Pembatasan Target Origin (targetOrigin) & Event Origin
LARANGAN PENGGUNAAN WILDCARD '*'
Menentukan targetOrigin = '*' pada panggilan postMessage atau memproses event.data tanpa memverifikasi event.origin akan membuka celah keamanan fatal di mana pihak tidak berwenang (malicious third-party) dapat mencegat kredensial autentikasi.
Persyaratan Keamanan Origin:
- Pada Sisi Parent (SuperApps Portal): SuperApps selalu menentukan origin spesifik milik sub-aplikasi:js
// TIDAK DIPERBOLEHKAN ❌ iframeWindow.postMessage(payload, '*'); // DIPERBOLEHKAN ✅ iframeWindow.postMessage(payload, 'https://iboss.bpbatam.go.id'); - Pada Sisi Child (Sub-Aplikasi Iframe): Sub-aplikasi WAJIB memverifikasi
event.originsebelum memproses data:jswindow.addEventListener('message', (event) => { // DIPERBOLEHKAN ✅ if (event.origin !== 'https://superapps.bpbatam.go.id') return; // ... proses data autentikasi });
2. Pemblokiran Third-Party Cookies pada Peramban Modern
Peramban modern (seperti Google Chrome, Safari, dan Mozilla Firefox) secara default memblokir Cookie Pihak Ketiga (Third-Party Cookies) yang diterbitkan dari dalam elemen <iframe>.
KEGAGALAN SESI COOKIE
Apabila sub-aplikasi bergantung pada Session Cookie tradisional (JSESSIONID, session_id, dll), cookie tersebut TIDAK AKAN TERSIMPAN atau tidak terkirim saat sub-aplikasi dimuat di dalam iframe SuperApps.
Solusi Teknis yang Direkomendasikan:
- Token-Based Authentication (Header Bearer) (Direkomendasikan):
- Menyimpan token autentikasi pada
LocalStorageatauSessionStoragemilik domain sub-aplikasi. - Menyertakan token pada setiap permintaan HTTP API melalui HTTP Header:
Authorization: Bearer <access_token>.
- Menyimpan token autentikasi pada
- Partitioned Cookies (CHIPS) (Apabila harus menggunakan cookie):
- Menambahkan atribut
PartitionedsertaSameSite=None; Secure:Set-Cookie: session=xyz; SameSite=None; Secure; Partitioned;
- Menambahkan atribut
3. Atribut Sandbox pada Iframe
Parent Portal menerapkan atribut keamanan sandbox pada elemen <iframe>. Sub-aplikasi harus mendukung atribut-atribut berikut:
html
<iframe
src="https://subapp.bpbatam.go.id"
sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-downloads"
></iframe>| Atribut Sandbox | Fungsi & Persyaratan Keamanan |
|---|---|
allow-scripts | Mengizinkan eksekusi JavaScript (wajib untuk pendaftaran event listener postMessage). |
allow-same-origin | Mengizinkan sub-aplikasi mempertahankan origin dan mengakses resource domainnya sendiri. |
allow-forms | Mengizinkan pengiriman form HTML di dalam iframe. |
allow-popups | Mengizinkan pembukaan jendela baru apabila diperlukan. |
4. Masa Berlaku Kode Otorisasi Singkat (Anti Replay Attack)
Authorization Code yang dikirimkan melalui postMessage dirancang hanya berlaku untuk 1 kali penukaran (one-time use) dan akan kedaluwarsa secara otomatis dalam jangka waktu 60 detik.
Setelah frontend sub-aplikasi menerima kode otorisasi, kredensial tersebut harus segera diteruskan ke backend sub-aplikasi untuk diverifikasi ke server Goauthentik.
5. Penanganan Global Logout
Saat pengguna melakukan Logout pada portal utama SuperApps, Parent Portal akan menyiarkan event SUPERAPPS_LOGOUT ke seluruh iframe terintegrasi agar sesi lokal sub-aplikasi dihancurkan secara bersamaan.
Implementasi Listener Logout pada Sub-Aplikasi:
js
window.addEventListener('message', (event) => {
if (event.origin !== 'https://superapps.bpbatam.go.id') return;
if (event.data?.type === 'SUPERAPPS_LOGOUT') {
console.log('[Sub-App] Menerima instruksi Logout dari Parent Portal.');
// Menghapus sesi & token lokal
localStorage.removeItem('subapp_token');
sessionStorage.clear();
// Memuat ulang halaman
window.location.reload();
}
});