res.cookie из cookie-parser работает некорректно

Вопрос или проблема

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, то вам следует убедиться, что:

  1. CORS настройки на вашем backend сервере разрешают запросы с вашего frontend домена. Например:

    const cors = require('cors');
    
    app.use(cors({
     origin: 'https://ваш-фронтенд-домен.abc.mydomain.com', // Замените на ваш реальный домен
     credentials: true // Позволяет отправлять куки вместе с запросами
    }));
  2. Настройка куки в 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, чтобы куки могли быть отправлены вместе с запросами.
  • Тестируйте изменения в безопасной среде, чтобы не подвергать себя угрозам безопасности.

Следуя этим шагам, вы сможете корректно установить куки и устранить возникающие ошибки. Если у вас останутся дополнительные вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...