Яка різниця між файлами cookie на сервері та файлами cookie на стороні клієнта?


120

Яка різниця між створенням файлів cookie на сервері та клієнтом? Це називаються файли cookie на сервері та cookie на стороні клієнта? Чи є спосіб створити файли cookie, які можна читати лише на сервері або на клієнті?


15
Не існує такого поняття, як "cookie на сервері" та "cookie на стороні клієнта". Є лише файли cookie, імена / значення, що надсилаються в заголовки HTTP з запитами та відповідями.
Dan Grossman

1
Можливо посилання на змінні сесії, які містять дані на сервері. Зазвичай є ідентифікатор сеансу, який зберігається як cookie на стороні клієнта.
AndrewR

Ймовірно, питання стосується різних способів кодування файлів cookie на стороні сервера (тобто тому, як вони кодуються у заголовку відповіді "Cookie" та "Set-Cookie") та на стороні клієнта (тобто, як вони 'кодується в заголовку запиту Cookie - змінна $ Path і весь цей джаз). Дивіться RFC 2109
Ophir Radnitz

Відповіді:


146

HTTP COOKIES

Файли cookie - це пара ключів / значень, які використовуються веб-сайтами для зберігання інформації про стан у браузері. Скажімо, у вас є веб-сайт (example.com), коли браузер запитує веб-сторінку, веб-сайт може надсилати файли cookie для зберігання інформації у браузері.

Приклад запиту браузера:

GET /index.html HTTP/1.1
Host: www.example.com

Приклад відповіді з сервера:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: foo=10
Set-Cookie: bar=20; Expires=Fri, 30 Sep 2011 11:48:00 GMT
... rest  of the response

Тут два браузера foo = 10 і bar = 20 зберігаються у браузері. Другий термін дії закінчується 30 вересня. У кожному наступному запиті браузер надсилає файли cookie назад на сервер.

GET /spec.html HTTP/1.1
Host: www.example.com
Cookie: foo=10; bar=20
Accept: */*

СЕСІЇ: cookie на стороні сервера

Файли cookie на сервері відомі як "сеанси". У цьому випадку веб-сайт зберігає в браузері один cookie, який містить унікальний ідентифікатор сесії. Інформація про стан (foo = 10 і bar = 20 вище) зберігається на сервері, а Ідентифікатор сесії використовується для узгодження запиту з даними, що зберігаються на сервері.

Приклади використання

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

Плюси і мінуси

Нижче плюси та мінуси рішень. Це перші, які мені спадають на думку, є, безумовно, й інші.

Плюси cookie:

  • масштабованість: всі дані зберігаються у браузері, тому кожен запит може перейти через балансир завантаження на різні веб-сервери, і ви маєте всю інформацію, необхідну для повного заповнення запиту;
  • до них можна отримати доступ через javascript у браузері;
  • не перебуваючи на сервері, вони переживуть перезавантаження сервера;
  • RESTful: запити не залежать від стану сервера

Мінуси cookie:

Плюси сесії:

  • як правило, простіше у використанні, в PHP різниці, ймовірно, не так вже й багато.
  • необмежене зберігання

Мінуси сесії:

  • складніше масштабувати
  • на перезапуску веб-сервера ви можете втратити всі сеанси чи не залежно від реалізації
  • не RESTful

сесії профі: secure?
користувач2167582

1
чому сеанси більш безпечні? Якщо ви надсилаєте файли cookie сеансу через http, він може бути викрадений. Якщо сайт використовує https, безпека повинна бути такою ж, доки ви використовуєте захищені файли cookie (зашифровані, підписані тощо)
filippo

1
Мінуси файлів cookie: збільшують кожен запит, потенційно впливаючи на ефективність. Я не знаю цифр, але оскільки люди використовують домени без файлів cookie для речей, я вважаю, що це нетривіально.
maniexx

5
В основному оманлива відповідь - сеанси не є куки. en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session Ви можете мати змінні сеансу залежно від способу управління сеансом на сервері. Зазвичай у вас є одне або більше файлів cookie, пов’язаних із керуванням сеансом, утримуючи ідентифікатор сеансу. Також REST і RESTful не мають нічого спільного з файлами cookie або керуванням сесіями - реалізація REST і RESTful може мати сеанси та файли cookie.
Златін Златев

2
Дивіться stackoverflow.com/questions/35054840/… Я не говорив, що сеанси зазвичай не реалізуються за допомогою файлів cookie, але існують інші варіанти управління сеансами, отже, неправильно говорити про змінні сеансу як кукі на сервері. Я також посилався на JWT, коли я сказав у 2017 році в коментарі вище, що "REST та RESTful реалізації можуть мати сеанси та файли cookie". Хоча деякі пуристи можуть стверджувати, що це не правильний спосіб реалізації API REST.
Златін Златев

57

Ви, мабуть, маєте на увазі різницю між файлами cookie лише Http та їхньою частиною?

Http Тільки файли cookie не можуть бути доступні (читати з або записуватися) на стороні клієнта JavaScript, лише на стороні сервера. Якщо прапор Http Only не встановлений, або файл cookie створений у (JavaScript-стороні) JavaScript, cookie може бути прочитаний і записаний у (client) JavaScript, а також на стороні сервера.


38

Усі файли cookie є клієнтськими та серверними

Різниці немає. Звичайним файлом cookie можна встановити сторону сервера або клієнта. "Класичний" файл cookie буде відправлений назад з кожним запитом. Файл cookie, встановлений сервером, буде відправлений клієнтові у відповідь. Сервер надсилає файл cookie лише тоді, коли він явно встановлений або змінений, тоді як клієнт надсилає файл cookie за кожним запитом.

Але по суті це те саме печиво.

Але поведінка може змінитися

Файл cookie - це в основному name=valueпара, але після значення може бути купа атрибутів, розділених напівкрапкою, які впливають на поведінку файлу cookie, якщо це так реалізовано клієнтом (або сервером). Ці атрибути можуть стосуватися терміну служби, контексту та різних параметрів безпеки.

HTTP-тільки (не лише сервер)

Один з цих атрибутів може бути встановлений сервером, щоб вказати, що це файл cookie, який є лише HTTP. Це означає, що файл cookie все ще надсилається вперед і назад, але він не буде доступний у JavaScript. Зауважте, що печиво все ще є! Це лише вбудований захист у браузері, але якщо хтось використовує смішно старий браузер, наприклад IE5, або якийсь спеціальний клієнт, він може насправді прочитати файл cookie!

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

Альтернативи досягти "єдиного"

Якщо ви хочете зберігати значення лише на сервері або лише на клієнті, то вам знадобиться якийсь інший тип пам’яті, наприклад, файл або база даних на сервері або Local Storage на клієнті.


привіт, я дуже новачок у цих поняттях і маю певні сумніви. Вибачте, мої запитання можуть здатися дурними, але я все одно буду задавати. Будь-яка допомога дуже вдячна - Чи може файл cookie, встановлений на стороні клієнта, надсилати на будь-який домен? Я маю на увазі, це не загроза безпеці? Крім того, як це працює з клієнтами, які не переглядають браузер, як API та ін.?
Каран Чадха

1
Привіт @KaranChadha. Якщо у вас є питання, будь ласка, задайте це як формальне запитання, натиснувши кнопку "Задати питання" вгорі сторінки. Нитка коментарів до 7-річного питання, ймовірно, не приверне уваги до нього. Додавання посилання на це запитання або навіть на цю відповідь конкретно, звичайно, добре. Для цього ви можете скористатися кнопкою "поділитися" внизу кожного допису.
GolezTrol

Це правда? Файли cookie, створені клієнтом, схоже, не передаються. Якщо document.cookie="foo=bar"після fetch("/foobar", {credentials: 'include'} )цього слід не надіслати файл cookie, що містить foo=bar. Просто спробував цей код прямо на цьому сайті за допомогою DevTools та консолі.
олігофрен

Так, це правда, кажуть також документи , але є деякі конкретні причини, які можуть спричинити це, як, наприклад, атрибут відсутності закінчується.
GolezTrol

1
@MarinosAn Так, це може. Але моя відповідь була трохи короткою, коли мова зайшла про атрибути, що змінюють поведінку файлу cookie, тому я зараз трохи її розширив.
GolezTrol

4
  1. Так, ви можете створювати файли cookie, які можна читати лише на стороні сервера. Вони називаються "лише HTTP" - файлами cookie, як пояснено в інших відповідях

  2. Ні, немає жодного способу (я знаю) створити "куки", які можна читати лише на стороні клієнта. Файли cookie призначені для полегшення зв'язку клієнт-сервер.

  3. АЛЕ, якщо ви хочете щось ПОБАВИТИ "лише клієнт-куки", є проста відповідь: Використовуйте "Місцеве зберігання".

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

https://courses.cs.washington.edu/courses/cse154/12au/lectures/slides/lecture21-client-storage.shtml#slide8

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

Якщо на вашій сторінці є 50 ресурсів, як-от зображення та css-файли та сценарії, файл cookie (як правило) надсилається з кожним запитом. Детальніше про це у розділі Чи надсилає кожен веб-запит браузер?

Локальне сховище не має цих недоліків, пов’язаних із передачею даних, воно не надсилає даних. Це здорово.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.