Hubungi saya

Cookie yang ikut ke semua subdomain

Login GarudaSuite berlaku di semua *.garudasuite.com — fitur yang sengaja dibuat. Sampai saya ingin menaruh aplikasi lain di subdomain yang sama.

Di GarudaSuite, setiap aplikasi punya subdomain sendiri: page., grid., mail., dan seterusnya. Supaya pengguna cukup login sekali, cookie sesi diberi atribut ini:

Set-Cookie: garuda_session=…; Domain=.garudasuite.com; HttpOnly; Secure

Titik di depan garudasuite.com artinya: kirim cookie ini ke setiap subdomain. Persis yang dibutuhkan untuk single sign-on.

Masalahnya muncul belakangan

Ketika saya berencana menaruh proyek lain di nama.garudasuite.com, saya baru sadar: browser juga akan mengirim cookie itu ke sana. Aplikasi yang sama sekali bukan bagian dari GarudaSuite akan menerima token login pengguna GarudaSuite di setiap request — dan kalau aplikasi itu mencatat header ke log, token itu ikut tercatat.

HttpOnly tidak menolong di sini. Ia mencegah JavaScript membaca cookie, tapi cookie tetap dikirim ke server.

Perbaikannya ada di pintu depan

Karena semua lalu lintas masuk lewat Caddy, cookie itu bisa dibuang sebelum request sampai ke aplikasi:

(strip-garuda-cookies) {
	header_up Cookie "(^|;\s*)garuda_(session|refresh)=[^;]*" ""
}

Setiap situs non-GarudaSuite di subdomain tinggal import strip-garuda-cookies. Saya mengujinya dengan server kecil yang hanya memantulkan header Cookie: cookie GarudaSuite hilang, cookie milik aplikasi itu sendiri tetap utuh.

Pelajarannya

Pilihan keamanan selalu punya ruang lingkup. Domain=.garudasuite.com benar ketika semua subdomain adalah satu produk. Begitu asumsi itu berubah, pilihan yang sama menjadi celah. Itu juga alasan aplikasi-aplikasi baru saya kini tinggal di domain terpisah — termasuk situs ini.