JavaScript en Cookies
Dit artikel legt JavaScript en cookies uit.
We leggen alles stap voor stap zorgvuldig uit: van de basisprincipes van cookies, lezen en schrijven, beveiliging, tot praktische voorbeelden.
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 en Cookies
Cookie verwijst naar kleine stukjes gegevens die in de browser van de gebruiker worden opgeslagen. Ze worden voornamelijk gebruikt voor de volgende doeleinden:.
- Gebruikersauthenticatie (het behouden van de login-status)
- Het opslaan van gebruikersinstellingen (taal, thema, enz.)
- Tracking (browsegeschiedenis, enz.)
In JavaScript kun je cookies lezen en schrijven met document.cookie.
Cookies aanmaken (schrijven)
Cookies worden aangemaakt met de volgende syntaxis:.
1document.cookie = "username=JohnDoe";- Deze code slaat een cookie genaamd
"username=JohnDoe"op in de browser.
Cookies aanmaken met een vervaldatum
Voor cookies kan een vervaldatum worden ingesteld. Als er geen vervaldatum is ingesteld, wordt het beschouwd als een sessiecookie en verwijderd wanneer de browser wordt gesloten.
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}`);- Het attribuut
expiresgeeft de vervaldatum van de cookie op in UTC-formaat. - Het attribuut
pathgeeft het pad op waar de cookie naartoe wordt gestuurd./betekent de gehele site. - Als je
SameSite=Noneopgeeft, wordt deCookieook verzonden bij cross-site verzoeken. In dit geval moet je echter altijd hetSecure-attribuut toevoegen. - Door
Secureop te geven, wordt deCookiebeperkt tot alleen HTTPS-communicatie, wat de veiligheid verhoogt. - Door naar
document.cookiete verwijzen, kun je alle beschikbareCookiesop de huidige pagina als een string ophalen. - Met
console.logkun je het verschil controleren tussen de daadwerkelijk in de browser ingesteldeCookie-waarden en de waarden die kunnen worden opgehaald.
Het ophalen (lezen) van cookies
Je kunt alle cookies als een string ophalen met 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"
- De geretourneerde waarde van
document.cookieis een enkele string waarin alleCookiesaan elkaar geregen zijn in het formaat 'key=value;'. - Het is handig om een functie te gebruiken om deze string te parsen en de gewenste waarde eruit te halen.
Functie om de waarde van een cookie op te halen
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"
- Deze functie splitst de sleutels en waarden met
split()en retourneert de waarde als deze overeenkomt met de opgegeven sleutel. - Met behulp van
decodeURIComponentkun je gecodeerde tekens correct ophalen. - Als de overeenkomstige sleutel niet bestaat, wordt
nullgeretourneerd.
Cookies verwijderen
Een cookie kan worden verwijderd door de vervaldatum op een datum in het verleden te zetten.
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"
- Door een lege waarde toe te wijzen aan
usernameen de vervaldatum in het verleden te zetten, wordt deze verwijderd. - Bij het verwijderen van een
Cookiemoet je ook depath,SameSiteenSecureattributen laten overeenkomen met de waarden die bij het aanmaken zijn gebruikt. - In dit voorbeeld wordt
usernameverwijderd en blijven andereCookies, zoalstheme=dark, bewaard.
Cookie-opties
Je kunt verschillende opties specificeren om het gedrag van een cookie te bepalen. De belangrijkste zijn als volgt:.
-
expiresSpecificeert de vervaldatum van de cookie in UTC-formaat. Als dit niet is gespecificeerd, wordt de cookie een sessiecookie en wordt deze verwijderd als de browser wordt gesloten. -
max-ageSpecificeert de vervaldatum van de cookie in seconden. Dit heeft voorrang opexpires. -
pathSpecificeert het pad waarvoor de cookie zal worden verzonden. Bijvoorbeeld, als je/adminspecificeert, wordt de cookie alleen verzonden naar pagina's onder dat pad. -
domainSpecificeert het domein waarvoor de cookie geldig is. Gewoonlijk is het ingesteld voor het huidige domein, maar je kunt het toepassen op alle subdomeinen, zoals.example.com. -
secureWanneer dit attribuut is opgegeven, wordt de cookie alleen via HTTPS verzonden. Voor meer veiligheid, stel dit attribuut altijd in voor gevoelige informatie. -
SameSiteBepaalt of cookies worden verzonden bij cross-site verzoeken. Je kunt een van de volgende drie waarden opgeven:.-
StrictCookies worden alleen verzonden bij verzoeken van dezelfde site. -
LaxCookies worden verzonden bij normale navigatie, maar met enkele beperkingen. -
NoneCookies kunnen zelfs worden verzonden bij cross-site verzoeken. HetSecure-attribuut is dan echter ook vereist.
-
Voorbeeld: Veilige cookie
1document.cookie = "sessionId=abc123; secure; SameSite=Strict";- Als je
secureopgeeft, wordt deCookiealleen verzonden via HTTPS-communicatie. - Als je
SameSite=Strictopgeeft, wordt deCookieniet verzonden bij cross-site verzoeken, waardoor het effectief is als een CSRF-maatregel. - Dergelijke beveiligde attributen zijn essentieel voor belangrijke
Cookiesdie worden gebruikt voor authenticatie of sessiebeheer.
Coderen en decoderen
Aangezien cookie-waarden speciale tekens kunnen bevatten, is het veiliger om encodeURIComponent te gebruiken.
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"
- Door gebruik te maken van
encodeURIComponentkun je veilig spaties, symbolen enzovoorts in eenCookieopslaan. - Gebruik bij het uitlezen
decodeURIComponentom de oorspronkelijke string terug te krijgen. - In dit voorbeeld wordt
max-age=604800gebruikt om de vervalperiode op 7 dagen (604.800 seconden) te zetten. Dit is een methode om de vervaldatum op te geven, vergelijkbaar metexpires.max-agekan in seconden worden opgegeven en is vaak eenvoudiger te gebruiken.
Praktisch voorbeeld: Een thema opslaan en laden
Hieronder staat een voorbeeld van het opslaan van het door de gebruiker gekozen thema in een cookie en het automatisch toepassen ervan bij het volgende bezoek.
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>- De
setTheme-functie slaat het geselecteerde thema op in eenCookieen roept directapplyThemeaan om het scherm bij te werken. - De
applyTheme-functie wijzigt de achtergrond- en tekstkleur van debodyvolgens het thema. - In dit voorbeeld blijft de thema-instelling een week behouden, omdat
max-age=604800is ingesteld. - Omdat de keuze van de gebruiker behouden blijft bij een volgend bezoek aan de pagina, wordt de gebruikerservaring verbeterd.
Beperkingen en waarschuwingen bij cookies
Let op de volgende punten bij het gebruik van cookies:.
-
Groottebeperkingen De grootte van een enkele cookie is beperkt tot ongeveer 4KB.
-
Beperking van het aantal cookies dat kan worden opgeslagen Afhankelijk van de browser kunt u ongeveer 20 tot 50 per domein opslaan.
-
Beveiligingsmaatregelen De inhoud van
Cookieswordt in principe als platte tekst opgeslagen, dus het is niet geschikt voor het opslaan van vertrouwelijke informatie zoals wachtwoorden. -
Cookies die niet toegankelijk zijn vanuit JavaScript
Cookiesmet het attribuutHttpOnlykunnen om veiligheidsredenen niet door JavaScript worden gelezen.
Server en Cookies
1Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=StrictSommige Cookie-attributen, zoals HttpOnly, kunnen niet via JavaScript worden ingesteld. Deze moeten aan de serverzijde worden ingesteld.
Samenvatting
Het manipuleren van Cookies via JavaScript kan de gebruikerservaring verbeteren en de status behouden. Houd echter rekening met de volgende punten voor een veilige en correcte omgang.
-
Sla alleen de minimaal noodzakelijke informatie op Vermijd vanuit privacy- en veiligheidsoogpunt het opslaan van persoonlijke of gevoelige informatie, en registreer alleen de noodzakelijke gegevens.
-
Stel beveiligingsattributen correct in Stel attributen zoals
SecureenSameSitein om cross-site-aanvallen zoals XSS en CSRF te voorkomen. -
Gegevens coderen en decoderen Gebruik
encodeURIComponentendecodeURIComponentom Cookie-waarden veilig op te slaan en te lezen zodat speciale tekens en bijvoorbeeld Japans correct worden afgehandeld.
Door het juiste gebruik van Cookies te leren, kunt u meer geavanceerde en veilige webapplicaties bouwen.
Je kunt het bovenstaande artikel volgen met Visual Studio Code op ons YouTube-kanaal. Bekijk ook het YouTube-kanaal.