Драйвер database - за замовчуванням у нових застосунках:
- таблиця
sessionsзuser_id, IP і user agent - можна показати користувачу активні сесії й завершити їх; - не потрібна додаткова інфраструктура;
- кожен запит пише в базу (оновлення
last_activity), на навантаженому сайті це помітне навантаження; - очищення старих записів - через «лотерею»:
'lottery' => [2, 100]означає, що приблизно у 2 зі 100 запитів Laravel видаляє протерміновані сесії. На великій таблиці це раптово повільний запит у випадкового користувача.
Драйвер redis:
- швидкий, не навантажує основну базу;
- записи протерміновуються самим Redis через TTL - лотерея не потрібна (для драйверів на основі кешу очищення нічого не робить);
- але немає зручного запиту «всі сесії користувача» - для такої функції доведеться зберігати зв'язок окремо;
- налаштування Redis важливе: якщо в тому самому екземплярі кеш з політикою витіснення
allkeys-lru, при нестачі пам'яті Redis видалятиме й сесії - користувачів почне розлогінювати. Сесії краще в окремій базі Redis чи екземплярі зnoeviction.
Чого уникати:
fileна кількох серверах - кожен сервер бачить лише свої сесії;cookieдля великих даних - ліміт розміру cookie близько 4 КБ і дані в кожному запиті;array- лише для тестів.
Що не зберігати в сесії:
- моделі й великі об'єкти - серіалізуються цілком, застарівають, роздувають кожен запит. Зберігайте ідентифікатори;
- дані, що мають пережити вихід (кошик зареєстрованого користувача, налаштування) - у базі;
- секрети й токени сторонніх сервісів без потреби: вміст сесії видно будь-кому з доступом до сховища (
SESSION_ENCRYPT=trueшифрує дані сесії); - дані, що змінюються паралельними запитами - без блокування вони перезаписують одне одного.
Ще кілька параметрів:
SESSION_LIFETIME- хвилини неактивності; для адмін-панелей коротше;SESSION_CONNECTION- окреме з'єднання з базою чи Redis для сесій;'serialization' => 'json'уconfig/session.phpзамість PHP-серіалізації (за замовчуваннямphp) закриває клас атак через десеріалізацію, але вимагає зберігати в сесії лише прості значення.