Вопрос или проблема
res.cookie из cookie-parser работает некорректно
Привет, я установил куки, используя пакет cookie-parser
npm.
res.cookie("__Secure-AdminPortal", jwtToken, {
secure: true,
httpOnly: true,
sameSite: "strict",
expires: new Date(Date.now() + 60 * 60 * 24 * 1000), // < 1д
domain: ".sjj2NX.abc.mydomain.con", // мой поддомен фронтенда
});
Теперь у меня есть две проблемы:
ПРОБЛЕМА 1: Если я это делаю, то каким-то образом на фронтенде веб-страницы возникает ошибка CORS, но если я удаляю этот параметр domain, то все работает нормально, и ошибки CORS нет.
ПРОБЛЕМА 2: Если я не устанавливаю параметр domain в приведенном выше коде, то на фронтенде в разделе Applications > Cookie кука устанавливает домен как мой публичный бэкенд API домен jaien-api-abc.mydomain.com. Этого быть не должно. Вместо этого должен быть установлен домен фронтенда.
Как мне это исправить? Я достаточно копался в этом, но не смог найти решение или понять, почему это происходит.
Ответ или решение
Здравствуйте!
Чтобы решить ваши проблемы с установкой куки, рассмотрим каждую из них по очереди.
Проблема 1: CORS ошибка при установке параметра domain
При установке куки с использованием параметра domain
, куки будут доступны для всех поддоменов указанного домена. Ошибка CORS может возникнуть, если ваш frontend и backend находятся на разных поддоменах или доменах, и вы не настроили правильные заголовки CORS на сервере. Если куки не устанавливаются правильно из-за CORS, то вам следует убедиться, что:
-
CORS настройки на вашем backend сервере разрешают запросы с вашего frontend домена. Например:
const cors = require('cors'); app.use(cors({ origin: 'https://ваш-фронтенд-домен.abc.mydomain.com', // Замените на ваш реальный домен credentials: true // Позволяет отправлять куки вместе с запросами }));
- Настройка куки в frontend запросах также должна включать отправку куки. Например, если вы используете axios:
axios.defaults.withCredentials = true; // Позволяет отправлять куки
Проблема 2: Установка параметра domain и поведение куки
Если вы не указываете параметр domain
, то по умолчанию куки будут установлены для домена, с которого был сделан запрос. Если ваш API находится на jaien-api-abc.mydomain.com
, это и будет доменом для куки.
Чтобы установить одинаковый домен куки для вашего frontend (например, frontend.mydomain.com
), вам нужно указать параметр domain
с правильным поддоменом. Также убедитесь, что домен, который вы указываете, соответствует действительному домену и относится к тому же уровню или выше родительского домена, иначе браузер не позволит установить куку.
Пример корректной установки куки с параметром domain
:
res.cookie("__Secure-AdminPortal", jwtToken, {
secure: true,
httpOnly: true,
sameSite: "strict",
expires: new Date(Date.now() + 60 * 60 * 24 * 1000),
domain: ".mydomain.com", // Убедитесь, что этот домен соответствует вашему фронтенду
});
Общие рекомендации
- Убедитесь, что ваш домен установлен правильно и соответствует требованиям безопасности.
- Проверьте настройки CORS и измените их, если это необходимо.
- Используйте
withCredentials
, чтобы куки могли быть отправлены вместе с запросами. - Тестируйте изменения в безопасной среде, чтобы не подвергать себя угрозам безопасности.
Следуя этим шагам, вы сможете корректно установить куки и устранить возникающие ошибки. Если у вас останутся дополнительные вопросы, не стесняйтесь спрашивать!