#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 задает имя сессии на случай, если надо разделить сессии в пределах одного
домена. Хотя это лучше не делать через адресную строку, а использовать в коде.