Http cookies

© 2006 Hein Pragt

De laatste jaren is er veel ophef over cookies op Internet. Een cookie is een (kleine) hoeveelheid data die een internetserver naar de webbrowser stuurt met de bedoeling dat deze opgeslagen wordt en bij een volgend bezoek weer naar de webserver teruggestuurd wordt. Zo kan de webserver (applicatie) bijhouden wat de gebruiker (de webbrowser) in het verleden heeft gedaan. Vanwege de privacyaspecten is het gebruik van cookies soms omstreden.

Introductie in Http cookies

Introductie in Http cookiesCookies zijn kleine stukjes (tekst) informatie die een server naar de browser stuurt met de bedoeling dat de browser deze informatie bij een volgend bezoek deze informatie weer naar de server terug zal sturen. Aangezien HTTP (het Internet protocol waarmee browsers verzoeken kunnen sturen naar servers en servers data terug kunnen sturen naar browsers) zogenaamd 'stateless' is, is na ieder verzoek en reactie van de webserver de transactie afgesloten en elk ander nieuw verzoek zal een nieuwe transactie zijn. Kortom de webserver weet niet dat er relaties zijn tussen verschillende verzoeken om een pagina of data. Dit kan lastig zijn als u bijvoorbeeld aan het telebankieren bent wilt u niet bij iedere pagina opnieuw inloggen. Er zijn twee methodes om relaties te leggen tussen HTTP verzoeken.

De eerste is een sessie variabele aan elke link koppelen zodat de webserver kan zien dat het verzoek een samenhang heeft met een eerder verzoek. De tweede methode is het gebruiken van een cookie. Bij het eerste verzoek om een pagina zal de server een cookie naar de browser sturen, die deze zal opslaan. Omdat bij ieder nieuw verzoek van de browser (onzichtbaar voor de gebruiker) de naam en inhoud van de cookie naar de server verzonden zal worden, kan de server een samenhang met een eerder verzoek vaststellen. Op de webserver zal de data van de verschillende verzoeken in een bestandje of in het geheugen bewaard worden (sessie data) waardoor het lijkt alsof de browser gebruiker een samenhangende verbinding heeft met de webserver.

Een groot nadeel van cookies is echter dat deze informatie ook privé kan zijn en reclame bedrijven deze cookies misbruikt hebben om informatie over het surfgedrag van de gebruiker vast te leggen. Met de huidige browsers en cookie technologie is dit misbruik echter bijna niet meer mogelijk. U kunt uw browser zo instellen, dat u wordt gewaarschuwd voor cookies, zodat u kunt kiezen of u de cookie wel of niet wilt accepteren. Soms hebt u geen toegang tot een webpagina als u de cookie niet accepteert. Een cookie kan niet worden uitgevoerd als code en het kan geen virussen verspreiden, is uniek en kan alleen worden gelezen door de webserver die u de cookie heeft gegeven.

Geschiedenis van Http cookies

Cookies zijn voor het eerst in Netscape 1.0 geïntroduceerd, Internet Explorer ondersteunde cookies pas vanaf versie 3. Cookies werden pas zichtbaar voor Internetgebruikers toen in Netscape 3 een optie kwam die gebruikers in staat stelde om gewaarschuwd te worden wanneer er geprobeerd werd een cookie te plaatsen.

Advertentiebureaus ontdekten het cookie ook en gingen het misbruiken voor het bijhouden van surfgedrag. In 1997 kwam er een voorstel dat browsermakers aanmoedigde om het gebruik van cookies inzichtelijker te maken voor de gebruiker. Het gevolg hiervan was dat de gebruiker vanaf toen kon instellen welke cookies geaccepteerd mogen worden.

Cookies kwamen in opspraak toen een bekend Internet advertentiebureau DoubleClick een bedrijf overnam met een grote klantendatabase. DoubleClick wilde de naamsgegevens koppelen aan de profielen van surfers en was van plan deze gegevens te verkopen. Onder druk van verschillende privacy organisaties heeft DoubleClick de gegevens niet verkocht.

In 2002 is de eerste P3P recommendation www.w3.org/TR/P3P gepubliceerd door de W3C. Browsers die zich aan deze specificatie houden, accepteren standaard veel minder cookies. De gebruiker kan desgewenst de instellingen van de browser aanpassen.

Specificaties Http cookies

(vertaling oorspronkelijke specificatie van Netscape)

Een cookie zal naar de client (browser) verzonden worden als een Set-Cookie header als onderdeel van een HTTP response. Meestal zal de cookie door een CGI script gegenereerd worden.

Syntax van de Set-Cookie HTTP Response Header

Dit is het formaat van de data die een CGI script kan toevoegen aan de HTTP headers om een stukje data naar de client (browser) te sturen om deze op een later tijdstip weer terug te ontvangen.

Set-Cookie: NAME=waarde; expires=datum; path=pad; domain=naam; secure

NAME=waarde
Dit is het enige verplichte attribuut van de Set-Cookie header.
Deze tekenreeks is een opeenvolging van karakters exclusief puntkomma, komma, spaties en tabs. Als er een behoefte is om dergelijke tekens in de naam of de waarde te plaatsen, is de codeer methode zoals URL stijl %XX de aanbevolen methode, hoewel de wijze van coderen niet bepaald of vereist is.

expires=datum (optioneel)
Dit is een optioneel attribuut, wanneer het niet aanwezig is zal de cookie verlopen als de client sessie afgelopen is, lees de browser afgesloten is. Het expires attribuut specificeert een datum tekenreeks die de geldige levensduur van dat cookie bepaalt. Zodra de vervaldatum is bereikt, zal het koekje niet meer opgeslagen worden of naar de server verzonden worden.
Het datum format is:

Wdy, DD-Mon-YYYY HH:MM:SS GMT

Dit is gebaseerd op RFC 822, RFC 850, RFC 1036, and RFC 1123, met als enige aanpassing dat de enige geldige tijdzone GMT is en de scheidingtekens tussen de elementen streepjes moeten zijn.

domain=naam (optioneel)
Wanneer de client (browser) zal zoeken in de cookie lijst naar geldige cookies, wordt een vergelijking van de domeinattributen van het koekje gemaakt met de 0 domeinnaam van de Internet host waar het verzoek naar toe gaat. Wanneer er vanaf het einde van de URL een gelijkenis is op domeinnaam, dan zal het pad dat achter de domeinnaam staat vergeleken worden. Vergelijken vanaf het einde van het domein betekent dat het domeinattribuut met het einde van de volledig gekwalificeerde domeinnaam van de gastheer wordt vergeleken. Een domeinattribuut van "acme.com zou" een correcte vergelijking opleveren voor "anvil.acme.com" en "shipping.crate.acme.com".
In de naam moeten minimaal 3 punten voorkomen, alleen Internet host computers in een select aantal toplevel domeinen mogen minimaal 2 punten in de naam hebben. De volgende 7 toplevel domeinen mogen 2 punten hebben, "COM", "EDU", "NETTO", "ORG", "REGERING", "MIL", en "INT". De standaardwaarde van domein naam is de hostnaam van de server die het cookie verzoek produceerde.

path=pad (optioneel)
Het pad attribuut wordt gebruikt om een ondergroep van URLs in een domein te specificeren waarvoor het koekje geldig is. Als een koekje al op domein niveau valide is, dan wordt het pad component van URL vergeleken. Wanneer deze ook overeenkomt wordt het koekje beschouwd als geldig en samen met het verzoek verzonden. Het pad "/foo" zou matchen met "/foobar" en "/foo/bar.html". Pad "/" is de meest algemene weg en geeft een correct vergelijk op alle onderliggende paden. Als het pad niet wordt gespecificeerd dan zal het pad uit de header die de cookie verstuurd overgenomen worden.

secure (optioneel)
Als een koekje de markering secure heeft zal het alleen verzonden worden door de client (browser) wanneer de verbinding veilig is. Momenteel betekent dit dat de veilige koekjes slechts zullen verzonden worden naar (http over ssl) servers. (https). Wanneer secure niet wordt gespecificeerd zal de cookie zowel over veilige als niet veilige kanalen verzonden worden.

Syntax van de Cookie HTTP Request Header

Wanneer een HTTP verzoek naar een Internet host gaat zullen er extra headers meegezonden worden wanneer de cookie vergelijking overeenkomt. Per cookie zal de naam en waarde meegezonden worden. Hier is het formaat van een cookie header regel:

Cookie: NAME1=STRING1; NAME2=STRING2

Aanvullende informatie:


Cookies in PHP

setcookie (PHP 3, PHP 4, PHP 5)

Beschrijving:

boolean setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]] )

setcookie() defineert een cookie dat wordt meegezonden met de rest van de header informatie. Zoals elke header moeten cookies verzonden worden voordat er output verzonden wordt vanuit uw script (dit is een restrictie van het protocol). Daarom moet u deze functie aanroepen voor enige output, zoals <html> of <head> tags en whitespace. Als er toch output wordt doorgegeven voor het aanroepen van deze functie, dan zal setcookie() falen en FALSE terug geven. Als alles goed is gegaan, geeft hij TRUE terug. Dit wil echter niet zeggen dat de gebruiker het cookie geaccepteerd heeft.

Alle argumenten behalve de name parameter zijn optioneel. Als alleen het name argument aanwezig is, wordt het cookie met die naam verwijderd van de remote client. U mag een willekeurig argument ook vervangen door een lege string ("") om dat argument over te slaan. De expire en secure argumenten zijn integers en kunnen niet worden overgeslagen met een lege string. Gebruik in plaats daarvan een nul (0). De expire parameter is een normaal Unix tijds integer zoals wordt teruggegeven door de time() of mktime() functies. De secure geeft aan dat het cookie alleen mag worden verzonden over een veilige HTTPS verbinding.

Wanneer cookies eenmaal zijn ingesteld, kunnen ze worden opgeroepen op de volgende pagina met de $_COOKIE of $HTTP_COOKIE_VARS array. Let op dat autoglobals zoals $_COOKIE vanaf PHP 4.1.0 pas aanwezig zijn. $HTTP_COOKIE_VARS bestaat al vanaf PHP 3.

Veel voorkomende fouten:

Cookies worden niet zichtbaar tot de volgende keer dat een pagina waarop het cookie zichtbaar is wordt geladen. Om te testen of een cookie succesvol is meegegeven, controleer dan voor cookies bij het laden van de pagina voor de cookie verloopt. De verlooptijd kunt u instellen met de expire parameter.

Cookies moeten worden verwijderd met dezelfde parameters als waarmee ze werden ingesteld.

Cookie namen kunnen aangegeven zijn als array namen en zullen dan aanwezig zijn in uw PHP scripts als array, maar worden bij de gebruiker als aparte cookies opgeslagen. Overweeg explode() of serialize() om één cookie te gebruiken die meerdere namen en waardes bevat.

In PHP 3 worden meerdere aanroepen van setcookie() in hetzelfde script verwerkt in omgekeerde volgorde. Als u probeert een cookie te verwijderen voordat u een nieuwe neerzet, moet u het toevoegen doen voor het verwijderen. In PHP 4 worden meerdere aanroepen van setcookie() verwerkt in de volgorde waarop ze worden aangeroepen.

Een paar voorbeelden volgen over hoe u cookies kunt verzenden:

Voorbeeld 1. setcookie() stuur voorbeelden

setcookie ("TestCookie", $value);
setcookie ("TestCookie", $value,time()+3600);  /* verloopt in 1 uur */
setcookie ("TestCookie", $value,time()+3600, "/~rasmus/", ".utoronto.ca", 1);  

Wanneer u een cookie verwijdert moet u zorgen dat de expire datum in het verleden is, om het verwijder mechanisme in de browser te activeren. Er volgen voorbeelden hoe u in het vorige voorbeeld verzonden cookies kunt verwijderen:

Voorbeeld 2. setcookie() verwijder voorbeelden

// zet de verlooptijd naar 1 uur in het verleden
setcookie ("TestCookie", "", time() - 3600);
setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".utoronto.ca", 1);  

Let er op dat het waarde deel van het cookie automatisch wordt ge-urlencoded wanneer u het cookie verzendt, en wanneer het wordt ontvangen, wordt het automatisch gedecodeerd en toegewezen aan een variabele met dezelfde naam als de cookie naam. Om de inhoud van ons test cookie in een script te zien, kunt u simpelweg een van de volgende voorbeelden gebruiken:

echo $TestCookie;
echo $_COOKIE["TestCookie"];  

U kunt ook array cookies zetten door array notatie in de cookie naam te gebruiken. Dit heeft het effect dat er evenveel cookies worden neergezet als u array elements hebt, maar als het cookie wordt ontvangen door uw script worden de waarden allemaal geplaatst in een array met de naam van het cookie:

setcookie ("cookie[three]", "cookiethree");
setcookie ("cookie[two]", "cookietwo");
setcookie ("cookie[one]", "cookieone");
if (isset ($cookie)) {
   while (list ($name, $value) = each ($cookie)) {
       echo "$name == $value<br>\n";
   }
}  

Last update: 13-05-2015

Disclaimer: Hoewel de heer Pragt de informatie beschikbaar op deze site met grote zorg samenstelt, sluit hij alle aansprakelijkheid uit met betrekking tot de informatie die via deze site wordt aangeboden. Op de artikelen van de heer Pragt rust auteursrecht, overname van tekst en afbeeldingen is uitsluitend toegestaan na voorafgaande schriftelijke toestemming. Voor vragen hierover kunt u contact opnemen met: (email: mail@heinpragt.com). Heinpragt.com is ingeschreven bij de KvK onder nummer: 73839426.  Lees hier de privacyverklaring van deze site. Voor informatie over adverteren op deze site kunt u contact opnemen met: (email: mail@heinpragt.com).