Назначение сеансов PHP и файлов cookie и их различия

Я только начинаю учиться программировать на PHP и столкнулся с немного запутанной областью, сеансами и файлами cookie.

Я понимаю различия в хранилищах на стороне сервера и на стороне клиента, но я не понимаю, как они различаются и в каких обстоятельствах каждый из них подходит?

Кроме того, я видел, как люди говорят, что файл cookie можно использовать для хранения идентификатора сеанса. Как это можно сделать и почему это будет выгодно?

Спасибо за любой отзыв.


person Mike McGee    schedule 09.04.2011    source источник
comment
Когда вы устанавливаете сеанс, php также устанавливает файл cookie.   -  person Neddy    schedule 10.04.2011


Ответы (3)


Прежде всего, давайте разрушим давний миф (или, по крайней мере, я думаю, что это уже существующий миф) о том, что сеансовые файлы cookie отличаются от обычных файлов cookie. Нет. Сеансовый файл cookie — это обычный файл cookie. Только свойства файла cookie сеанса, которые установлены (или, скорее, не установлены), обычно отличаются. Но механизм точно такой же.

Файл cookie устанавливается путем отправки браузеру заголовка ответа http:

Set-Cookie: name=value[; possible expiration-date][; other possible properties]

Что обычно отличает сеансовый файл cookie от обычного файла cookie, так это то, что срок его действия не установлен (или срок действия установлен на дату в прошлом). Это означает, что браузер удалит файл cookie после закрытия браузера. Но «обычный» файл cookie может сделать это точно так же. Таким образом, делая его, так сказать, «сессионным файлом cookie».

Теперь, когда мы убрали это с дороги; Механизм, с помощью которого файлы cookie обычно используются приложениями, чтобы заставить их действовать как сеансовые файлы cookie, помимо вышеупомянутых свойств, заключается в том, что значение файла cookie содержит только уникальное идентифицируемое значение некоторого рода. Возможно, md5 или, может быть, sha1 хеша.

Каждый раз, когда браузер запрашивает ресурс на сервере, он отправляет этот файл cookie (если срок его действия не истек) с заголовком http-запроса следующим образом:

Cookie: name=value

Механизмы сеанса в бэкэнде (в вашем случае это PHP) связали уникальный идентификатор файла cookie с данными, которые были сохранены в файле в файловой системе сервера или, возможно, в базе данных. Таким образом, каждый раз при получении файла cookie он может извлекать эти данные и связывать их с запросом.

Преимущество этого заключается в том, что конфиденциальная информация 1) может быть скрыта от необходимости путешествовать по сети и 2) не попадает в кеш файлов cookie браузера пользователя, сохраняя ее на сервере.

Таким образом, в основном вы хотите отправлять неконфиденциальную и не важную для приложения информацию в обычном файле cookie (подумайте о: настройках макета, непостоянном списке воспроизведения, таком как на YouTube, возможно, и т. д.) и использовать сеанс для хранения конфиденциальная информация.

изменить:
Извините, игнорируйте "или срок действия установлен на дату в прошлом", так как это было ложно. Это приведет к тому, что браузер немедленно аннулирует файл cookie и, следовательно, больше не будет отправляться вместе с запросами.

person Decent Dabbler    schedule 10.04.2011

Преимущество использования файлов cookie перед сеансами заключается в том, что файлы cookie постоянны.

Другими словами, когда пользователь посещает ваш сайт несколько недель спустя, срок его сеанса, скорее всего, истек. Однако, если у них есть файл cookie, который может однозначно идентифицировать их для вашего скрипта, вы можете автоматически войти в систему и восстановить сеанс.

... для каких обстоятельств подойдет каждый из них?

Ответ выглядит примерно так:

  • Данные сеанса должны содержать информацию, которая не обязательно должна быть постоянной или необходима только в течение короткого периода времени. Например, если вы представляете пользователю многостраничную форму, имеет смысл использовать сеансы.
  • Файлы cookie следует использовать для хранения идентификатора или хэша, который однозначно идентифицирует не только пользователя, но и браузер/устройство, с помощью которого они вошли в систему. Имейте в виду, что данные cookie находятся вне вашего контроля и могут быть изменены/удалены только с помощью HTTP-запросов, сделанных пользователем (или, при определенных обстоятельствах, скриптом на странице).

Кроме того, я видел, как люди говорили, что файл cookie можно использовать для хранения идентификатора сеанса...

Я предполагаю, что под этим имелось в виду сохранение уникального значения в файле cookie, которое идентифицирует пользователя/браузер/устройство, которое они используют. Реализация чего-то подобного будет выглядеть так:

  • Позвольте пользователю войти в систему, как обычно.
  • Сгенерируйте уникальный хэш (лучше всего подойдет SHA-1) и сохраните его в файле cookie. Вы также сохраняете хэш в базе данных, связанной с этим пользователем.
  • ...
  • Пользователь возвращается после истечения срока его сеанса и посещает страницу.
  • Ваш скрипт видит файл cookie и ищет пользователя, которому принадлежит хэш.
  • Пользователь авторизован.
person Nathan Osman    schedule 10.04.2011

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

Файл cookie — это текстовый файл, хранящийся на компьютере пользователя. Каждый раз, когда пользователь посещает ваш сайт, он передает файл cookie, сообщая вам, кто он такой. Преимущество этого в том, что информация хранится на чужом компьютере, поэтому вам не нужно об этом беспокоиться. Таким образом, вы можете оставить его там, пока коровы не вернутся домой. Когда/если пользователь вернется, он принесет информацию с собой. Недостатком является то, что информация находится вне вашего контроля, потому что пользователь может легко редактировать файл cookie, который вы ему предоставили. Это делает любую информацию в файле cookie ненадежной, и ее необходимо проверять каждый раз, когда пользователь предоставляет ее вам.

Сессия похожа на файл cookie, за исключением того, что вы храните информацию на своем сервере. Преимущество заключается в том, что вы можете доверять сеансу, чтобы сохранить данные точно такими же, какими они были, когда вы их вводили. Недостатком является то, что вам нужно хранить эту информацию, что означает, что в конечном итоге вам придется отказаться от нее, чтобы ваш веб-сервер не заполнился информацией который никогда не будет использован.

Теперь это становится немного сложнее. Видите ли, хотя механизм сеанса такой, как я описал выше, фактическая реализация может варьироваться в зависимости от настроек PHP. Данные сеанса могут храниться в отдельных текстовых файлах или в базе данных на вашем сервере. Также вам нужен какой-то способ узнать, какой сеанс соответствует какому пользователю. Обычный (но не единственный) способ сделать это — использовать файлы cookie. Что происходит, так это то, что фактические данные остаются на вашем сервере и связаны с уникальным идентификатором сеанса. Этот идентификатор сеанса помещается в файл cookie и передается пользователю, чтобы вы могли позже просмотреть его данные, когда он вернется.

Описанный выше процесс выполняется PHP автоматически, когда вы используете функции сеанса; вам не нужно реализовывать его вручную. Если по какой-либо причине вам нужно изменить способ реализации сеансов, вы можете сделать это, изменив параметры сеанса в php.ini.

person Manos Dilaverakis    schedule 10.04.2011