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
expires
geeft de vervaldatum van de cookie op in UTC-formaat. - Het attribuut
path
geeft het pad op waar de cookie naartoe wordt gestuurd./
betekent de gehele site. - Als je
SameSite=None
opgeeft, wordt deCookie
ook verzonden bij cross-site verzoeken. In dit geval moet je echter altijd hetSecure
-attribuut toevoegen. - Door
Secure
op te geven, wordt deCookie
beperkt tot alleen HTTPS-communicatie, wat de veiligheid verhoogt. - Door naar
document.cookie
te verwijzen, kun je alle beschikbareCookies
op de huidige pagina als een string ophalen. - Met
console.log
kun 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.cookie
is een enkele string waarin alleCookies
aan 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
decodeURIComponent
kun je gecodeerde tekens correct ophalen. - Als de overeenkomstige sleutel niet bestaat, wordt
null
geretourneerd.
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
username
en de vervaldatum in het verleden te zetten, wordt deze verwijderd. - Bij het verwijderen van een
Cookie
moet je ook depath
,SameSite
enSecure
attributen laten overeenkomen met de waarden die bij het aanmaken zijn gebruikt. - In dit voorbeeld wordt
username
verwijderd 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:.
Specificeert 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.
Specificeert de vervaldatum van de cookie in seconden. Dit heeft voorrang op `expires`.
Specificeert het pad waarvoor de cookie zal worden verzonden. Bijvoorbeeld, als je `/admin` specificeert, wordt de cookie alleen verzonden naar pagina's onder dat pad.
Specificeert 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`.
Wanneer dit attribuut is opgegeven, wordt de cookie alleen via HTTPS verzonden. Voor meer veiligheid, stel dit attribuut altijd in voor gevoelige informatie.
Bepaalt of cookies worden verzonden bij cross-site verzoeken. Je kunt een van de volgende drie waarden opgeven:.
- `Strict`
Cookies worden alleen verzonden bij verzoeken van dezelfde site.
- `Lax`
Cookies worden verzonden bij normale navigatie, maar met enkele beperkingen.
- `None`
Cookies kunnen zelfs worden verzonden bij cross-site verzoeken. Het `Secure`-attribuut is dan echter ook vereist.
Voorbeeld: Veilige cookie
1document.cookie = "sessionId=abc123; secure; SameSite=Strict";
- Als je
secure
opgeeft, wordt deCookie
alleen verzonden via HTTPS-communicatie. - Als je
SameSite=Strict
opgeeft, wordt deCookie
niet verzonden bij cross-site verzoeken, waardoor het effectief is als een CSRF-maatregel. - Dergelijke beveiligde attributen zijn essentieel voor belangrijke
Cookies
die 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
encodeURIComponent
kun je veilig spaties, symbolen enzovoorts in eenCookie
opslaan. - Gebruik bij het uitlezen
decodeURIComponent
om de oorspronkelijke string terug te krijgen. - In dit voorbeeld wordt
max-age=604800
gebruikt om de vervalperiode op 7 dagen (604.800 seconden) te zetten. Dit is een methode om de vervaldatum op te geven, vergelijkbaar metexpires
.max-age
kan 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 eenCookie
en roept directapplyTheme
aan om het scherm bij te werken. - De
applyTheme
-functie wijzigt de achtergrond- en tekstkleur van debody
volgens het thema. - In dit voorbeeld blijft de thema-instelling een week behouden, omdat
max-age=604800
is 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
Cookies
wordt 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
Cookies
met het attribuutHttpOnly
kunnen om veiligheidsredenen niet door JavaScript worden gelezen.
Server en Cookies
1Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict
Sommige 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
Secure
enSameSite
in om cross-site-aanvallen zoals XSS en CSRF te voorkomen. -
Gegevens coderen en decoderen Gebruik
encodeURIComponent
endecodeURIComponent
om 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.