1. Inleiding
Cookie , of HTTP-cookie, webcookie, browsercookie, is een klein stukje gegevens dat vanaf de website wordt verzonden en in de browser van de gebruiker wordt opgeslagen wanneer deze op deze website surft. Elke keer dat een gebruiker een website laadt, stuurt de browser automatisch cookies naar de webserver om de website op de hoogte te stellen van de eerdere acties van de gebruiker.
Cookies zijn ontworpen als een betrouwbaar mechanisme dat websites helpt statusinformatie te onthouden (zoals items in het winkelwagentje) of gebruikersactiviteiten op te slaan (inclusief klikken), een link, login, bezochte pagina's gedurende de week, maand of jaar,... ).
Hoewel cookies geen virussen kunnen overbrengen en ook geen malware op uw computer kunnen installeren , wordt het gebruik van trackingcookies en vooral cookies van derden beschouwd als een manier om persoonlijke informatie uit de browsegeschiedenis van gebruikers te identificeren. Cookies kunnen wachtwoorden of inhoud opslaan die gebruikers in HTML-formulieren invoeren, zoals creditcardnummers of persoonlijke adressen.
Wanneer een gebruiker een website voor de eerste keer bezoekt, wordt er een cookie van de webserver naar de browser gestuurd en op zijn computer opgeslagen. Wanneer hij vervolgens terugkeert naar de website, zal de website hem herkennen aan de informatie die in de cookie is opgeslagen.
Authenticatiecookies zijn een veelgebruikte methode om te bepalen of een gebruiker is ingelogd op een website of niet. Zonder een dergelijk mechanisme zal het voor de website moeilijk zijn om te weten wanneer persoonlijke informatie naar de gebruiker moet worden verzonden, en zal de gebruiker worden gedwongen meerdere keren in te loggen. Hoewel authenticatiecookies erg handig zijn, creëren ze mogelijkheden voor hackers om gevoelige gegevens in cookies te lezen en daardoor acties uit te voeren die gebruikers schade berokkenen.
2. Overzicht van HTTP-cookies
2.1. Geschiedenis
De term cookie is afgeleid van de term magische cookie, een onveranderlijk stukje gegevens dat door een computerprogramma wordt verzonden en ontvangen. Een programmeur genaamd Lou Montuli kwam in 1994 op het idee om magische cookies te gebruiken in webcommunicatie. Destijds werkte hij voor Netscape Communications aan een project om e-commercetoepassingen voor MCI te ontwikkelen. Cookies zijn gebruikt als oplossing bij het bouwen van virtuele winkelwagentjes, waardoor de servers van MCI de status van transacties niet hoeven op te slaan, maar in plaats daarvan op de computer van de gebruiker worden opgeslagen.
Samen met John Giannandrea schreef Montuli de eerste specificatie voor Netscape-cookies. Versie 0.0bèta van Mozaïek Netscape, uitgebracht op 13 oktober 1994, ondersteunde cookies. Bij het eerste gebruik van cookies (buiten het laboratorium) werd gecontroleerd of een klant die de website van Netscape bezocht, deze al eerder had bezocht of niet. Montuli kreeg in 1995 een cookiepatent. En Internet Explorer versie 2 (uitgebracht in oktober 1995) bevatte het gebruik van cookies.
De introductie van cookies was in deze tijd niet wijdverspreid. In het bijzonder worden cookies standaard geaccepteerd, gebruikers worden niet op de hoogte gesteld van hun aanwezigheid. Het publiek hoorde pas over cookies nadat er op 12 februari 1996 een artikel over cookies in de Financial Times was gepubliceerd. Sindsdien hebben cookies veel aandacht gekregen, vooral de privé-informatie die ze bevatten. Cookies werden besproken tijdens twee hoorzittingen van de Amerikaanse Federal Trade Commission in 1996 en 1997.
De eerste discussie over een formele cookiespecificatie begon in april 1995. Om dit werk uit te voeren werd een speciale groep binnen de Internet Engineering Task Force (IETF) gevormd. Ten slotte werd de specificatie in februari 1997 door de groep gepubliceerd. De specificatie definieerde cookies van derden als niet voor iedereen acceptabel, of in ieder geval niet standaard ingeschakeld.
In april 2011 is de standaardspecificatie voor cookies in de praktijk gepubliceerd in document RFC 6265 .
2.2. Terminologie
Sessiecookies
Sessiecookies, ook wel in-memory cookies of tijdelijke cookies genoemd, bestaan alleen in het tijdelijke geheugen terwijl de gebruiker naar de website navigeert. Als er geen vervaldatum of geldigheidsinterval is ingesteld op het moment dat de cookie wordt aangemaakt, wordt er een sessiecookie geplaatst. Normaal gesproken verwijderen webbrowsers automatisch sessiecookies wanneer de gebruiker de browser sluit.
Permanente cookies
Persistente cookies verlengen de sessie van de gebruiker. Als een permanente cookie is ingesteld op een maximale leeftijd van 1 jaar, wordt gedurende die periode de initiële waarde die in de cookie is ingesteld, elke keer dat de gebruiker de website bezoekt naar de server verzonden. Het kan worden gebruikt om belangrijke stukjes informatie vast te leggen, zoals hoe de gebruiker de website voor het eerst heeft bezocht. Om deze reden worden permanente cookies ook wel tracking cookies genoemd.
Veilige cookies
Veilige cookie is een beveiligingskenmerk dat wordt ingeschakeld bij het gebruik van HTTPS en ervoor zorgt dat de cookie altijd wordt gecodeerd wanneer deze van client naar server wordt overgedragen, waardoor afluisteren en het onthullen van informatie wordt voorkomen. Bovendien moeten alle cookies voldoen aan het same-origin-beleid van de browser.
HttpOnly-cookies
Het HttpOnly-kenmerk van cookies wordt door de meeste browsers ondersteund. Een HttpOnly-sessiecookie wordt slechts in één HTTP- (of HTTPS-)verzoek gebruikt, waardoor de toegang door niet-HTTP-API's zoals Javascript wordt beperkt. Deze beperking beperkt de diefstal van cookies via Cross-site scripting (XSS)-kwetsbaarheden, maar elimineert deze niet.
Cookies van derden
First-party cookies zijn cookies die tot hetzelfde domein (of subdomeinen binnen hetzelfde domein) behoren en worden weergegeven in de adresbalk van de browser. Cookies van derden zijn cookies die tot verschillende domeinen behoren en die in de adresbalk van de browser worden weergegeven. Websites kunnen inhoud bevatten van domeinen van derden (zoals banneradvertenties), van waaruit de browsegeschiedenis van gebruikers kan worden gevolgd. De privacy-instellingen van de meeste browsers blokkeren trackingcookies van derden.
Stel dat een gebruiker bijvoorbeeld de website example1.com bezoekt . Deze website bevat een advertentie van ad.foxytracking.com. Wanneer deze is geladen, worden de cookies van ad.foxytracking.com opgeslagen. Vervolgens bezoekt hij een andere website (example2.com), die ook een advertentie van ad.foxytracking.com bevat, en die ook een cookie plaatst van ad.foxytracking.com. Ten slotte worden beide cookies naar de adverteerder gestuurd wanneer hij advertenties laadt of zijn website bezoekt. Adverteerders kunnen deze cookies gebruiken om de browsegeschiedenis van een gebruiker op te bouwen op alle websites die hun advertenties bevatten.
In 2014 waren er enkele websites die cookies plaatsten die door meer dan 100 domeinen van derden konden worden gelezen. Gemiddeld worden er op een website ongeveer 10 cookies geplaatst, met een maximaal aantal cookies van meer dan 800.
Superkoekje
Een supercookie is een cookie afkomstig van een topniveaudomein, zoals .com, of een publiek achtervoegsel, zoals .co.uk. Het is belangrijk dat supercookies door browsers worden geblokkeerd vanwege bepaalde beveiligingsproblemen. Als de blokkering wordt opgeheven, kan een aanvaller die een kwaadaardige website beheert een supercookie instellen om gebruikersverzoeken na te bootsen en verzoeken te verzenden naar andere websites die hetzelfde topniveaudomein of hetzelfde openbare achtervoegsel delen. Een supercookie afkomstig van het .com-domein kan bijvoorbeeld verzoeken aan example.com schaden, zelfs als de cookie niet afkomstig is van example.com. Het kan worden misbruikt om logins te vervalsen of gebruikersinformatie te wijzigen.
Zombiekoekjes
Zombie-cookies zijn cookies die automatisch opnieuw worden aangemaakt nadat de gebruiker ze heeft verwijderd. Dit wordt gedaan door een script dat de inhoud van de cookie op een andere locatie opslaat, zoals een Flash-inhoudsopslag, een HTML5-opslag of een ander mechanisme aan de clientzijde.
2.3. Cookie-structuur
Een cookie met een grootte van 4 KB bevat 7 hoofdcomponenten:
- Naam
- Waarde
- Verloopt (vervaldatum)
- Pad (pad naar waar de cookie geldig is, “/” betekent dat de cookie op elk pad geldig is)
- Domein
- Zeker
- Alleen HTTPP
De eerste twee componenten (naam en waarde) zijn vereist.
2.4. Gebruik
Sessiebeheer
Cookies kunnen worden gebruikt om gebruikersgerelateerde gegevens over meerdere websitebezoeken bij te houden. Cookies zijn een oplossing voor het maken van een winkelwagentje, een virtueel winkelwagentje waarmee gebruikers de items kunnen opslaan die ze kiezen terwijl ze door producten bladeren.
Huidige winkelwagenapplicaties slaan de lijst met items in het winkelwagentje vaak op in de database op de server in plaats van deze op te slaan in een cookie aan de clientzijde. De webserver verzendt normaal gesproken een cookie met daarin de sessie-ID - sessie-ID (die uniek is). De webbrowser retourneert deze sessie-ID bij het winkelverzoek van elke gebruiker.
Gebruikers toestaan in te loggen op websites is een andere toepassing van cookies. Normaal gesproken stuurt de webserver de klant tijdens de eerste keer inloggen een cookie met daarin de sessie-ID. Gebruikers zullen hun informatie indienen en de webapplicatie zal de sessie authenticeren en de gebruiker vervolgens toestaan zijn diensten te gebruiken.
Cookies bieden een snel en gemakkelijk client/server-interactiemechanisme. Een van de voordelen van cookies is dat ze gebruikersinformatie opslaan in een bestand op de computer van de gebruiker. Dit vermindert de opslagruimte en verwerkingstijd van de server aanzienlijk.
Gepersonaliseerd
Cookies kunnen worden gebruikt om de persoonlijke gegevens van een gebruiker te onthouden wanneer deze een website bezoekt, om relevantere inhoud aan die gebruiker weer te geven telkens wanneer hij de website opnieuw bezoekt.
Een prominent voorbeeld is de functie voor boekaanbevelingen van Amazon.com. Wanneer een gebruiker op een boek klikt, doet Amazon suggesties over de volgende boeken die de gebruiker zou moeten bekijken. Deze suggesties zijn gebaseerd op de boeken die gebruikers eerder hebben bekeken en welke boeken ze hebben gekocht.
Een ander voorbeeld is de zoeksuggestiefunctie van Google Zoeken. Wanneer u inlogt met uw persoonlijke account en een zoekopdracht uitvoert, geeft Google suggesties "speciaal voor u", en de gewenste resultaten verschijnen altijd bovenaan de lijst.
Monitor
Trackingcookies kunnen worden gebruikt om de browsegeschiedenis van een gebruiker bij te houden. Dit kan ook worden gedaan met behulp van het IP-adres van de computer die het verzoek naar de website verzendt of door te vertrouwen op het Referrer-veld van de HTTP-verzoekheader, maar cookies bieden meer precisie. Dit gebeurt als volgt:
- Als een gebruiker een website bezoekt, maar dit verzoek bevat geen cookie, gaat de server ervan uit dat dit de eerste keer is dat de gebruiker deze website bezoekt; De server genereert een willekeurige reeks en stuurt deze als cookie samen met de opgevraagde webpagina terug naar de browser.
- Vanaf dit punt wordt de cookie automatisch door de browser naar de server verzonden telkens wanneer een nieuwe webpagina op deze website wordt opgevraagd. De server retourneert de opgevraagde webpagina zoals normaal, maar met de URL van die webpagina en de De toegang wordt opgeslagen in een logbestand. Door de informatie die in dit logbestand is opgeslagen te analyseren, worden de browsegeschiedenis, vaak bezochte websites en surfgedrag van de persoon onthuld.
2.5. Inzet

Cookies zijn gegevens die van de server naar de browser worden verzonden. De browser stuurt het vervolgens terug naar de server zonder de inhoud daarin te wijzigen, telkens wanneer de gebruiker een verzoek naar de website verzendt. Cookies kunnen ook worden ingesteld door een scripttaal, zoals Javascript.
Elke webbrowser kan minimaal 300 cookies opslaan in een bestand van 4 KB, en minimaal 20 cookies per server of domein.
Cookies instellen
De webserver en browser communiceren met elkaar via HTTP (HyperText Transfer Protocol). Om bijvoorbeeld toegang te krijgen tot de pagina http://www.example.org/index.html, maakt de browser verbinding met de server door een HTTP-verzoek als volgt te verzenden:
![Web11: HTTP-cookies en enkele beveiligingsproblemen Web11: HTTP-cookies en enkele beveiligingsproblemen]()
De server reageert door de browser een eenvoudig tekstpakket te sturen, een zogenaamde HTTP-reactie. Dit pakket kan een regel bevatten met de inhoud van de cookie:
![Web11: HTTP-cookies en enkele beveiligingsproblemen Web11: HTTP-cookies en enkele beveiligingsproblemen]()
Set-Cookie is een veld dat de browser de opdracht geeft om de cookie op te slaan en deze in de toekomst naar de server te sturen telkens wanneer er een verzoek aan de server is (als de cookie nog verlopen is). De browser stuurt bijvoorbeeld een verzoek naar http://www.example.org/spec.html door een HTTP-verzoek als volgt te verzenden:
![Web11: HTTP-cookies en enkele beveiligingsproblemen Web11: HTTP-cookies en enkele beveiligingsproblemen]()
Dit is een verzoek naar een andere pagina die tot dezelfde server behoort. In dit geval begrijpt de server dat dit verzoek verband houdt met het vorige verzoek en reageert hij door de opgevraagde webpagina naar de browser te sturen, waarbij mogelijk andere cookiewaarden worden toegevoegd.
De waarde van de cookie kan door de server worden gewijzigd door het veld Set-Cookie: naam=waarde in het HTTP-antwoord naar de browser te sturen. De browser zal dan de oude cookiewaarde vervangen door deze nieuwe waarde.
De cookiewaarde kan elk afdrukbaar ASCII-teken bevatten, behalve “,”, “;” en witte ruimte. Cookienamen mogen ook niet het teken '=' bevatten, omdat dat het teken is dat de naam en de waarde scheidt.
De term kruimelkoekje wordt soms gebruikt om te verwijzen naar het naam-waardepaar van een cookie.
Cookies kunnen ook worden geplaatst door Javascript of een vergelijkbare scripttaal. In Javascript wordt het object document.cookie gebruikt om cookies in te stellen. Het HttpOnly-attribuut is verantwoordelijk voor het voorkomen dat slechte scripts de cookie-inhoud lezen.
Cookie-eigenschappen
Naast het naam-waarde-paar kan de server nog een aantal andere cookie-eigenschappen instellen: Domein, Pad, Vervaldatum, Max-Age, Veilig en HttpOnly. De browser verzendt deze kenmerken niet naar de server, maar verzendt alleen het naam-waardepaar. Deze kenmerken worden door de browser gebruikt om te bepalen wanneer cookies moeten worden verwijderd, cookies moeten worden geblokkeerd of cookies naar de server moeten worden verzonden.
Domein en pad
Domein en pad bepalen de reikwijdte van de cookie. Ze stellen de browser in staat te bepalen wanneer cookies naar de server moeten worden verzonden. Als dit niet is opgegeven, worden standaard het domein en het pad van het aangevraagde object gebruikt. Er is echter een verschil tussen een cookieset voor foo.com zonder het domeinkenmerk en een cookieset met het domein foo.com-kenmerk. In het eerste geval wordt de cookie alleen verzonden als er een verzoek is bij foo.com. In dit laatste geval wordt de cookie naar alle subdomeinen van foo.com verzonden. Hier volgt een voorbeeld van een Set-Cookie-instructie van een website nadat de gebruiker heeft ingelogd, vanuit een verzoek aan docs.foo.com:
![Web11: HTTP-cookies en enkele beveiligingsproblemen Web11: HTTP-cookies en enkele beveiligingsproblemen]()
De eerste cookie-LSID heeft geen domeinkenmerk en heeft het pad /accounts. De browser verzendt alleen cookies als de opgevraagde pagina zich in docs.foo.com/accounts bevindt. De overige twee cookies, HSID en SSID, worden teruggestuurd naar de server als er een verzoek is naar een subdomein van foo.com.
Cookies kunnen ook alleen worden ingesteld voor het topdomein en de subdomeinen ervan. Het plaatsen van cookies op www.foo.com van www.bar.com is om veiligheidsredenen niet toegestaan.
Verloopt en maximale leeftijd
Het Expires-attribuut vertelt de browser wanneer de cookie moet worden verwijderd. De datum in Expires ziet er als volgt uit: "Wdy, DD Mon JJJJ UU:MM:SS GMT". Max-Age wordt ook gebruikt om de vervaldatum van een cookie aan te geven. Laten we het volgende voorbeeld bekijken:
![Web11: HTTP-cookies en enkele beveiligingsproblemen Web11: HTTP-cookies en enkele beveiligingsproblemen]()
De eerste cookie verloopt op 15 januari 2013 en wordt door de browser gebruikt wanneer deze vervalt. De tweede cookie made_write_conn verloopt niet en wordt gebruikt als sessiecookie. Deze wordt verwijderd wanneer de browser wordt uitgeschakeld. De derde cookie reg_fb_gate heeft een vervaldatum in het verleden en wordt onmiddellijk verwijderd.
Veilig en HttpOnly
De eigenschappen Secure en HttpOnly zijn nul; in plaats daarvan geeft hun aanwezigheid aan dat de bases Secure en HttpOnly worden toegepast.
Het Secure-attribuut zorgt ervoor dat de cookie-overdracht binnen een gecodeerde verbinding blijft. Als de webserver vanuit een niet-beveiligde verbinding een cookie met het secure attribuut instelt, kan de cookie alsnog onderschept worden door een man-in-the-middle-aanval.
Het HttpOnly-attribuut instrueert de browser om cookies niet bloot te stellen via een andere verbinding dan HTTP (of HTTPS), zoals JavaScript, en maakt het daarom moeilijk om cookies te verkrijgen door misbruik te maken van Cross-Site Scripting (XSS)-kwetsbaarheden.
3. Enkele beveiligingsproblemen bij het gebruik van cookies
Als een website sessie-ID gebruikt om de sessie van een gebruiker te identificeren, kan een aanvaller mogelijk de cookie stelen om zich voor te doen als de gebruiker. Hier zijn enkele veelvoorkomende scenario's voor cookiediefstal:
Afluisteren
![Web11: HTTP-cookies en enkele beveiligingsproblemen Web11: HTTP-cookies en enkele beveiligingsproblemen]()
Verkeer in een netwerk kan worden onderschept en gelezen door een derde partij (anders dan de ontvanger en de afzender). Dit verkeer omvat cookies. Als de verzending niet gecodeerd is, kan een aanvaller de gevoelige informatie in de cookie lezen. En door gebruik te maken van deze informatie, zullen aanvallers zich voordoen als gebruikers om gevaarlijke acties uit te voeren, zoals banktransacties.
Dit probleem kan worden opgelost door een veilig protocol te gebruiken tussen de computer van de gebruiker en de server: het HTTPS-protocol. De server kan de Secure-vlag gebruiken bij het instellen van cookies. De cookie wordt dan alleen via een gecodeerd kanaal verzonden, zoals een SSL-verbinding.
Cross-site scripting
![Web11: HTTP-cookies en enkele beveiligingsproblemen Web11: HTTP-cookies en enkele beveiligingsproblemen]()
Scripttalen, zoals JavaScript, mogen cookiewaarden lezen en naar willekeurige servers sturen.
Stel dat een website een Cross-site scriptingfout heeft, dan kunnen hackers kwaadaardige code invoegen, zoals de volgende:
![Web11: HTTP-cookies en enkele beveiligingsproblemen Web11: HTTP-cookies en enkele beveiligingsproblemen]()
Wanneer het slachtoffer op bovenstaande link klikt, voert de browser het script uit in het onclick-attribuut: het verzenden van de cookie van het slachtoffer naar de server hacker.com.
Cross-site scripting is een van de meest voorkomende kwetsbaarheden van websites (op de derde plaats in de top 10 van meest voorkomende kwetsbaarheden in 2013 - volgens OWASP).
Het risico op deze kwetsbaarheid kan worden beperkt door de HttpOnly-vlag voor cookies in te stellen. Op dat moment zijn cookies niet toegankelijk voor scripttalen.
Vervalsing op meerdere locaties
CSRF (Cross-site request forgery) of one-click-aanval is een methode om kwetsbaarheden in websites te misbruiken, waarbij ongeoorloofde opdrachten worden uitgevoerd door slachtoffers - gebruikers die zonder hun medeweten door de website zijn geautoriseerd.
CSRF zal de browser van het slachtoffer misleiden om http-verzoeken naar webapplicaties te verzenden. Indien de sessie van het slachtoffer niet is verlopen, worden bovenstaande verzoeken gedaan met de authenticatierechten van het slachtoffer.
Slachtoffer Bob voert bijvoorbeeld transacties uit op de website van bepaalde bank X. Fred is de aanvaller, deze man weet hoe de website van bank X werkt als hij als volgt geld wil overboeken van rekening A naar rekening B:
http://bank.example.com/withdraw?account=accountA&amount=100&for=accountB
Hij zal Bob een kwaadaardig bericht sturen.
Als bank X gebruikersauthenticatiegegevens in een cookie opslaat en Bob op bovenstaande link klikt, wordt het geld van Bob overgemaakt naar Fred.
Om dit risico te beperken kunnen er Expires-parameters worden ingesteld voor cookies.
4. Conclusie
Tegenwoordig worden in de meeste webapplicaties cookies gebruikt. Het bevat ook potentiële risico's die aanzienlijke gevolgen kunnen hebben voor de gebruikers. Daarom moeten we aan de kant van de ontwikkelaar cookies duidelijk begrijpen en weten hoe we de noodzakelijke parameters moeten instellen, zodat de applicatie veiliger kan zijn tegen aanvallen van hackers.