Cookies
Last updated
Last updated
HTTP is een stateless protocol. Dit betekent dat de server geen informatie bijhoudt over de client. Elke request is onafhankelijk van de vorige. Doe je een request naar de server, dan weet de server niet wie je bent of wat je vorige requests waren.
Dit maakt het uiteraard moeilijk om bijvoorbeeld bij te houden of een gebruiker ingelogd is of niet.
Ook al heb je de eerste keer een login en paswoord meegegeven zal de tweede keer dat je de pagina bezoekt, de server niet weten wie je bent. Je zal dus opnieuw moeten inloggen.
De oplossing voor dit probleem is gebruik maken van cookies. Cookies zijn kleine stukjes data die de client kan opslaan in de browser. Bij elke request naar de server worden deze cookies meegestuurd. De server kan deze cookies lezen en zo weet de server wie de client is.
Express heeft een middleware die het makkelijk maakt om cookies te gebruiken: cookie-parser
. Je kan deze als volgt installeren:
Vervolgens kan je deze middleware toevoegen aan je Express-applicatie:
Stel dat we nu een formulier hebben waarbij de gebruiker zijn naam kan invullen. Als de gebruiker dit doet, willen we dat de gebruiker op de profielpagina terechtkomt en dat de naam van de gebruiker onthouden wordt de volgende keer dat de gebruiker de pagina bezoekt.
de index.ejs
file:
Nu kunnen we de naam van de gebruiker uitlezen in de profielpagina:
de profile.ejs
file:
We kunnen ook cookies verwijderen aan de hand van de clearCookie
methode:
en kunnen we een link toevoegen in de profile.ejs
file:
Cookies zijn een krachtig instrument om informatie bij te houden over een gebruiker. Maar dit betekent ook dat je voorzichtig moet zijn met cookies.
Je kan cookies aanpassen in de browser. Dit kan handig zijn om te testen wat er gebeurt als een cookie niet meer bestaat of als een cookie een andere waarde heeft. Dit betekent ook dat je niet zomaar gevoelige informatie in een cookie mag opslaan of dat je niet zomaar mag vertrouwen op de data die in een cookie staat.
Je kan ook een cookie instellen met een vervaldatum. Dit doe je door een extra argument mee te geven aan de cookie
methode:
De vervaldatum is een Date
object. In dit geval zal de cookie 15 minuten geldig zijn (900000 milliseconden) en daarna automatisch verwijderd worden.
Je kan ook de maxAge
property gebruiken om de vervaldatum in milliseconden mee te geven:
Een heel belangrijke eigenschap van cookies is HttpOnly
. Als je een cookie instelt met de HttpOnly
eigenschap, dan kan de cookie niet aangepast worden door client-side JavaScript. Dit is belangrijk om te voorkomen dat een aan stuk kwaadaardige JavaScript code de cookie aanpast en zo bijvoorbeeld de sessie van een gebruiker overneemt.
Als je een cookie instelt zonder httpOnly kan je met JavaScript de cookie aanpassen in de browser console:
of hem ophalen:
Je zal opmerken dat de cookie niet kan uitgelezen worden of aangepast worden als je de httpOnly
property instelt.
Een andere belangrijke eigenschap van cookies is Secure
. Als je een cookie instelt met de Secure
eigenschap, dan kan de cookie enkel verstuurd worden over een beveiligde verbinding (HTTPS).
De SameSite
eigenschap van een cookie bepaalt of een cookie meegestuurd mag worden bij een cross-site request. Dit is een belangrijke eigenschap om CSRF-aanvallen te voorkomen.
De SameSite
eigenschap kan drie waarden hebben: strict
, lax
of none
.
strict
: de cookie wordt enkel meegestuurd bij een same-site request. Dit betekent dat de cookie alleen wordt meegestuurd als de request naar dezelfde site is als waar de cookie is ingesteld.
lax
: de cookie wordt meegestuurd bij een same-site request en bij een cross-site request als het via een normale link is. Dit betekent bijvoorbeeld dat de cookie niet wordt meegestuurd als het via een POST request is.
none
: de cookie wordt altijd meegestuurd, ook bij cross-site requests. Dit kan enkel als de cookie ook de Secure
eigenschap heeft.
Een veelgebruikte toepassing van cookies is het bijhouden van een winkelkarretje. Als een gebruiker producten toevoegt aan zijn winkelkarretje, dan kan je deze producten bijhouden in een cookie. Zo weet je welke producten de gebruiker wil kopen.
de cart.ejs
file:
Merk op dat we JSON.stringify
en JSON.parse
om een array van strings op te slaan in een cookie. Cookies kunnen enkel strings opslaan, dus we moeten de array omzetten naar een string. Je kan uiteraard ook andere objecten opslaan in een cookie aan de hand van JSON.stringify
en JSON.parse
.
Een andere toepassing van cookies is het onthouden van gebruikersinstellingen. Als een gebruiker bijvoorbeeld de taal van de website wil veranderen, of het thema van de website wil aanpassen, dan kan je deze instellingen bijhouden in een cookie.
We maken eerst een interface aan voor de gebruikersinstellingen:
Vervolgens maken we een GET route aan om het formulier tonen waar de gebruiker zijn instellingen kan aanpassen en een POST route om de instellingen op te slaan in een cookie:
We kunnen nu de instellingen uitlezen in de settings.ejs
file: