Сессии против токенов
Вопрос
Как вы выбираете между сессиями и JWT для аутентификации в PHP-проекте?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Сессии: состояние на сервере, легко отозвать, cookie с HttpOnly
Для горизонтального масштабирования сессии в Redis, а не в файлах
JWT: без состояния, но отзыв сложен, нужен короткий срок и refresh-токены
Где хранить токен в браузере: httpOnly cookie против localStorage и XSS
Laravel Sanctum: cookie для SPA своего домена, токены для мобильных клиентов
Проверки JWT: подпись, alg, exp, aud, iss
Что могут спросить следом
- Как отозвать JWT до истечения срока?
- Что меняется, если фронтенд на другом домене?
Разбор
Для классического сайта и SPA на своём домене выбираю сессии: состояние хранится на сервере, выход и блокировка пользователя работают мгновенно, а cookie с HttpOnly, Secure и SameSite недоступна скриптам. Чтобы масштабироваться на несколько серверов, сессии кладу в Redis, а не в файлы. В Laravel для SPA это Sanctum в режиме cookie.
JWT удобен для мобильных клиентов и межсервисного взаимодействия: сервер не хранит состояние. Цена в том, что токен нельзя просто отозвать. Поэтому делаю короткий срок жизни access-токена, refresh-токен с ротацией храню на сервере, а при проверке валидирую подпись с фиксированным алгоритмом, exp, aud и iss.
Если токен живёт в браузере, не кладу его в localStorage: любой XSS его украдёт. httpOnly-cookie надёжнее, но тогда нужна защита от CSRF. Выбор в итоге зависит от клиентов: свой веб, сторонние интеграции или мобильное приложение.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.