Печиво в JavaСценарій: приклад встановлення, отримання та видалення

⚡ Розумний підсумок

Печиво в JavaСкрипти зберігають невеликі пари ключів і значень на комп’ютері відвідувача, щоб HTTP-з’єднання без збереження стану могло запам’ятати інформацію. У цій статті пояснюється, як встановлювати, зчитувати та видаляти файли cookie, описується кожен атрибут файлів cookie та порівнюються файли cookie з альтернативними сховищами браузера.

  • 🍪 Основне визначення: Файл cookie — це пара ключ-значення, яка зберігається браузером і автоматично повертається з кожним відповідним запитом.
  • ✍️ Запис Operaції: Призначення document.cookie додає або замінює один cookie за раз і ніколи не видаляє інші.
  • ???? Читати Operaції: Зчитування document.cookie повертає один рядок, розділений крапкою з комою, тому потрібну пару потрібно розділити вручну.
  • 🗑️ видаляти Operaції: Встановлення дати закінчення терміну дії в минулому видаляє файл cookie, а шлях і домен мають відповідати початковим значенням.
  • 🔐 Атрибути безпеки: Secure обмежує передачу через HTTPS, HttpOnly блокує доступ до скриптів, а SameSite контролює міжсайтову надсилання.
  • 📏 Обмеження розміру: Кожен файл cookie має розмір приблизно 4 КБ, а браузери зберігають близько 50 файлів cookie на домен, тому великі дані належать до іншого місця.
  • 💾 Альтернативи сховища: localStorage та sessionStorage зберігають більше даних і ніколи не прив'язуються до мережевих запитів.

Печиво в JavaScript

Що таке Cookies?

Файл cookie – це фрагмент даних, який зберігається на вашому комп’ютері для доступу до нього через браузер. Ви також могли користуватися перевагами файлів cookie свідомо чи несвідомо. Чи траплялося вам коли-небудь залишатися авторизованими на такому сайті, як Facebook, щоб не вводити свої дані щоразу, коли ви намагаєтеся увійти? Якщо так, то ви використовуєте файли cookie. Файли cookie зберігаються як пари ключ/значення.

Важливе уточнення: файл cookie не зберігає ваш пароль. Він містить ідентифікатор сеансу, тобто випадковий токен, який сервер видає після успішного входу в систему. Сервер зіставляє цей токен з вашим обліковим записом, тому сам пароль ніколи не залишає сервер.

Навіщо вам потрібні файли cookie?

Спілкування між а веб-браузер і сервером відбувається за допомогою протоколу без збереження стану під назвою HTTP. Протокол без збереження стану обробляє кожен запит незалежно. Отже, сервер не зберігає дані після їх надсилання до браузера. Але в багатьох ситуаціях дані будуть потрібні знову. Тут на допомогу приходять файли cookie. Завдяки файлам cookie веб-браузеру не доведеться зв'язуватися із сервером щоразу, коли потрібні дані. Натомість їх можна буде отримати безпосередньо з комп'ютера.

Типові способи використання включають запам'ятовування сеансу входу в систему, збереження мовних або тематичних налаштувань, keeping товари в магазиніping кошик між сторінками та підрахунок відвідувачів, які вперше прийшли, та тих, хто повернувся.

Javascript Встановити файли cookie

Ви можете створювати файли cookie за допомогою властивості document.cookie ось так.

document.cookie = "cookiename=cookievalue"

Ви навіть можете додати термін дії до вашого файлу cookie, щоб конкретний файл cookie було видалено з комп’ютера у вказану дату. Термін дії слід встановити у форматі UTC/GMT. Якщо ви не встановите термін дії, файл cookie буде видалено, коли користувач закриє браузер.

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

Ви також можете встановити домен і шлях, щоб указати, до якого домену та до яких каталогів у певному домені належить файл cookie. За замовчуванням файл cookie належить сторінці, яка встановлює його.

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

//створити cookie з доменом поточної сторінки та шляхом, що охоплює весь домен.

⚠️ Попередження: Термін дії має бути в майбутньому. Дата, яка вже минула, вказує браузеру негайно видалити файл cookie, саме цей метод використовується в розділі видалення нижче.

JavaСкрипт отримання файлів cookie

Ви можете отримати доступ до файлу cookie таким чином, який поверне всі файли cookie, збережені для поточного домену.

var x =  document.cookie

Повернене значення — це один рядок у форматі name1=value1; name2=value2Немає вбудованого методу для зчитування одного файлу cookie за назвою, тому рядок потрібно розділити. Допоміжний засіб нижче повертає одне значення та порожній рядок, якщо назва відсутня.

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") === "");

вихід:

Ann Smith
true

JavaСценарій видалення файлу cookie

Щоб видалити файл cookie, вам просто потрібно встановити значення файлу cookie як empty, а значення expires – як дату, яка вже минула.

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

Одна деталь є причиною більшості невдалих видалень. Браузер ідентифікує файл cookie за його назвою, шляхом та доменом, тому оператор видалення має повторювати той самий шлях та домен, які використовувалися під час створення файлу 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";

Пояснення атрибутів файлів cookie

Кожен атрибут після першої крапки з комою змінює термін життя файлу cookie, які запити його передають і який код може його зчитувати. Наведене нижче посилання охоплює всі ці параметри.

атрибут Мета Приклад
закінчується Абсолютна дата видалення у форматі UTC термін дії expires=Чт, 21 серпня 2031 20:00:00 UTC
макс-вік Час життя в секундах, відрахований з цього моменту max-age = 2592000
шлях Область дії каталогу всередині домену шлях=/
домен Область дії хоста, включаючи субдомени домен=example.com
Убезпечте Надсилається лише через HTTPS-з’єднання Убезпечте
Тільки Http Приховано від document.cookie, встановлено лише сервером Тільки Http
Той самий сайт Керує надсиланням міжсайтових запитів SameSite=Недбало

SameSite заслуговує на особливу увагу, оскільки браузери тепер застосовують значення за замовчуванням. Три прийнятні значення поводяться наступним чином.

  • Суворий: Файл cookie ніколи не надсилається, коли запит походить з іншого сайту, що є найбезпечнішим налаштуванням для банківських сеансів.
  • Лакс: Файл cookie поширюється разом із навігацією верхнього рівня, такою як клацання посилання, але не разом із зображеннями чи фреймами між сайтами. Це налаштування за замовчуванням у сучасному браузері.
  • None: Файл cookie надсилається з кожним міжсайтовим запитом і має бути пов’язаний з атрибутом Secure, інакше браузер відхиляє його.
// a well configured cookie set from client side script
document.cookie = "language=en; path=/; max-age=31536000; SameSite=Lax; Secure";

💡 Порада: Атрибут HttpOnly не можна застосувати з JavaСкрипт, за власним вибором. Його можна встановити лише у заголовку відповіді сервера, і саме це захищає сесійні файли cookie від атак міжсайтового скриптингу.

Спробуйте цей приклад самі

Наведений нижче скрипт поєднує всі три операції. Він створює cookie з терміном дії, що вимірюється в днях, зчитує його за іменем та вітає відвідувача, що повернувся. Спеціальні інструкції для роботи коду … Двічі натисніть кнопку запуску.

<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>

Очікувана поведінка:

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 пояснення: Функція createCookie перетворює кількість днів на мілісекунди та додає їх до поточного часу, що створює дату закінчення терміну дії. Функція accessCookie розділяє рядок cookie на крапки з комою, обрізає кожен фрагмент та порівнює початок фрагмента із запитуваною назвою. Функція checkCookie пов'язує ці два значення разом під час завантаження сторінки.

⚠️ Попередження: У прикладі використовується toGMTString(), що є застарілим псевдонімом. Новий код має викликати toUTCString() натомість, оскільки застарілу форму зрештою можуть видалити з браузерів.

Файли cookie проти локального сховища та сховища сеансу

Файли cookie – це не єдине місце, де браузер може зберігати дані. Існує два варіанти веб-сховища, і правильний вибір дозволяє уникнути надсилання непотрібних байтів при кожному запиті.

особливість Печиво localStorage sessionStorage
Швидкість профілювання Близько 4 КБ Близько 5 МБ Близько 5 МБ
Надіслано на сервер Так, з кожним відповідним запитом Немає Немає
Тривалість Життя До закінчення терміну придатності Доки його явно не видалено Доки вкладка не закриється
Сервер може це записати Так Немає Немає
Доступно на різних вкладках Так Так Немає
Типове використання Сесії та автентифікація Налаштування та кешовані дані Стан форми для одного візиту

Практичне правило просте. Якщо серверу потрібне значення, використовуйте cookie. Якщо воно потрібне лише сторінці, використовуйте localStorage або sessionStorage, оскільки ці значення ніколи не додають ваги до мережевого запиту.

Код обробки файлів cookie зазвичай використовується багатьма сторінками, тому перегляньте внутрішні та зовнішні JavaScript перш ніж вирішити, де його розмістити. Розділення рядків, що використовується тут, базується на JavaРядки скриптів та JavaМетоди масивів скриптів, а подальші робочі скрипти з’являються в практичний JavaПриклади коду скриптів.

Поширені запитання

Приблизно 4 КБ на файл cookie, і більшість браузерів зберігають близько 50 файлів cookie для кожного домену. Більші значення слід розміщувати в localStorage або отримувати з сервера на вимогу.

Поширеними причинами є минулий термін дії, невідповідний шлях, сторінка, відкрита з файлової системи, а не із сервера, або блокування файлів cookie браузером. Перевірте панель програм в інструментах розробника.

Ні. Файли cookie HttpOnly навмисно приховані від document.cookie, щоб впроваджені скрипти не могли вкрасти токен сеансу. Їх бачить лише сервер у заголовках запиту.

Файли cookie власного виробника належать до домену в адресному рядку. Файли cookie третіх сторін встановлюються вбудованим доменом, таким як рекламодавець, і браузери тепер обмежують або блокують їх за замовчуванням.

Так. Невеликий файл cookie зазвичай зберігає ідентифікатор розмови, щоб віджет міг відновити гілку обговорення під час наступного відвідування. Самі повідомлення зберігаються на серверах провайдера.

Ні. Файли cookie передаються з кожним відповідним запитом і можуть бути прочитані скриптами, якщо не встановлено HttpOnly. Зберігайте лише непрозорий ідентифікатор і зберігайте персональні дані на сервері.

Підсумуйте цей пост за допомогою: