Загрузка...

Как работают «Запомнить меня» и SESSION_LIFETIME в Laravel Starter Kits

Как работает «Запомнить меня» в Laravel Starter kits: при чём здесь SESSION_LIFETIME

В Laravel Starter Kits уже есть всё необходимое для авторизации: форма входа, обычная сессия и checkbox «Запомнить меня».

На первый взгляд кажется, что за срок авторизации отвечает одна настройка в .env:

SESSION_LIFETIME=10800

Но это не совсем так. SESSION_LIFETIME отвечает за обычную сессию, а галочка «Запомнить меня» запускает отдельный механизм с собственной cookie и сроком жизни.

Разберёмся, как они связаны между собой.

Что делает SESSION_LIFETIME

SESSION_LIFETIME задаёт срок жизни обычной сессии Laravel. Значение указывается в минутах.

Например:

SESSION_LIFETIME=10800

Это 10 800 минут, или 7,5 дня.

Обычная авторизация хранится в сессии. В браузере ей соответствует cookie с именем вроде:

laravel_session

Когда пользователь входит без галочки «Запомнить меня», Laravel записывает его идентификатор в сессию. Пока сессия действительна, пользователь считается авторизованным.

После окончания сессии Laravel больше не видит в ней пользователя и отправляет его на страницу входа.

Для пользователя это выглядит так:

Вошёл без галочки → сессия закончилась → нужно войти снова

На практике SESSION_LIFETIME обычно воспринимается как срок неактивности. Если пользователь регулярно открывает сайт, сессия может обновляться. Если не заходить несколько дней, она закончится.

Где в Starter Kit работает галочка

В Laravel Breeze с Livewire и Volt форма авторизации вызывает Auth::attempt() примерно так:

Auth::attempt([
    'email' => $this->email,
    'password' => $this->password,
], $this->remember);

В моём проекте это LoginForm.php:71.

Второй аргумент метода — значение checkbox «Запомнить меня»:

$this->remember = false; // галочка не установлена
$this->remember = true;  // галочка установлена

В стандартном starter kit свойство обычно объявлено так:

public bool $remember = false;

В моём проекте это LoginForm.php:26.

То есть по умолчанию пользователь входит без долгого запоминания. Чтобы сохранить вход надолго, он должен установить галочку.

Что происходит без галочки

Если $this->remember равен false, Laravel создаёт только обычную сессию:

laravel_session

Срок её жизни определяется SESSION_LIFETIME.

При SESSION_LIFETIME=10800 пользователь может не заходить примерно 7,5 дня. Если он вернётся через месяц, сессия, скорее всего, уже закончится и потребуется повторный вход.

В базе при этом не создаётся новый remember-токен, а отдельная cookie remember_web_* не используется.

Что происходит с галочкой

Если $this->remember равен true, Laravel использует дополнительный механизм.

В стандартной миграции пользователей есть строка:

$table->rememberToken();

Она добавляет в таблицу users колонку remember_token.

При входе Laravel:

  1. создаёт или использует remember_token пользователя;
  2. добавляет в браузер cookie примерно с таким именем:
remember_web_<hash>
  1. одновременно создаёт обычную сессию laravel_session.

У этих cookies разные задачи:

Cookie За что отвечает
laravel_session Текущая обычная сессия
remember_web_<hash> Восстановление входа после окончания сессии

Сколько действует «Запомнить меня»

В Laravel 12 срок действия remember-cookie задаётся в SessionGuard:

protected $rememberDuration = 576000;

Это минуты:

576000 минут = 400 дней

То есть галочка рассчитана примерно на год.

Этот срок не связан с SESSION_LIFETIME. Если изменить SESSION_LIFETIME, срок действия remember_web_* не изменится.

Что будет после окончания обычной сессии

Допустим, пользователь вошёл с установленной галочкой, а затем не заходил на сайт дольше срока SESSION_LIFETIME.

Обычная cookie laravel_session уже не поможет. Но Laravel увидит remember_web_<hash>, проверит её и найдёт пользователя по remember_token.

После этого Laravel создаст новую обычную сессию. Пользователь просто откроет сайт и останется авторизованным.

Получается такая схема:

Вход с галочкой
        ↓
Обычная сессия закончилась
        ↓
Laravel проверил remember-cookie
        ↓
Новая сессия создана автоматически

Поэтому при включённой галочке SESSION_LIFETIME почти не заметен в обычном пользовательском сценарии.

Как эти настройки работают вместе

Вход Обычная сессия Remember-cookie Результат
Без галочки SESSION_LIFETIME Нет После окончания сессии нужен вход
С галочкой SESSION_LIFETIME 400 дней Вход восстановится автоматически
Cookie просрочена Закончилась Недействительна Нужно войти снова
Нажата кнопка «Выйти» Удаляется Удаляется Нужно войти снова

Нужно ли увеличивать SESSION_LIFETIME

Если задача — чтобы пользователь долго не вводил пароль, увеличивать SESSION_LIFETIME до года не нужно. Для этого уже есть галочка «Запомнить меня».

Большое значение SESSION_LIFETIME оставит обычную сессию надолго даже у тех пользователей, которые не просили их запоминать.

В приложении с обычными пользовательскими аккаунтами можно оставить checkbox и объяснить его назначение. Если приложение рассчитано на личные устройства, remember можно включить по умолчанию:

public bool $remember = true;

Либо можно убрать checkbox и всегда передавать true в Auth::attempt().

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

Как проверить работу

Откройте DevTools браузера и посмотрите cookies после входа.

Без галочки обычно будет:

laravel_session

С галочкой:

laravel_session
remember_web_<hash>

Чтобы проверить восстановление, удалите только laravel_session и обновите страницу.

Если remember-cookie есть, Laravel восстановит авторизацию. Если её нет, приложение отправит на страницу входа.

Вывод

В starter kit работают два независимых параметра:

SESSION_LIFETIME - срок обычной сессии
remember         - нужно ли создать долгую авторизацию

SESSION_LIFETIME=10800 означает, что обычная сессия живёт около 7,5 дня бездействия.

Галочка «Запомнить меня» дополнительно создаёт remember_token в таблице users и cookie remember_web_*, которая в Laravel 12 действует 400 дней.

Поэтому для удобного долгого входа не нужно делать SESSION_LIFETIME равным году. Достаточно использовать механизм «Запомнить меня».

В моём случае менять текущее значение SESSION_LIFETIME=10800 без отдельной причины не требуется.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *