Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Разница между Cookies и сессиями

#php #cookie #сессия


Здравствуйте, все никак не могу понять разницы между куки и сеансом. Насколько мне
известно, если в броузере отключен прием кук, то авторизацию и регистрацию пользователь
не пройдет, исходя из этих соображений для регистрации я делаю на session_start, но
если я в броузере выключаю куки, то все ровно не заходит.
Как работать с куки и сессиями? В каждом файле надо делать проверку на существование
сессии, для того, чтобы если их нет, то человек не смог зайти на эту страницу? Еще
я замечал на некоторых сайтах, что в броузерной строке по мимо адреса еще есть session_name
и session_id. Как это делается и для чего?
Пожалуйста, объяснить мне простыми словами, а не заученными терминами, как и с чем
работать? Что и для чего надо? Можно с примерами в которых будет пояснение, спасибо.    


Ответы

Ответ 1



Это разные явления. Cookie — это просто пара имя-значение, которую (точнее, которые) сервер может оставить у клиента (браузера). Наглядно: Приходит клиент, спрашивает у сервера страницу. Сервер в заголовках ответе может установить cookies. Например, выдав два заголовка: Set-Cookie: foo=123 и Set-Cookie: bar=baz — по-русски — «запомни, foo — 123, а bar — baz». При следующем обращении клиент, если он решил запомнить, говорит серверу «Cookie: bar=baz; foo=123». Упрощенно, не затрагивая тонкости — все, вот все, что представляют собой cookies. Сессии — более эфемерное понятие, которое не привязано к какой-то конкретной реальной технологии. Это просто некая методика, которая позволяет отличить одного клиента от другого, и, как правило, где-то хранить связанные с каждым клиентом данные. Как правило, сессии реализуются используя cookies и идентификаторы сессий. Т.е. сервер со своей стороны создает уникальный идентификатор, например, «1a2b3c» (session_id про который вы справшивали), а клиента просит его запомнить. Обычно — при помощи cookies, говоря что-то в духе Set-Cookie: PHPSESSID=1a2b3c (где «PHPSESSID» — имя сессии, обычно, оно только одно, вести параллельно несколько сессий нужно редко). Со своей стороны сервер где-то (зависит от реализации, иногда это файл, например, /tmp/1a2b3c, иногда запись в БД, иногда еще что-то) хранит различные данные, которые ему приказано связывать с этой сессией. Например, имя пользователя. PHP'шные сессии использовали не только cookies, но и аргументы в адресной строке. Т.е. перед отдачей страницы пользователю «переписывали» все ссылки в ней, добавляя свое «?PHPSESSID=1a2b3c». И клиент вместо «/forum.php» шел на «/forum.php?PHPSESSID=1a2b3c». Таким образом сервер получал идентификатор сессии и все работало. Сейчас PHP по умолчанию такого не делает — у этого метода есть куча своих недостатков. Хотите включить — напишите ini_set('session.use_trans_sid', true);, но нужно понимать связанные риски. Еще можно хранить идентификаторы сессий в других местах. Например, Local Shared Objects («флэшевские cookie»), использовать возможности хранилищ HTML5, и еще ряде менее тривиальных мест, но PHP этого «из коробки» не умеет. Соответственно, раз и cookies и поддержка use_trans_sid (перезаписи адресов) отключены, то PHP не может нигде оставить у клиента «метку». И сессии, по сути, не работают. Это, в общем-то, не должно быть проблемой — если клиенту надо — он включит cookies. Еще момент. Сами по себе сессии не дают авторизации — это только хранилище. Авторизацию делаете Вы сами (или фреймворк, которым Вы воспользовались). Вы пользуетесь тем, что данные, связанные с сессией (в типичной PHP'шной реализации) хранятся на сервере, и клиент их там подменить не может. Соответственно, когда клиент аутентифицируется — в сессии сохраняется кто он. Обратно — если у нас в сессии записано кто он — можно этому верить. Вся дальнейшая логика — пускать ли клиента, давать ли ему какие-то возможности и т.д. — на Вас. Как работать с куки и сессиями? В каждом файле надо делать проверку на существование сессии, для того чтобы если их нет то человек не смог зайти на эту страницу? Зависит от того, что Вы хотите, и от того, как Вы все строите. Если к этой странице должен быть доступ только у авторизованных пользователей — да, как вариант, так. Иногда все запросы пропускают через один скрипт-«диспетчер». Иногда во все скрипты в начало вставляют include, которое инициализирует общую для всего сайта логику (сессии, авторизация).

Ответ 2



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

Ответ 3



Как в таком случае работать: перенаправлять на главную и указывать, что куки по-хорошему бы надо включить. session_name задает имя сессии на случай, если надо разделить сессии в пределах одного домена. Хотя это лучше не делать через адресную строку, а использовать в коде.

Комментариев нет:

Отправить комментарий