Когда мне следует использовать переменные сеанса вместо файлов cookie? - PullRequest
55 голосов
/ 11 февраля 2010

Переменные сессии и куки кажутся мне очень похожими. Я понимаю технические различия, но как вы решаете, когда использовать одно против другого?

Ответы [ 12 ]

54 голосов
/ 11 февраля 2010
  • Сеансы хранятся на сервере, что означает, что клиенты не имеют доступа к информации о них, которую вы храните. Данные сеанса, хранящиеся на вашем сервере, не должны передаваться полностью с каждой страницы; клиентам просто нужно отправить идентификатор, и данные загружаются с сервера.

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

  • Избегать хранения данных в файлах cookie

    • Это может быть увидено, прочитано и изменено конечным пользователем или перехвачено теми, кто имеет гнусные намерения. Вы не можете доверять никаким данным в куки, кроме «session_id».
    • Увеличивает пропускную способность, если вы добавляете 1к данных на запрос страницы на пользователя, что может увеличить пропускную способность на 10-15%. Возможно, это не дорого с точки зрения $$, но это может быть с точки зрения производительности. Это эффективно уменьшит пропускную способность вашего сервера на 10-15%, т. Е. Может потребовать больше серверов.
  • То, что вы можете хранить в данных сеанса, зависит от объема данных и количества пользователей, которые у вас есть. no_of_users * size_of_session_data должно быть меньше свободной памяти, доступной на вашем сервере.

10 голосов
/ 11 февраля 2010
  • Всегда используйте сеансы
  • Используйте куки, только если вам нужны более длительные сеансы входа в систему - затем добавьте куки с зашифрованным идентификатором пользователя.
7 голосов
/ 11 февраля 2010

В большинстве случаев состояние сеанса сохраняется с использованием файлов cookie. Так что вопрос не в том или ином, а в том, как использовать их вместе.

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

5 голосов
/ 11 февраля 2010

Файлы cookie - на стороне клиента, а сеансы - на стороне сервера.

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

Используйте данные сеанса для больших кусков данных (во многих системах можно хранить объекты, структуры данных и т. Д.) И те, которым вы должны доверять - например, статус авторизации и т. Д. В общем, используйте данные сеанса для хранения больших данных состояния.

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

5 голосов
/ 11 февраля 2010

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

2 голосов
/ 05 августа 2017

Одним из недостатков сессий PHP является то, как работает обработка сессий. В частности, только один процесс / запрос может иметь сеанс, открытый для записи одновременно. После

session_start() 

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

Другими словами, если вы используете AJAX на странице для обновления нескольких элементов - вы не хотите, чтобы запросы AJAX открывали один и тот же сеанс - они будут принудительно помещены в очередь, и если один из этих запросов застрянет - сеанс не будет отменен - ​​в результате зависание браузера, при котором открытие новой вкладки или окна только помещает еще один невыполненный запрос в очередь на сервере. Использование

session_write_close()

как можно скорее, чтобы освободить сессию, это частичный обходной путь.

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

Я рекомендую избегать сессий PHP.

2 голосов
/ 11 февраля 2010

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

В противном случае, если вы храните небольшие объемы данных, файл cookie подойдет.

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

1 голос
/ 11 февраля 2010

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

0 голосов
/ 03 июля 2019

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

Сессия - это искусственное понятие, а в HTTP этого понятия нет. Он создается веб-серверами, чтобы помочь веб-разработчикам передавать информацию по запросам, такую ​​как информация об учетной записи пользователя, корзины покупок, данные форм и т. Д. Файл cookie передается стандартными заголовками HTTP.

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

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

0 голосов
/ 15 июля 2017

Ваш конкретный гид

N.B - cookie хранится в браузерах пользователей, а сеанс хранится на компьютере вашего хост-сервера.

Когда использовать

  1. Используйте cookie , если вы хотите, чтобы ваше приложение всегда запоминало данные пользователя, даже если они закрыли свои браузеры. Например, всякий раз, когда вы набираете www.facebook.com, вы переходите в свою учетную запись, даже если ваш браузер был закрыт и вновь открыт.

    Поскольку все данные, хранящиеся в сеансе, удаляются после закрытия браузера.

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

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

...