Piškotki so majhni podatki, ki jih spletno mesto shrani v brskalnik. Uporabljajo se za ohranjanje prijave, prepoznavanje seje, shranjevanje nastavitev in za druge primere, pri katerih mora spletna aplikacija med več zahtevki ohraniti določeno stanje. V JavaScriptu do piškotkov najpogosteje dostopamo z lastnostjo document.cookie.
Pomni: Piškotki se lahko skupaj z zahtevki pošiljajo strežniku, medtem ko se podatki v localStorage strežniku ne pošiljajo samodejno. Zato piškotki in localStorage niso namenjeni istim nalogam.
Osnovna pravila
- Piškotek je sestavljen iz imena, vrednosti in morebitnih dodatnih atributov.
- V JavaScriptu piškotek nastavimo tako, da lastnosti
document.cookiepriredimo niz z opisom piškotka. - Branje posameznega piškotka zahteva obdelavo niza, ki ga vrne
document.cookie. - Piškotek izbrišemo tako, da mu nastavimo pretekli datum veljavnosti ali
max-age=0. - JavaScript ne more dostopati do piškotkov, ki so označeni z atributom
HttpOnly.
Primerjave
Piškotki in localStorage
Piškotki in localStorage omogočajo shranjevanje podatkov v brskalniku, vendar med njima obstajajo pomembne razlike. Piškotki so primerni predvsem takrat, ko mora podatke poznati tudi strežnik, medtem ko je localStorage namenjen predvsem shranjevanju podatkov, ki jih uporablja JavaScript v brskalniku.
| Lastnost | Piškotki | localStorage |
|---|---|---|
| Pošiljanje strežniku | lahko se pošiljajo skupaj s zahtevki | ne pošilja se samodejno |
| Dostop iz JavaScripta | da, razen pri HttpOnly |
da |
| Veljavnost | določimo jo z atributi, na primer expires ali max-age |
ostane shranjen, dokler ga ne izbrišemo |
| Tipična uporaba | seje, prijava, nastavitve, ki jih mora poznati strežnik | nastavitve vmesnika, lokalni podatki na strani odjemalca |
expires in max-age
Atribut expires določa točen datum poteka piškotka, atribut max-age pa določa trajanje v sekundah. Pri sodobni rabi je pogosto pregledneje uporabiti max-age.
| Atribut | Opis |
|---|---|
expires |
določa točen datum in čas, do katerega piškotek velja |
max-age |
določa število sekund do poteka veljavnosti piškotka |
Atributi piškotkov
Pri sodobni uporabi piškotkov so pomembni predvsem atributi, ki vplivajo na obseg veljavnosti in na varnost.
| Atribut | Opis |
|---|---|
path |
določa, na katerem delu spletnega mesta je piškotek na voljo |
secure |
določa, da se piškotek pošilja samo prek povezave HTTPS |
samesite |
določa, v katerih primerih se piškotek pošilja tudi v navzkrižnih zahtevkih |
HttpOnly |
določa, da piškotek ni dostopen iz JavaScripta |
Pozor: Če je nastavljen SameSite=None, mora biti nastavljen tudi atribut Secure. Piškotka z atributom HttpOnly pa JavaScript ne more prebrati in ga tudi ne more nastaviti z lastnostjo document.cookie.
Preverjanje podpore za piškotke
Pred uporabo piškotkov lahko preverimo, ali ima uporabnik v brskalniku omogočeno njihovo uporabo. Za to uporabimo lastnost navigator.cookieEnabled, ki vrne logično vrednost true ali false.
<p id="primer0"></p>
<script>
document.getElementById("primer0").innerHTML =
"Piškotki so omogočeni: " + navigator.cookieEnabled;
</script>
Nastavljanje piškotka
Piškotek nastavimo tako, da lastnosti document.cookie priredimo niz. Ta niz vsebuje ime, vrednost in po potrebi še dodatne atribute.
<script>
function nastaviPiskotek() {
document.cookie = "uporabnik=Ana; max-age=31536000; path=/; samesite=lax";
}
</script>
<input type="button" value="Nastavi piškotek" onclick="nastaviPiskotek()">
Branje piškotka
Lastnost document.cookie vrne niz, v katerem so zapisani vsi dostopni piškotki trenutne strani. Posamezno vrednost zato poiščemo z lastno funkcijo.
<p id="primer"></p>
<script>
function vrniPiskotek(ime) {
var iskano = ime + "=";
var deli = document.cookie.split(";");
for (var i = 0; i < deli.length; i++) {
var del = deli[i].trim();
if (del.indexOf(iskano) == 0) {
return decodeURIComponent(del.substring(iskano.length));
}
}
return null;
}
document.getElementById("primer").innerHTML =
"Vrednost piškotka uporabnik je: " + vrniPiskotek("uporabnik");
</script>
Brisanje piškotka
Piškotek izbrišemo tako, da mu nastavimo pretekel rok veljavnosti ali max-age=0. Pri tem moramo upoštevati tudi enak path, kot je bil uporabljen pri nastavitvi.
<script>
function izbrisiPiskotek() {
document.cookie = "uporabnik=; max-age=0; path=/; samesite=lax";
}
</script>
<input type="button" value="Izbriši piškotek" onclick="izbrisiPiskotek()">
Primer uporabe
Primer, v katerem uporabnik vnese svoje ime, je zaradi preglednosti pripravljen na posebni strani. Prikaz primera v novem oknu brskalnika.
Pomni: Za podatke, ki jih mora poznati tudi strežnik, praviloma uporabimo piškotke. Za podatke, ki jih potrebuje predvsem JavaScript na strani odjemalca, je pogosto primernejši localStorage.
Priporočila
- Pri piškotkih jasno določi namen in shrani le toliko podatkov, kolikor jih aplikacija res potrebuje.
- Za običajne primere uporabi
path=/, da je obseg veljavnosti piškotka jasen. - Atribut
samesitenastavi izrecno in ne računaj le na privzeto obnašanje brskalnika. - Pri občutljivih piškotkih uporabi
securein spletno mesto ponujaj prek povezaveHTTPS. - Pred uporabo piškotkov lahko preveriš lastnost
navigator.cookieEnabled.
Pogoste napake
- Piškotek se razume kot navadna spremenljivka, čeprav je dostop do njega vezan na lastnost
document.cookie. - Predpostavi se, da JavaScript lahko bere vse piškotke, čeprav do piškotkov z atributom
HttpOnlynima dostopa. - Pri brisanju piškotka se ne uporabi enak
path, zaradi česar piškotek ostane veljaven. - Atribut
SameSite=Nonese uporabi brez atributaSecure, zato piškotek ne deluje pravilno v sodobnih brskalnikih. - Podpora za piškotke se pred uporabo ne preveri, čeprav jo lahko preverimo z lastnostjo
navigator.cookieEnabled.