В 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:
- создаёт или использует
remember_tokenпользователя; - добавляет в браузер cookie примерно с таким именем:
remember_web_<hash>
- одновременно создаёт обычную сессию
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 без отдельной причины не требуется.