Cara bermain Satpam Kompleks
- Baca instruksi level. Tiap level menyebut bagian yang kamu ubah: request
fetchdi halaman, atau header respons server. - Tulis satu baris per opsi dengan format
Nama: nilai. Untuk request, barisurl,method, dancredentialsadalah opsifetch, baris lain jadi header. - Arena berubah setiap kamu mengetik: tabel origin menandai bagian yang beda, lalu tampil preflight, request utama, jawaban server, dan pesan console kalau satpam menahan respons.
- Tekan Cek jawaban atau Ctrl + Enter. Jawaban dicek dari hasil simulasi: apakah JS bisa membaca respons, apakah preflight terjadi, dan status balasan server.
- Kalau buntu, buka Petunjuk. Level yang sudah selesai tetap tercentang di browser yang sama.
Yang kamu pelajari
- Level 1
Origin
Gabungan skema, host, dan port.
https://toko.iddanhttps://toko.id:8443adalah origin berbeda karena port bawaanhttpsadalah 443. - Level 2
Access-Control-Allow-Origin
Header respons yang menyebut origin mana yang boleh membaca respons. Nilainya harus sama persis dengan origin halaman.
- Level 3
CORS ditegakkan browser
Request cross-origin tetap sampai dan diproses server. Yang ditahan browser adalah izin JS halaman untuk membaca balasannya.
- Level 4
Satu nilai origin
Access-Control-Allow-Originhanya menerima satu origin atau*, bukan daftar. Server yang melayani banyak origin membaca headerOriginlalu menjawab dengan origin itu. - Level 5
Wildcard *
Access-Control-Allow-Origin: *mengizinkan origin mana pun, cocok untuk API publik tanpa cookie. - Level 6
Simple request vs preflight
GET, HEAD, dan POST dengan header biasa langsung dikirim. Selain itu browser bertanya dulu lewat request
OPTIONSyang disebut preflight. - Level 7
Access-Control-Allow-Methods
Jawaban preflight yang mengizinkan method seperti
PUTdanDELETE. - Level 8
Access-Control-Allow-Headers
Jawaban preflight yang mengizinkan header khusus, termasuk
Content-Type: application/json. - Level 9
Authorization di luar *
*diAccess-Control-Allow-Headersmencakup semua header kecualiAuthorization, jadi header itu harus disebut namanya. - Level 10
credentials: include
Opsi
fetchyang membuat cookie ikut ke origin lain. Bawaannyasame-origin, jadi cookie hanya ikut ke origin sendiri. - Level 11
Access-Control-Allow-Credentials
Request yang membawa cookie butuh
Access-Control-Allow-Credentials: truedari server. - Level 12
Wildcard dan cookie
Bersama cookie,
*di origin ditolak, dan*di method serta header dibaca sebagai teks biasa. Semua izin harus ditulis persis.
Satpam ada di browser, bukan di server
Saat halaman https://toko.id mengirim POST sederhana ke https://api.toko.id/pesanan, request itu sampai ke server dan pesanannya tercatat. Kalau server tidak mengirim Access-Control-Allow-Origin yang cocok, browser hanya menolak memberikan balasannya ke JS. Di console muncul error CORS, dan fetch melempar TypeError.
Karena itu CORS bukan pengaman server. curl atau backend lain tidak punya satpam ini dan bisa membaca respons apa pun. CORS melindungi pengguna: situs lain yang dibuka di browsermu tidak bisa diam-diam membaca data dari situs tempat kamu sedang masuk.
Preflight mengubah urutannya. Untuk PUT, DELETE, atau header seperti Content-Type: application/json, browser bertanya dulu lewat OPTIONS. Kalau jawabannya tidak mengizinkan, request utama tidak pernah dikirim.
Tanya jawab
Apakah harus daftar akun untuk bermain?
Tidak. Semua level bisa dimainkan tanpa akun. Kemajuanmu disimpan di browser yang kamu pakai, jadi akan hilang kalau data browser dihapus.
Kenapa error CORS tidak bisa diperbaiki dari frontend?
Izinnya datang dari header respons server, dan browser yang menegakkannya. Kode frontend hanya bisa mengubah request, misalnya membuang header yang tidak perlu supaya tidak ada preflight. Opsi mode: "no-cors" tidak membuka izin, malah membuat respons opaque yang sama sekali tidak bisa dibaca. Jalan keluarnya: atur header CORS di server, atau panggil API lewat server sendiri (proxy) yang berada di origin yang sama dengan halaman.
Apakah request-nya dikirim ke server sungguhan?
Tidak. Halaman, satpam, dan server disimulasikan di browser, jadi tidak ada request jaringan. Simulasinya memakai aturan CORS dari spesifikasi Fetch dan pesan console gaya Chrome.
Apakah localhost:3000 dan localhost:8080 satu origin?
Bukan. Host-nya sama, tapi port-nya beda, jadi cross-origin. Itu sebabnya frontend dan API yang jalan di port berbeda saat development butuh header CORS, atau proxy dari dev server.
Kenapa tidak boleh memakai * kalau membawa cookie?
* artinya siapa saja. Kalau siapa saja boleh membaca respons yang dibuat dengan cookie sesimu, situs mana pun bisa membaca data akunmu. Karena itu browser menolak * bersama credentials: include dan meminta origin yang ditulis persis plus Access-Control-Allow-Credentials: true.
Apa yang belum disimulasikan?
Cache preflight lewat Access-Control-Max-Age, Access-Control-Expose-Headers, aturan cookie SameSite, dan pembatasan panjang nilai header. Server simulasi juga memakai header CORS yang sama untuk preflight dan respons utama.