Ответ
Для хранения ключа сессии в клиентской части веб-приложения можно использовать:
- HttpOnly Cookies - самый безопасный вариант, защищает от XSS-атак:
// Сервер должен установить куку с флагами:
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict
- LocalStorage - менее безопасен, но удобен для SPA:
localStorage.setItem('sessionToken', 'abc123');
const token = localStorage.getItem('sessionToken');
- SessionStorage - аналогичен LocalStorage, но очищается при закрытии вкладки.
Рекомендации:
- Для веб-приложений предпочтительны HttpOnly куки
- Если нужен доступ из JS - используйте Secure + HttpOnly куки + CSRF-токены
- Никогда не храните сессию в URL или глобальных переменных
- Для мобильных/десктоп приложений можно использовать SecureStorage/Keychain
Ответ 18+ 🔞
А, ну ты про сессии, да? Классика, блядь! Вечная тема — куда эту пизданутую строку приткнуть, чтобы её не утянули какие-нибудь мартышлюшки с кривыми руками.
Смотри, вариантов-то, в общем-то, дохуя, но не все они одинаково полезны, как говорится.
Первый и самый правильный способ — это HttpOnly куки. Это как сейф, блядь, а не просто бумажник. Сервер тебе её выписывает, и она живёт у браузера, но до неё из твоего же JS-кода — нихуя! Никакой скрипт её не прочитает. Идеально, чтобы тебя не выебали через XSS.
Вот так это на сервере выглядит, примерно:
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Strict
HttpOnly — чтобы JS не дотянулся, Secure — чтобы только по HTTPS летала, SameSite=Strict — чтобы с других сайтов её не подсунули. Красота, ёпта!
Второй способ — LocalStorage. Ну, это уже попроще, для быстрого старта. Засунул, вынул, всё дела. Удобно в этих твоих модных SPA-приложениях.
localStorage.setItem('sessionToken', 'abc123'); // Положил
const token = localStorage.getItem('sessionToken'); // Достал
Но тут, блядь, минус — любой скрипт на твоей странице может эту строку вытащить. Если у тебя XSS-уязвимость — пиши пропало, ключ уведут, и будут от твоего имени кошмарить сервер. Удивление пиздец наступит, когда поймёшь, что натворили.
Третий — SessionStorage. Всё то же самое, что и LocalStorage, но живёт только пока вкладка открыта. Закрыл браузер — и хуй с горы, всё пропало. Иногда это то, что надо.
А теперь, сука, главное, что запомнить надо:
- Для нормальных веб-приложений — бери HttpOnly куки. Не выёбывайся. Это канон.
- Если тебе прям позарез надо из JS к ключу доступаться (ну, там, Bearer токен в заголовки цеплять), то делай так: Secure+HttpOnly кука для рефреш-токена, а короткоживущий access-токен таки в память или куда-то ещё. И не забудь про CSRF-токены, а то тебя другим способом выебут.
- Никогда, блядь, НИКОГДА не пихай сессию в URL. Это ж как оставить ключи от квартиры в замочной скважине с запиской «Адрес внутри». Пиздец.
- В глобальные переменные (
window.token) — тоже не надо. Это верх распиздяйства. - Для мобилок или десктопа — там свои заморочки. Используй SecureStorage на iOS, Keychain, Keystore на Android — специальные системные штуки для секретов.
Короче, думай головой, а не жопой. Безопасность — она такая, хитрая жопа: пока не наступит — её как бы и нет. А наступит — мало не покажется.