08-12-2019
Cookies
Wat cookies voor ons betekenen wanneer we op het internet surfen is niet voor iedereen heel duidelijk. Media aandacht rondom cookies heeft ervoor gezorgd dat ze zelf in een iewat kwaad daglicht terecht zijn gekomen. Zijn ze schadelijk voor je? Kun je zonder ze? Waar zijn ze eigenlijk voor? En hoe werken ze eigenlijk? Dat bekijken we allemaal in deze post.
Wat is een cookie?
Een cookie, ook wel HTTP cookie genoemd, is in essentie een combinatie van een naam met daar aan gekoppeld een waarde. Deze cookies worden opgeslagen in je browser. Je zou bijvoorbeeld een cookie kunnen hebben met de naam "achtergrondkleur" en de waarde "groen". Of "laatste_bezoek" en "14-06-2019 15:43:32". Tevens word er extra informatie aan gekoppeld, bijvoorbeeld voor welke website de cookie bedoeld is. Hierop gaan we later nog dieper in.
Waarom zijn er cookies?
Het korte antwoord is omdat hyper text transfer protocol (HTTP), stateless is. Het langere antwoord is complexer en lees je hier beneden. Http is een protocol oftewel een set afspraken waarin beschreven staat hoe we data over het internet versturen, browsers en servers snappen die afspraken, en hierdoor kan jij op het internet surfen.
Verzoek (request) en antwoord (response)
Op het moment dat je een website bezoekt, bijvoorbeeld example.org, stuurt jou browser een verzoek naar example.org om de website terug te sturen. Dit zodat de website op je scherm getoond kan worden. Je stuurt dus een verzoek (request), en je krijgt een antwoord met de website daarin terug. Daarmee is je verzoek afgehandeld, en de server die je verzoek behandeld heeft, vergeet je totaal. Hij onthoud niets over jou, en dat je zojuist een verzoek hebt gestuurd om de website te mogen zijn. Bijna altijd als je ergens op klikt, stuurt je browser een verzoek naar de server waar de website op staat. Zodat je nieuwe informatie krijgt te zien.
Stel nou dat je inlogt op een website waar je jouw gegevens kan aanpassen. Je browser stuurt op het moment dat je inloggen klikt, je gebruikersnaam en wachtwoord op naar de server waarop de website staat. De server controleert of de gegevens kloppen, en laat je de pagina zien waarop je jouw gegevens kan aanpassen. Vervolgens betekent dit dat de server alles over jou vergeet. Dat is niet handig, want als je dan aanpassingen maakt en op opslaan klikt, zal de server niet meer snappen dat hij die gegevens moet aanpassen voor jou. Dat was ie inmiddels weer vergeten. Hij zegt dan eigenlijk "Wie ben jij, ik ken jou niet".
State
In voorgaand probleem wil je dus dat de server / website onthoud wie jij bent. State is hiervoor de oplossing. Maar wat is dat? State is de toestand / staat in waar iets zich bevindt op een bepaalde tijd. Dat "iets" is in dit geval een website. De toestand is ingelogd of niet ingelogd. En ook wie is ingelogd. Omdat het HTTP geen staat bijhoudt, kunnen we dus niet onthouden of iemand is ingelogd. Cookies kunnen de toestand bijhouden in welke staat een website zich verkeerd. Hoe, dat lees je verderop.
Hoe cookies voor een statefull internet zorgen
Zoals gezegd is het HTTP stateless. Cookies kunnen ervoor zorgen dat er toch tussen je requests en responses met een statefull systeem / website kan werken.
Wanneer krijg ik een cookie?
Als je browser een verzoek doet naar en server waar een website op staat, krijg je bij het antwoord waar de website in zit, vaak ook een cookie. Soms ook meerdere. De browser bewaart dat koekje voor je (Tenzij je dat hebt uit staan). De website zit in de body van het antwoord. De cookie zit in een header. Die header ziet er bijvoorbeeld zo uit:
set-Cookie: session_id=73a12jksj5212s79
Op het moment dat je weer een verzoek naar de server stuurt waar die website op staat, word bij dat verzoek automatisch alle cookies toegevoegd. De server ontvangt dus automatisch al je cookies. Maar alleen van die website.
Session management cookies
Een van de verschillende toepassingen van cookies is het bijhouden van een server sessie. Wanneer je een website bezoekt die deze cookies gebruikt, krijg je vaak direct zodra je op die website terecht komt een cookie. Hierin staat een doorgaans lange onbegrijpbare code. Zoals eerder uitgelegd, zal deze cookie in je browser naar de server / website toegestuurd worden als je weer iets doet op die website. De server ziet dan die unieke code, en herkent jou dan daaraan. Omdat hij jou dan herkent, kan hij ook de website weer in de staat tonen zoals in je vorige verzoek. Dus als je ingelogd was, ben je dankzij die cookie weer ingelogd.
Je kunt dat soort cookie eigenlijk ook zien zoals een kaartje met een nummer wat je krijgt bij een garderobe. Als je het kaartje toont aan de garderobe medewerker, zal deze snappen wie jij bent en je jas kunnen geven. Zonder dat kaartje zegt de medewerker "Ik weet niet waar je jas is, dat houd ik niet allemaal bij". Wat ook belangrijk is om te weten is dat het hebben van een session cookie niet persee betekend dat je bent ingelogd.
De sessie tussen jouw browser en de server waarop de website staat kan meer omvatten als alleen de state die aangeeft of je ingelogd bent of niet. Dat ligt helemaal aan de website. Neem bijvoorbeeld een webshop. De session cookie kan bijvoorbeeld ervoor zorgen dat onthouden word wat je allemaal in je winkelwagentje hebt gestopt. Daar hoef je niet persee voor ingelogd te zijn.
Andere eigenschappen van Cookies
Een van de eigenschappen van cookies ken je al. Namelijk dat een cookie een naam heeft en een daarbij behorende waarde. Er zijn meer eigenschappen die het gedrag van cookies bepalen. Een cookie kan meerdere van die eigenschappen tegelijkertijd hebben. Laten we kijken welke:
Permantente cookies
Die naam is nogal ongelukkig gekozen vind ik zelf, want ze zijn helemaal niet permanent. Deze cookies hebben een datum waarop ze verlopen (Expires_At). Of ze hebben een Max_Age markering die aangeeft over hoeveel seconden de cookie verloopt. Als de cookie verloopt, verwijderd de browser de cookie en word deze niet meer meegestuurd naar de server.
Voorbeeld 1:
Set-Cookie: session_id=73a12jksj5212s79; Expires=Fri, 6 Dec 2019 14:21:54 GMT
Voorbeeld 2:
Set-Cookie: session_id=73a12jksj5212s79; Max-Age=1482000
Waarom ze permanent heten is omdat de cookies blijven bestaan als je je browser afsluit of zelfs je hele computer of tablet. Dit is in tegenstelling tot Session cookies.
Session cookies
Verwar deze cookies niet met cookies die gebruikt worden als Session management cookies. Dit zijn 2 verschillende dingen. Een session cookie is een cookie die geen Max-Age of Expires waardes aangeeft. Deze cookies zijn alleen aanwezig totdat je de browser sluit. Met het woord sessie bedoelen ze dus de sessie tussen het openen van de website en het sluiten van de browser. Een session management cookie kan eventueel langer als dat bestaan.
Domain eigenschap
Cookies die de domain eigenschap hebben zoals dit:
Set-Cookie: session_id=73a12jksj5212s79; Expires=Fri, 6 Dec 2019 14:21:54 GMT; Domain=example.org
Worden alleen in de browser gestopt als ze daadwerkelijk van example.org afkomen. Zo niet, dan slaat de browser ze niet op.
Path eigenschap
Cookies die de domain eigenschap hebben zoals dit:
Set-Cookie: session_id=73a12jksj5212s79; Path=/dashboard
Worden alleen in de browser ingesteld als de url in de browser begint met het pad /dashboard. Hier vind je meer informatie hoe een url is opgebouwd: https://nl.wikipedia.org/wiki/Uniform_Resource_Locator
Als er nog iets achter /dashboard staat in de url. Bijvoorbeeld: /dashboard/monthly of iets anders, word de cookie ook door de browser opgeslagen. Zolang het pad er maar mee begint.
Secure cookies
Cookies die de secure eigenschap hebben zoals dit:
Set-Cookie: session_id=73a12jksj5212s79; Secure
Worden alleen verstuurd over urls die beginnen met https. Let wel op dat deze cookies geen echte bescherming bieden. Met de juiste soort aanvallen kunnen ze alsnog door door onbevoegden worden uitgelezen.
HTTPOnly cookies
Set-Cookie: session_id=73a12jksj5212s79; HttpOnly;
Deze cookies zijn niet uit te lezen met javascript. Je krijgt ze simpelweg als je een website opvraagt, en worden weer naar de website / server opgestuurd. Dit zorgt ervoor dat kwaadaardige javascript die per ongeluk in je website terecht is gekomen de cookie niet kan stelen. Dit maakt ze ideaal als session management cookies.
Same site cookies
Set-Cookie: session_id=73a12jksj5212s79; SameSite=Strict;
First en third party cookies
Om same site cookies te begrijpen moet je eerst begrijpen wat first en third party cookies zijn. Een first party cookie is een cookie die je krijgt van een website die je daadwerkelijk in je url hebt staan. Een website die je rechtstreeks bekijkt dus. Heb je in je url example.org staan, en komt de cookie van een request aan example.org, dan is dat een first party cookie.
Een third party cookie is een cookie die je krijgt als de website waarop je zit een request doet naar een andere website, en daarop een response komt met een cookie van die andere website. Bijvoorbeeld stel dat de website waar je op zit example.org is en example.org laad een like button of video van example.com in. Om dit like button of video op example.org te plaatsen, doet je browser een request naar example.com. example.com stuurt dan de code voor de like button terug, of de video, maar ook de cookies van example.com. Je zit dus op example.org, en je krijgt hierdoor dus cookies van example.com. De cookies van example.com noemen ze dan third party cookies.
Same site eigenschap
Set-Cookie: session_id=73a12jksj5212s79; SameSite=Strict;
Als je een cookie op SameSite=Strict hebt staan dan zal de cookie niet verstuurt worden als je niet op de site zit van waar de cookie vanaf kwam (First party context). Voorbeeld. Stel er is een site example.com en die heeft een img tag met daarin een verwijzing naar een plaatje op example.org. En stel dat je cookies hebt van example.org. Op het moment dat je example.com bezoekt, stuurt je browser normaliter de cookies van example.org mee met het verzoek om het plaatje van example.org te downloaden. Behalve als de cookies SameSite=Strict gebruiken.
Nog een ander voorbeeld (Ter referentie voorbeeld 2): Stel nou dat je op example.com zit en je hebt nog steeds cookies van example.org omdat je die eerder had bezocht. Als je nou op example.com op een link klikt die naar example.org gaat, worden de cookies van example.org danzij Strict ook niet meegestuurd. Dus als je dan op example.org ingelogd was, dan is het ineens of je niet meer ingelogd bent.
Je kunt de waarde van same site ook op lax instellen:
Set-Cookie: session_id=73a12jksj5212s79; SameSite=Lax;
Lax is iets flexibeler dan strict. In het geval voorbeeld 2 (zie hierboven) word dan wel de cookies van example.org meegestuurd.
Met SameSite word er voorkomen dat cookie informatie van een site niet zomaar terecht kan komen op andere sites. Dit heeft als voordeel voor de eindgebruiker dat deze niet zo gemakkelijk getracked word. Meer daarover hieronder. Maar als je als website bouwer wel gebruikers wil tracken, moet je SameSite op none zetten.
In 2020 zal Chrome in ieder geval ervoor zorgen dat SameSite op lax staat. En daar zouden webbouwers al rekening mee moeten houden. Anders bestaat er een kans dat tracking bijvoorbeeld niet meer werkt. Of andere browsers zullen volgen is ten schrijvens nog niet bekend.
Third party cookies en tracking
Third party cookies kunnen gebruikt worden om gebruikers te tracken op het internet. Veel sites embedden bijvoorbeeld een videospeler in hun website. Stel dat een bezoeker van die website, tevens is ingelogd op de site die de videospeler aan bied. Op het moment dat hij dan die website bezoekt die de video speler embed, word er dus een request gedaan om die video speler op te halen. Waardoor ook het session management cookie van de site die de speler aanbied op die site terecht komt.
Alle volgende requests om de onderdelen, of video op te halen, sturen die session management cookie mee. De aanbieder van de video speler zie dan een request van de site die de video implementeerd met daarbij de cookie van iemand die ingelogd is op de aanbieder van die video speler. Hierdoor kan iemand geïdentificeerd worden. En dus getracked worden. Dit is interessant voor de aanbieder van die video speler, want die kan een profiel gaan opstellen van mensen en wat ze leuk vinden. Om ze vervolgens gerichte reclame te sturen en centjes te verdienen.
Omdat dit moeilijk te begrijpen is voor mensen die sites bezoeken, is onder andere de GDPR/AVG Cookie beleid regelgeving in het leven geroepen. Kijk altijd op de website van de overheid wat je precies moet doen om aan die regelgeving te voldoen. Hier vind je een goed startpunt: