Сессии PHP и «Помнить меня»

Как-то раз, давно уже, зашел у нас на Хабре спор с одним местным юзером о том, как реализовывать функционал «Помнить меня». Он до хрипоты доказывал, что это нужно делать посредством просто длинных php-сессий. Мои аргументы о том, что сессии потому и называются сессиями (наверно, правильный перевод session — это все же «сеанс»), что они должны быть краткосрочными, не действовали. Оппонент говорил: раз можно сделать длительность сессий хоть несколько лет, то этим и надо пользоваться.


Ну да, теоретически, чтоб срубить дерево и довести его до состояния дров, достаточно иметь только топор. Или даже только пилу. Но почему-то никто так не делает, вот дураки,  сначала с помощью топора и пилы валят дерево, потом распиливают пилой, потом колят колуном. Это ж сколько инструментов надо!

Так же и в веб-программировании: для всего нужен свой инструмент. Почему же нельзя для этой цели пользоваться сессиями? Причин несколько:

  1. В высоконагруженных системах для хранения сессий может использоваться, например, memcache. Или даже специальный сервер. Случись какой сбой — все сессии пропадают, все пользователи, даже задавшие «Помнить меня», разлогиниваются и вынуждены снова вводить логин-пароль.
  2. Внутри сессии может копится всякая паразитная информация, которая была нужна для чего-то, но не очистилась. Писать «очиститель» для информации внутри сессии? Костыль.
  3. Если пользователь сидит на сайте с разных компов, то в разных его сессиях могут находиться несогласованные данные.

Короче говоря, длинная сессия — это не решение. А как же тогда правильно? Примерно так:

Если пользователь поставил галочку «помнить меня». То генерируем какой-то длинный ключ и устанавливаем в его куки. Дальше хешируем ключ и сохраняем в базу с привязкой к id пользователя. Когда в следующий раз он заходит на сайт, система аутентификации видит этот ключ у него в куках и автоматически создает для него сессию. Стандартную краткосрочную php-сессию. После каждого такого захода ключ лучше генерировать новый, для безопасности. Вот и все.

Добавить комментарий