Soubory cookie v JavaScript: Set, Get & Delete Example

⚡ Chytré shrnutí

Soubory cookie v JavaSkript ukládá malé páry klíč-hodnota na počítači návštěvníka, aby si bezstavové HTTP připojení mohlo pamatovat informace. Tento článek vysvětluje, jak nastavovat, číst a mazat soubory cookie, popisuje všechny atributy souborů cookie a porovnává soubory cookie s alternativními úložišti prohlížeče.

  • 🍪 Základní definice: Soubor cookie je pár klíč-hodnota, který prohlížeč ukládá a automaticky vrací s každým odpovídajícím požadavkem.
  • __ Napsat Operaakce: Přiřazení k document.cookie přidává nebo nahrazuje pouze jeden soubor cookie a nikdy nesmaže ostatní.
  • 📖 číst Operaakce: Čtení souboru document.cookie vrací jeden řetězec oddělený středníkem, takže požadovanou dvojici je nutné rozdělit ručně.
  • 🗑️ Vymazat Operaakce: Nastavení data platnosti v minulosti odstraní soubor cookie a cesta a doména se musí shodovat s původními hodnotami.
  • 🔐 Atributy zabezpečení: Secure omezuje přenos na HTTPS, HttpOnly blokuje přístup skriptů a SameSite řídí odesílání mezi weby.
  • 📏 Omezení velikosti: Každý soubor cookie má zhruba 4 KB a prohlížeče uchovávají asi 50 souborů cookie na doménu, takže velká data patří jinam.
  • 💾 Alternativy úložiště: Oblasti localStorage a sessionStorage obsahují více dat a nikdy se nepřipojují k síťovým požadavkům.

Soubory cookie v JavaScénář

Co jsou cookies?

Soubor cookie je datový soubor, který je uložen ve vašem počítači, aby k němu mohl přistupovat váš prohlížeč. Výhody souborů cookie jste si mohli užívat, ať už vědomě či nevědomě. Zůstali jste někdy přihlášeni na webu, jako je Facebook, abyste nemuseli při každém pokusu o přihlášení zadávat své údaje? Pokud ano, používáte soubory cookie. Soubory cookie se ukládají jako páry klíč/hodnota.

Důležité upřesnění: soubor cookie neuchovává vaše heslo. Obsahuje identifikátor relace, což je náhodný token, který server vydá po úspěšném přihlášení. Server přiřadí tento token k vašemu účtu, takže samotné heslo nikdy neopustí server.

Proč potřebujete cookie?

Komunikace mezi a webový prohlížeč a serverem probíhá pomocí bezstavového protokolu s názvem HTTP. Bezstavový protokol zpracovává každý požadavek nezávisle. Server tedy data po odeslání do prohlížeče neuchovává. V mnoha situacích však budou data znovu vyžadována. Zde přicházejí na řadu soubory cookie. Díky souborům cookie webový prohlížeč nemusí komunikovat se serverem pokaždé, když jsou data vyžadována. Místo toho je lze načíst přímo z počítače.

Mezi typické použití patří zapamatování přihlášené relace, uložení jazykových nebo šablonových preferencí,ping položky v obchoděping košík mezi stránkami a počítání návštěvníků, kteří navštívili poprvé, a těch, kteří se vracejí.

Javascript Nastavit cookie

Soubory cookie můžete vytvořit pomocí vlastnosti document.cookie takto.

document.cookie = "cookiename=cookievalue"

Dokonce můžete k souboru cookie přidat datum platnosti, aby byl daný soubor cookie z počítače odstraněn v zadaný den. Datum platnosti by mělo být nastaveno ve formátu UTC/GMT. Pokud datum platnosti nenastavíte, soubor cookie bude odstraněn, jakmile uživatel zavře prohlížeč.

document.cookie = "cookiename=cookievalue; expires= Thu, 21 Aug 2031 20:00:00 UTC"

Můžete také nastavit doménu a cestu, abyste určili, do které domény a do kterých adresářů v dané doméně soubor cookie patří. Ve výchozím nastavení soubor cookie patří stránce, která jej nastavuje.

document.cookie = "cookiename=cookievalue; expires= Thu, 21 Aug 2031 20:00:00 UTC; path=/ "

//vytvoří soubor cookie s doménou aktuální stránky a cestou pokrývající celou doménu.

Warning️ Varování: Datum platnosti musí být v budoucnosti. Datum, které již uplynulo, dá prohlížeči pokyn k okamžitému smazání souboru cookie, což je přesně technika použitá v níže uvedené části smazání.

JavaSkript pro získání souboru cookie

K souboru cookie můžete přistupovat takto, což vrátí všechny soubory cookie uložené pro aktuální doménu.

var x =  document.cookie

Vrácená hodnota je jeden řetězec ve formátu name1=value1; name2=value2Neexistuje žádná vestavěná metoda pro čtení jedné cookie podle názvu, takže řetězec musí být rozdělen. Níže uvedený pomocník vrací jednu hodnotu a prázdný řetězec, pokud název chybí.

function getCookie(name) {
    const pairs = document.cookie.split(";");
    for (let i = 0; i < pairs.length; i++) {
        const pair = pairs[i].trim();
        if (pair.indexOf(name + "=") === 0) {
            // decode in case the value contained spaces or symbols
            return decodeURIComponent(pair.substring(name.length + 1));
        }
    }
    return "";
}

document.cookie = "username=Ann Smith; path=/";
console.log(getCookie("username"));
console.log(getCookie("missing") === "");

Výstup:

Ann Smith
true

JavaSkript Odstranit cookie

Chcete-li soubor cookie smazat, stačí nastavit hodnotu souboru cookie na empty a hodnotu expires na datum, které již uplynulo.

document.cookie = "cookiename= ; expires = Thu, 01 Jan 1970 00:00:00 GMT"

Jeden detail je příčinou většiny neúspěšných smazání. Prohlížeč identifikuje soubor cookie podle jeho názvu, cesty a domény, takže příkaz k odstranění musí opakovat stejnou cestu a doménu, které byly použity při vytvoření souboru cookie.

// created with an explicit path
document.cookie = "theme=dark; path=/; max-age=2592000";

// deletion must repeat that same path
document.cookie = "theme=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT";

// max-age=0 achieves the same result in one shorter line
document.cookie = "theme=; path=/; max-age=0";

Vysvětlení atributů souborů cookie

Každý atribut za prvním středníkem mění dobu platnosti souboru cookie, které požadavky jej přenášejí a který kód jej může číst. Níže uvedený odkaz zahrnuje všechny tyto atributy.

Atribut Účel Příklad
vyprší Absolutní datum smazání ve formátu UTC vyprší=čt, 21. srpna 2031 20:00:00 UTC
max-věk Životnost v sekundách počítána odteď max-age = 2592000
cesta Rozsah adresáře v rámci domény cesta=/
doména Rozsah hostitele, včetně subdomén domena=example.com
Zajistěte si Odesíláno pouze přes HTTPS připojení Zajistěte si
Pouze HTTP Skryté před souborem document.cookie, nastaveno pouze serverem Pouze HTTP
Stejný web Řídí odesílání požadavků napříč weby StejnýSite=Laxní

SameSite si zaslouží zvláštní pozornost, protože prohlížeče nyní používají výchozí nastavení. Tři akceptované hodnoty se chovají následovně.

  • Přísný: Soubor cookie se nikdy neodesílá, pokud požadavek pochází z jiného webu, což je nejbezpečnější nastavení pro bankovní relace.
  • Laxní: Soubor cookie se přenáší s navigací na nejvyšší úrovni, například kliknutím na odkaz, ale ne s obrázky nebo rámci napříč weby. Toto je výchozí nastavení moderního prohlížeče.
  • Žádný: Soubor cookie se odesílá při každém požadavku mezi weby a musí být spárován s atributem Secure, jinak jej prohlížeč odmítne.
// a well configured cookie set from client side script
document.cookie = "language=en; path=/; max-age=31536000; SameSite=Lax; Secure";

💡 Tip: Atribut HttpOnly nelze použít z JavaSkript, záměrně. Nastavit ho může pouze záhlaví odpovědi serveru, a to chrání soubory cookie relace před útoky typu cross-site scripting.

Zkuste tento příklad sami

Níže uvedený skript kombinuje všechny tři operace. Vytvoří soubor cookie s platností v řádu dní, přečte jej zpět podle názvu a vítá vracejícího se návštěvníka. Speciální pokyny pro spuštění kódu… Dvakrát stiskněte tlačítko Spustit.

<html>
<head>
	<title>Cookie!!!</title>
	<script type="text/javascript">
		function createCookie(cookieName,cookieValue,daysToExpire)
        {
          var date = new Date();
          date.setTime(date.getTime()+(daysToExpire*24*60*60*1000));
          document.cookie = cookieName + "=" + cookieValue + "; expires=" + date.toGMTString();
        }
		function accessCookie(cookieName)
        {
          var name = cookieName + "=";
          var allCookieArray = document.cookie.split(';');
          for(var i=0; i<allCookieArray.length; i++)
          {
            var temp = allCookieArray[i].trim();
            if (temp.indexOf(name)==0)
            return temp.substring(name.length,temp.length);
       	  }
        	return "";
        }
		function checkCookie()
        {
          var user = accessCookie("testCookie");
          if (user!="")
        	alert("Welcome Back " + user + "!!!");
          else
          {
            user = prompt("Please enter your name");
            num = prompt("How many days you want to store your name on your computer?");
            if (user!="" && user!=null)
            {
            createCookie("testCookie", user, num);
            }
          }
        }
	</script>
</head>
<body onload="checkCookie()"></body>
</html>

Očekávané chování:

First run  : "Please enter your name"  -> Ann
             "How many days you want to store your name on your computer?" -> 5
Second run : alert box shows  Welcome Back Ann!!!

Code vysvětlení: Funkce createCookie převede počet dní na milisekundy a přičte je k aktuálnímu času, čímž získá datum platnosti. Funkce accessCookie rozdělí řetězec cookie na středníky, ořízne každý fragment a porovná začátek fragmentu s požadovaným názvem. Funkce checkCookie tyto dva údaje spojí při načítání stránky.

Warning️ Varování: Příklad používá toGMTString(), což je zastaralý alias. Nový kód by měl volat toUTCString() místo toho, protože zastaralý formulář může být nakonec z prohlížečů odstraněn.

Soubory cookie vs. localStorage vs. sessionStorage

Soubory cookie nejsou jediným místem, kde může prohlížeč ukládat data. Existují dvě možnosti webového úložiště a správný výběr zabrání odesílání zbytečných bajtů při každém požadavku.

vlastnost sušenka místní úložiště Úložiště relace
Kapacita Přibližně 4 kB Asi 5 MB Asi 5 MB
Odesláno na server Ano, s každým odpovídajícím požadavkem Ne Ne
Život Do data expirace Dokud není výslovně odstraněno Dokud se záložka nezavře
Server to může zapsat Ano Ne Ne
Přístupné napříč kartami Ano Ano Ne
Typické použití Relace a ověřování Předvolby a data v mezipaměti Stav formuláře pro jednu návštěvu

Praktické pravidlo je jednoduché. Pokud server potřebuje hodnotu, použijte soubor cookie. Pokud ji potřebuje pouze stránka, použijte localStorage nebo sessionStorage, protože tyto hodnoty nikdy nepřidávají váhu síťovému požadavku.

Kód pro zpracování souborů cookie je obvykle sdílen na mnoha stránkách, proto si jej zkontrolujte interní a externí JavaScénář než se rozhodnete, kam jej umístit. Zde použité rozdělení řetězců vychází z JavaŘetězce skriptu a JavaMetody skriptových polía další funkční skripty se objevují v praktický JavaPříklady skriptového kódu.

Nejčastější dotazy

Zhruba 4 KB na soubor cookie a většina prohlížečů uchovává asi 50 souborů cookie pro každou doménu. Větší hodnoty by měly být umístěny v úložišti localStorage nebo načteny ze serveru na vyžádání.

Mezi běžné příčiny patří uplynulé datum platnosti, neshodná cesta, stránka otevřená ze souborového systému a nikoli ze serveru nebo blokování souborů cookie prohlížečem. Zkontrolujte panel Aplikace v nástrojích pro vývojáře.

Ne. Soubory cookie typu HttpOnly jsou záměrně skryty před souborem document.cookie, aby vložené skripty nemohly ukrást token relace. Vidí je pouze server v hlavičkách požadavků.

Soubory cookie první strany patří doméně v adresním řádku. Soubory cookie třetích stran jsou nastaveny vloženou doménou, například inzerentem, a prohlížeče je nyní ve výchozím nastavení omezují nebo blokují.

Ano. Malý soubor cookie obvykle ukládá identifikátor konverzace, aby widget mohl při příští návštěvě obnovit vlákno. Samotné zprávy jsou uchovávány na serverech poskytovatele.

Ne. Soubory cookie se odesílají s každým odpovídajícím požadavkem a jsou čitelné skripty, pokud není nastaveno HttpOnly. Ukládají pouze neprůhledný identifikátor a osobní údaje uchovávají na serveru.

Shrňte tento příspěvek takto: