JavaScript dan Kuki
Artikel ini menerangkan tentang JavaScript dan kuki.
Kami akan menerangkan dengan teliti segala-galanya langkah demi langkah, daripada asas kuki, membaca dan menulis, keselamatan, sehinggalah contoh praktikal.
YouTube Video
javascript-cookie.html
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <title>JavaScript & HTML</title>
6 <style>
7 * {
8 box-sizing: border-box;
9 }
10
11 body {
12 margin: 0;
13 padding: 1em;
14 padding-bottom: 10em;
15 font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
16 background-color: #f7f9fc;
17 color: #333;
18 line-height: 1.6;
19 }
20
21 .container {
22 max-width: 800px;
23 margin: 0 auto;
24 padding: 1em;
25 background-color: #ffffff;
26 border: 1px solid #ccc;
27 border-radius: 10px;
28 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
29 }
30
31 .container-flex {
32 display: flex;
33 flex-wrap: wrap;
34 gap: 2em;
35 max-width: 1000px;
36 margin: 0 auto;
37 padding: 1em;
38 background-color: #ffffff;
39 border: 1px solid #ccc;
40 border-radius: 10px;
41 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
42 }
43
44 .left-column, .right-column {
45 flex: 1 1 200px;
46 min-width: 200px;
47 }
48
49 h1, h2 {
50 font-size: 1.2rem;
51 color: #007bff;
52 margin-top: 0.5em;
53 margin-bottom: 0.5em;
54 border-left: 5px solid #007bff;
55 padding-left: 0.6em;
56 background-color: #e9f2ff;
57 }
58
59 button {
60 display: block;
61 margin: 1em auto;
62 padding: 0.75em 1.5em;
63 font-size: 1rem;
64 background-color: #007bff;
65 color: white;
66 border: none;
67 border-radius: 6px;
68 cursor: pointer;
69 transition: background-color 0.3s ease;
70 }
71
72 button:hover {
73 background-color: #0056b3;
74 }
75
76 #output {
77 margin-top: 1em;
78 background-color: #1e1e1e;
79 color: #0f0;
80 padding: 1em;
81 border-radius: 8px;
82 min-height: 200px;
83 font-family: Consolas, monospace;
84 font-size: 0.95rem;
85 overflow-y: auto;
86 white-space: pre-wrap;
87 }
88
89 .highlight {
90 outline: 3px solid #ffc107; /* yellow border */
91 background-color: #fff8e1; /* soft yellow background */
92 transition: background-color 0.3s ease, outline 0.3s ease;
93 }
94
95 .active {
96 background-color: #28a745; /* green background */
97 color: #fff;
98 box-shadow: 0 0 10px rgba(40, 167, 69, 0.5);
99 transition: background-color 0.3s ease, box-shadow 0.3s ease;
100 }
101 </style>
102</head>
103<body>
104 <div class="container">
105 <h1>JavaScript Console</h1>
106 <button id="executeBtn">Execute</button>
107 <div id="output"></div>
108 </div>
109
110 <script>
111 // Override console.log to display messages in the #output element
112 (function () {
113 // Override console.log
114 const originalLog = console.log;
115 console.log = function (...args) {
116 originalLog.apply(console, args);
117 const message = document.createElement('div');
118 message.textContent = args.map(String).join(' ');
119 output.appendChild(message);
120 };
121
122 // Override console.error
123 const originalError = console.error;
124 console.error = function (...args) {
125 originalError.apply(console, args);
126 const message = document.createElement('div');
127 message.textContent = args.map(String).join(' ');
128 message.style.color = 'red'; // Color error messages red
129 output.appendChild(message);
130 };
131 })();
132
133 document.getElementById('executeBtn').addEventListener('click', () => {
134 // Prevent multiple loads
135 if (document.getElementById('externalScript')) return;
136
137 const script = document.createElement('script');
138 script.src = 'javascript-cookie.js';
139 script.id = 'externalScript';
140 //script.onload = () => console.log('javascript-cookie.js loaded and executed.');
141 //script.onerror = () => console.log('Failed to load javascript-cookie.js.');
142 document.body.appendChild(script);
143 });
144 </script>
145</body>
146</html>
JavaScript dan Kuki
Kuki
merujuk kepada sekeping data kecil yang disimpan dalam pelayar pengguna. Ia digunakan terutamanya untuk tujuan berikut:.
- Pengesahan pengguna (mengekalkan status log masuk)
- Menyimpan tetapan pengguna (bahasa, tema, dan lain-lain)
- Penjejakan (sejarah pelayaran, dan lain-lain)
Dalam JavaScript, anda boleh membaca dan menulis kuki menggunakan document.cookie
.
Mencipta (menulis) kuki
Kuki dicipta dengan sintaks berikut:.
1document.cookie = "username=JohnDoe";
- Kod ini menyimpan kuki bernama
"username=JohnDoe"
dalam pelayar.
Membuat kuki dengan tarikh luput
Kuki boleh ditetapkan tarikh luputnya. Jika tiada tarikh luput ditetapkan, ia dianggap sebagai kuki sesi dan akan dipadamkan apabila pelayar ditutup.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3const cookieText = "username=JohnDoe; expires=" + date.toUTCString() + "; path=/; SameSite=None; Secure"
4document.cookie = cookieText;
5console.log(`Cookie Text : ${cookieText}`);
6console.log(`Cookie Value : ${document.cookie}`);
- Atribut
expires
menentukan tarikh luput kuki dalam format UTC. - Atribut
path
menentukan laluan di mana kuki akan dihantar./
bermaksud seluruh laman web. - Jika anda menentukan
SameSite=None
,Cookie
akan dihantar walaupun dengan permintaan merentas laman. Walau bagaimanapun, dalam kes ini, anda mesti sentiasa menyertakan atributSecure
. - Menentukan
Secure
mengehadkanCookie
kepada komunikasi HTTPS sahaja, sekali gus meningkatkan keselamatan. - Dengan merujuk kepada
document.cookie
, anda boleh mendapatkan semuaCookie
yang tersedia di halaman semasa dalam bentuk rentetan. - Dengan menggunakan
console.log
, anda boleh memeriksa perbezaan antara nilai sebenarCookie
yang ditetapkan di pelayar dan nilai yang boleh diperoleh.
Mendapatkan (membaca) kuki
Anda boleh mendapatkan semua kuki sebagai rentetan menggunakan document.cookie
.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3document.cookie = "theme=dark; expires=" + date.toUTCString() + "; path=/; SameSite=None; Secure"
4
5console.log(document.cookie);
6// Output: "username=JohnDoe; theme=dark"
- Nilai pulangan
document.cookie
ialah satu rentetan di mana semuaCookie
digabungkan dalam format 'key=value;
'. - Adalah mudah untuk menggunakan fungsi bagi mengurai rentetan ini dan mengekstrak nilai yang dikehendaki.
Fungsi untuk mendapatkan nilai sesuatu kuki
1function getCookie(name) {
2 const cookies = document.cookie.split('; ');
3 for (const cookie of cookies) {
4 const [key, value] = cookie.split('=');
5 if (key === name) {
6 return decodeURIComponent(value);
7 }
8 }
9 return null;
10}
11
12console.log(getCookie("username")); // "JohnDoe"
- Fungsi ini membahagikan kunci dan nilai menggunakan
split()
dan mengembalikan nilai jika ia sepadan dengan kunci yang ditentukan. - Dengan menggunakan
decodeURIComponent
, anda boleh mendapatkan aksara yang telah dikodkan dengan betul. - Jika kunci yang sepadan tidak wujud, ia akan mengembalikan
null
.
Memadam kuki
Kuki boleh dipadamkan dengan menetapkan tarikh luputnya ke tarikh yang telah lalu.
1document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; SameSite=None; Secure";
2
3console.log(document.cookie);
4// Output: "theme=dark"
- Dengan memberikan nilai kosong kepada
username
dan menetapkan tarikh luput ke masa lalu, ia akan dipadamkan. - Apabila memadamkan
Cookie
, anda juga mesti memadankan atributpath
,SameSite
, danSecure
dengan yang digunakan semasa ia dicipta. - Dalam contoh ini,
username
dipadamkan, danCookie
lain sepertitheme=dark
kekal.
Pilihan kuki
Anda boleh menetapkan pelbagai pilihan untuk mengawal tingkah laku kuki. Yang utama adalah seperti berikut:.
Menetapkan tarikh luput kuki dalam format UTC. Jika tidak ditetapkan, kuki akan menjadi kuki sesi dan dipadamkan apabila pelayar ditutup.
Menetapkan tarikh luput kuki dalam saat. Ini mengambil keutamaan berbanding `expires`.
Menetapkan laluan untuk kuki dihantar. Sebagai contoh, jika anda menetapkan `/admin`, kuki hanya akan dihantar ke halaman di bawah laluan itu.
Menetapkan domain di mana kuki sah digunakan. Biasanya, ia ditetapkan untuk domain semasa, tetapi anda boleh menggunakannya pada semua subdomain, seperti `.example.com`.
Apabila atribut ini ditetapkan, kuki hanya dihantar melalui HTTPS. Untuk keselamatan lebih tinggi, sentiasa tetapkan atribut ini untuk maklumat sensitif.
Mengawal sama ada kuki dihantar pada permintaan antara tapak. Anda boleh menetapkan salah satu daripada tiga nilai berikut:.
- `Strict`
Kuki hanya dihantar untuk permintaan dari laman yang sama.
- `Lax`
Kuki dihantar untuk pelayaran biasa, tetapi dengan beberapa had.
- `None`
Kuki boleh dihantar walaupun untuk permintaan antara tapak. Namun, atribut `Secure` juga diperlukan.
Contoh: Kuki selamat
1document.cookie = "sessionId=abc123; secure; SameSite=Strict";
- Jika anda menentukan
secure
,Cookie
hanya akan dihantar melalui komunikasi HTTPS. - Jika anda menentukan
SameSite=Strict
,Cookie
tidak akan dihantar untuk permintaan merentas laman, menjadikannya berkesan sebagai langkah pencegahan CSRF. - Atribut selamat seperti ini sangat penting untuk
Cookie
penting yang digunakan untuk pengesahan atau pengurusan sesi.
Pengekodan dan penyahkodan
Oleh kerana nilai kuki mungkin mengandungi aksara khas, adalah lebih selamat untuk menggunakan encodeURIComponent
.
1const date = new Date();
2date.setTime(date.getTime() + (7 * 24 * 60 * 60 * 1000)); // 7 days
3
4const username = "JohnDoe";
5document.cookie =
6 "username=" + encodeURIComponent(username) +
7 "; max-age=604800; path=/; SameSite=None; Secure";
8
9console.log(decodeURIComponent(getCookie("username"))); // "JohnDoe"
- Dengan menggunakan
encodeURIComponent
, anda boleh menyimpan ruang, simbol, dan sebagainya dengan selamat dalamCookie
. - Apabila membacanya, gunakan
decodeURIComponent
untuk mengembalikan rentetan asal. - Dalam contoh ini,
max-age=604800
digunakan untuk menetapkan tempoh luput kepada 7 hari (604,800 saat). Ini adalah kaedah untuk menentukan tarikh luput, serupa denganexpires
.max-age
boleh ditentukan dalam beberapa saat dan sering lebih mudah digunakan.
Contoh praktikal: Menyimpan dan memuat tema
Berikut ialah contoh menyimpan tema yang dipilih pengguna dalam kuki dan memohonkannya secara automatik pada lawatan seterusnya.
1function setTheme(theme) {
2 document.cookie =
3 "theme=" + encodeURIComponent(theme) +
4 "; max-age=604800; path=/; SameSite=None; Secure"; // 1 week
5 applyTheme(theme);
6}
7
8function applyTheme(theme) {
9 document.body.style.backgroundColor = theme === "dark" ? "#333" : "#fff";
10 document.body.style.color = theme === "dark" ? "#fff" : "#000";
11}
12
13function getCookie(name) {
14 const cookies = document.cookie.split('; ');
15 for (const cookie of cookies) {
16 const [key, value] = cookie.split('=');
17 if (key === name) {
18 return decodeURIComponent(value);
19 }
20 }
21 return null;
22}
23
24const savedTheme = getCookie("theme");
25if (savedTheme) {
26 applyTheme(savedTheme);
27}
1<button onclick="setTheme('light')">Light</button>
2<button onclick="setTheme('dark')">Dark</button>
- Fungsi
setTheme
menyimpan tema yang dipilih ke dalamCookie
dan serta-merta memanggilapplyTheme
untuk mengemas kini skrin. - Fungsi
applyTheme
menukar warna latar belakang dan teks padabody
mengikut tema. - Dalam contoh ini, kerana
max-age=604800
ditetapkan, tetapan tema dikekalkan selama seminggu. - Oleh kerana pilihan pengguna boleh dikekalkan apabila melawat semula halaman, pengalaman pengguna (UX) dipertingkatkan.
Had dan amaran penggunaan kuki
Ambil perhatian tentang perkara berikut apabila menggunakan kuki:.
-
Had Saiz Saiz satu kuki dihadkan kepada kira-kira 4KB.
-
Had bilangan kuki yang boleh disimpan Bergantung pada pelayar, anda hanya boleh menyimpan kira-kira 20 hingga 50 setiap domain.
-
Langkah-langkah Keselamatan Kandungan
Cookie
pada asasnya disimpan dalam teks biasa, jadi ia tidak sesuai untuk menyimpan maklumat sulit seperti kata laluan. -
Cookie yang tidak boleh diakses dari JavaScript
Cookie
dengan atributHttpOnly
tidak boleh dibaca dari JavaScript atas sebab keselamatan.
Pelayan dan Cookie
1Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict
Sesetengah atribut Cookie
seperti HttpOnly
tidak boleh ditetapkan melalui JavaScript. Atribut ini mesti ditetapkan di bahagian pelayan.
Ringkasan
Mengendalikan Cookie
menggunakan JavaScript boleh meningkatkan pengalaman pengguna dan mengekalkan keadaan (state). Walau bagaimanapun, sila ambil perhatian perkara-perkara berikut untuk mengendalikannya dengan selamat dan sesuai.
-
Simpan hanya maklumat minimum yang diperlukan Dari sudut privasi dan keselamatan, elakkan penyimpanan maklumat peribadi atau sensitif serta hanya rekodkan data yang diperlukan.
-
Tetapkan atribut keselamatan dengan betul Tetapkan atribut seperti
Secure
danSameSite
untuk mengelakkan serangan rentas laman seperti XSS dan CSRF. -
Pengekodan dan Penyahkodan Data Gunakan
encodeURIComponent
dandecodeURIComponent
untuk menyimpan dan membaca nilaiCookie
dengan selamat supaya aksara khas dan Jepun dapat dikendalikan dengan betul.
Dengan mempelajari cara penggunaan Cookie
yang betul, anda boleh membina aplikasi web yang lebih maju dan selamat.
Anda boleh mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Sila lihat juga saluran YouTube kami.