Skip to content

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.origin sebelum memproses data:
    js
    window.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:

  1. Token-Based Authentication (Header Bearer) (Direkomendasikan):
    • Menyimpan token autentikasi pada LocalStorage atau SessionStorage milik domain sub-aplikasi.
    • Menyertakan token pada setiap permintaan HTTP API melalui HTTP Header: Authorization: Bearer <access_token>.
  2. Partitioned Cookies (CHIPS) (Apabila harus menggunakan cookie):
    • Menambahkan atribut Partitioned serta SameSite=None; Secure: Set-Cookie: session=xyz; SameSite=None; Secure; Partitioned;

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 SandboxFungsi & Persyaratan Keamanan
allow-scriptsMengizinkan eksekusi JavaScript (wajib untuk pendaftaran event listener postMessage).
allow-same-originMengizinkan sub-aplikasi mempertahankan origin dan mengakses resource domainnya sendiri.
allow-formsMengizinkan pengiriman form HTML di dalam iframe.
allow-popupsMengizinkan 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();
  }
});

Dokumentasi Resmi Integrasi SSO & Iframe SuperApps BP Batam