Cara bermain Loker Stasiun
- Baca instruksi dan jalan cerita level: kapan tab dibuka, dimuat ulang, ditutup, kapan waktu berlalu, dan kapan request dikirim ke server.
- Tulis JavaScript di editor.
localStorage,sessionStorage,document.cookie,location, dantampil(...)tersedia.tampilmenulis ke layar tab. - Arena memutar cerita sekali setiap kodemu berubah: tiga deret loker berubah isi per kejadian, dan jalan cerita menampilkan isi layar serta cookie yang sampai ke server.
- Tekan Cek jawaban atau Ctrl + Enter. Jawaban dicek dari isi layar, cookie yang terkirim, dan isi semua loker di akhir cerita. Yang beda ditandai merah, yang belum ada ditandai garis putus-putus.
- Kalau buntu, buka Petunjuk. Level yang sudah selesai tetap tercentang di browser yang sama.
Yang kamu pelajari
- Level 1
localStorage.setItem
Menyimpan pasangan kunci dan nilai yang bertahan walau semua tab dan browser ditutup.
- Level 2
getItem mengembalikan null
Kunci yang belum pernah disimpan dibaca sebagai
null, bukanundefinedatau teks kosong. Pakai??untuk nilai bawaan. - Level 3
sessionStorage
API yang sama dengan
localStorage, tapi isinya dibuang saat tab ditutup. Memuat ulang tab tidak mengosongkannya. - Level 4
Terpisah per tab
Setiap tab punya
sessionStoragesendiri walau membuka alamat yang sama, sedangkanlocalStoragedipakai bersama semua tab di origin itu. - Level 5
Semua nilai jadi teks
Storage hanya menyimpan string. Angka
10kembali sebagai"10", jadi ubah denganNumbersebelum dihitung. - Level 6
Jebakan "false"
falsetersimpan sebagai"false", teks yang tidak kosong, jadi dianggap benar olehif. Bandingkan dengan=== "true". - Level 7
JSON.stringify dan JSON.parse
Objek yang disimpan langsung jadi
"[object Object]". Ubah ke teks JSON saat menyimpan, lalu hidupkan lagi saat membaca. - Level 8
removeItem vs clear
removeItem(kunci)membuang satu kunci,clear()mengosongkan seluruh storage origin itu. - Level 9
document.cookie
Menulis ke
document.cookiemenambah satu cookie. Cookie dikirim ke server di setiap request, isi storage tidak. - Level 10
max-age dan expires
Tanpa keduanya, cookie hidup sampai browser ditutup.
max-agedalam detik,expiresberupa tanggal. - Level 11
path
Bawaannya cookie hanya dikirim untuk folder halaman pembuatnya.
path=/membuatnya ikut ke semua alamat di situs itu. - Level 12
Storage per origin
stasiun.iddantiket.stasiun.idadalah origin berbeda dengan storage terpisah. Cookie dengandomain=stasiun.idbisa dibagi ke subdomain.
Storage hanya menyimpan teks
Semua nilai yang masuk ke localStorage atau sessionStorage diubah dengan String(...). setItem("poin", 10) menyimpan "10", setItem("aktif", false) menyimpan "false", dan setItem("tiket", { kursi: 12 }) menyimpan "[object Object]", yang isinya sudah hilang.
Akibatnya terasa saat dibaca lagi. "10" + 10 menghasilkan "1010", dan if ("false") tetap jalan karena hanya teks kosong yang dianggap salah. Ubah teksnya kembali dengan Number(...), bandingkan dengan === "true", atau simpan dengan JSON.stringify lalu baca dengan JSON.parse.
Ingat juga bahwa getItem mengembalikan null untuk kunci yang belum ada. JSON.parse(null) menghasilkan null, jadi beri nilai bawaan dengan ?? sebelum memakai isinya.
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.
Apakah kodeku mengubah localStorage atau cookie browserku?
Tidak. localStorage, sessionStorage, dan document.cookie di game ini adalah tiruan yang berjalan di Web Worker sandbox. Storage dan cookie asli halaman tidak disentuh.
Bolehkah menyimpan token login di localStorage?
Sebaiknya jangan simpan token rahasia di localStorage atau sessionStorage. Semua JavaScript di halaman bisa membacanya, termasuk skrip pihak ketiga atau kode sisipan dari celah XSS, lalu mengirimnya ke tempat lain. Untuk sesi login, pakai cookie yang dipasang server dengan HttpOnly, Secure, dan SameSite.
Apa itu cookie HttpOnly?
Cookie yang dipasang server lewat header Set-Cookie dengan atribut HttpOnly. Browser tetap mengirimnya ke server di setiap request, tapi document.cookie tidak bisa membaca atau menulisnya. Karena itu cookie HttpOnly cocok untuk sesi login: kode JS yang disusupkan tidak bisa mencurinya. Menulis HttpOnly lewat document.cookie ditolak browser.
Kapan memakai localStorage, sessionStorage, atau cookie?
localStorage untuk preferensi yang boleh bertahan lama, seperti tema. sessionStorage untuk data sementara satu tab, seperti isian formulir yang belum dikirim. Cookie untuk data yang perlu dibaca server di setiap request, seperti bahasa pilihan atau sesi login, dan sebaiknya kecil karena ikut terkirim terus.
Apa yang belum disimulasikan?
Event storage antar tab, batas kuota sekitar 5 MB, atribut cookie Secure dan SameSite, menduplikat tab (yang ikut menyalin sessionStorage), browser yang ditutup penuh, dan IndexedDB.