#node.js #reactjs #express #session #session-cookies
#node.js #reactjs #выразить #сессия #сеансовые файлы cookie
Вопрос:
Я просто запутался в управлении сеансами. Для управления сеансами в настоящее время я использую файлы cookie только http для хранения моего JWT, но эти файлы cookie не могут быть доступны всем из-за настроек cookie браузера, которые, я думаю, плохо влияют на пользовательский интерфейс. Поэтому, когда я ищу альтернативные способы, такие как localstorage. Я узнал, что вы недостаточно защищены этими способами. Что бы вы посоветовали мне сделать с проблемой, о которой я упоминал выше? Должен ли я изменить всю систему аутентификации на серверную или какие-либо идеи?
//АУТЕНТИФИКАЦИЯ
res.cookie('token', token, {
httpOnly: true,
secure: true,
sameSite: 'None',
maxAge: 7 * 24 * 6 * 604800,
});
// ВЫХОД ИЗ СИСТЕМЫ
res.cookie('token', '', {
httpOnly: true,
secure: true,
sameSite: 'None',
maxAge: 1,
});
res.clearCookie('token');
Ответ №1:
Вы должны использовать httpOnly
cookie для предотвращения доступа из JS (с помощью xss attach вы можете запускать JS в сеансе других пользователей).
Мое предложение (которое мы основываем на Окончательном руководстве по обработке JWT на интерфейсных клиентах) состоит в том, чтобы использовать 2 вида токенов:
- Токен обновления — хранится в
httpOnly
файле cookie, используется только для обновления доступа, действителен в течение длительного периода (рекомендуется не более 1 дня). - Токен доступа — хранится в памяти и привязывается к каждому запросу, требующему авторизации. действует в течение короткого периода времени (10 минут).
Идея работает следующим образом:
- Пользователь входит в систему, ваш сервер проверяет учетные данные и генерирует
httpOnly
файл cookie сrefreshToken
и возвращает в качестве ответаaccessToken
. - Ваше клиентское приложение повреждает accessToken в каком-либо экземпляре класса (при использовании с
Axios
ним вы можете прикрепить его в качестве базового заголовка авторизации ко всем запросам). - Когда ваше приложение делает запрос, оно добавляет accessToken в качестве заголовка авторизации, если срок действия accessToken истекает, ваш api вернет 403 UnAuthorized, ваше клиентское приложение отправляет запрос в специальную конечную точку
/auth/token
с помощью файла cookie HttpOnly, который содержит refreshToken, эта конечная точка проверяет refreshToken и возвращает новый accessToken со временем истечения срока действия в течение 10 минут (с помощью которых ваше клиентское приложение обновляет базовый заголовок авторизации), затем ваше приложение может повторить предыдущий неудачный запрос с новым accessToken.
С помощью этого метода нет доступа к каким-либо токенам извне вашего приложения. Ваш refreshToken
js вообще недоступен, а accessToken хранится в памяти, только если в вашем приложении есть какой-то недостаток, он будет раскрыт, и даже если злоумышленник украл его, он действителен только в течение 10 минут (без возможности получить новый, потому что у него нет refreshToken)
Для получения более подробной информации прочитайте статью, которую я добавил.
Комментарии:
1. Спасибо за ваш ответ. Но есть ли часть, которую я пропустил? Файл cookie только для http, который вы называете токеном обновления, не может быть установлен в некоторых браузерах, таких как Safari, без изменения настроек, или некоторые пользователи просто отключают файлы cookie. Иногда даже в процессе выхода из системы вы не можете удалить его из памяти.
2. Вы уверены, что говорите об одних и тех же файлах cookie домена? потому что, если это не работает, это в основном нарушает работу Интернета :]
3. Вы правы, это один из моментов, который я не могу понять, но с кодом, который вы видите выше, файлы cookie не устанавливаются на телефонах или в некоторых браузерах, таких как safari : D
4. Я обнаружил, что если включен параметр Предотвращения межсайтового отслеживания, возникает проблема с моим процессом входа в систему.
5. как следует из названия, межсайтовое отслеживание означает, что вы пытаетесь поместить / использовать cookie из другого домена, «домен» включает поддомены и порты. Он в основном создан для блокировки Google Analytics и подобных инструментов