Почему я не могу получить доступ к этому файлу cookie через javascript?

Мой сервер отправляет файл cookie locale во фронтенд, который бэкэнд определяет из клиентского заголовка языка принятия. Когда я запускаю бэкэнд и интерфейс на localhost, я могу получить доступ к файлу cookie locale в javascript в document.cookie в браузере. Это также видно в chrome devtools (вкладка «Приложение» -> «Файлы cookie»).

Но когда я запускаю бэкэнд и интерфейс удаленно через https, я не могу получить доступ к cookie в javascript в браузере. Его также не видно в инструментах разработчика (вкладка «Приложение» -> «Файлы cookie»).

document.cookie // no locale cookie in javascript devtools console
"_ga=somevalue; _gid=somevalue; __stripe_mid=somevalue; __stripe_sid=somevalue"

Но я вижу файл cookie locale в заголовке ответа Set-Cookie и в chrome://settings/cookies/.

Ответ:

Set-Cookie: locale=%7B%22locale%22%3A%22en-US%22%2C%22countryCode%22%3A%22US%22%2C%22languageCode%22%3A%22en%22%7D; Max-Age=1617632; Path=/; Expires=Sat, 24 Apr 2021 07:34:03 GMT; Secure; SameSite=None

chrome://settings/cookies/:

Name: locale
Content : %7B%22locale%22%3A%22en-US%22%2C%22countryCode%22%3A%22US%22%2C%22languageCode%22%3A%22en%22%7D
Domain: mydomain.herokuapp.com
Path: /
Send for: Secure connections only
Accessible to script: Yes
Created: Monday, April 5, 2021 at 9:25:27 AM
Expires: Saturday, April 24, 2021 at 2:45:56 AM

Я знаю, что вы не можете получить доступ к файлам cookie только HTTP в javascript, но это не cookie только HTTP. Он настроен на безопасность, но это не имеет значения «Файлы cookie с этим атрибутом могут быть прочитаны / изменены с доступом к жесткому диску клиента или из JavaScript, если атрибут cookie HttpOnly не установлен».src. Это также файл cookie с перекрестным происхождением, мой бэкэнд работает на mydomain.herokuapp.com, а мой интерфейс - на mydomain.netlify.app.

Что может привести к тому, что этот файл cookie будет недоступен для javascript?

Не существует файлов cookie с перекрестным происхождением. Вы не можете установить cookie в другом домене.

Barmar 05.04.2021 18:11

Спасибо. Я переключил его на тот же домен, но с разными поддоменами, и он все еще не работает. Разве это не должно работать на разных поддоменах?

Dashiell Rose Bark-Huss 06.04.2021 18:47

Вы можете устанавливать файлы cookie только в том же домене или в родительском домене. Не через поддомены.

Barmar 06.04.2021 18:48

Я смог заставить его работать с разными поддоменами, установив домен на mydomain.com после прочтения этого stackoverflow.com/questions/32354962/…

Dashiell Rose Bark-Huss 06.04.2021 20:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
34
1

Ответы 1

Проблема заключалась в том, что интерфейс может читать файл cookie с помощью javascript, только если файл cookie установлен в домене внешнего приложения. Но бэкэнд и фронтенд находились в совершенно разных доменах. А поскольку серверная часть находилась в совершенно другом домене, она не может устанавливать cookie в домене внешнего интерфейса. Поэтому я переместил их в поддомены того же домена - frontend.mydomain.com и backend.mydomain.com. Затем я установил cookie на mydomain.com, как описано здесь.

    res.cookie('locale', JSON.stringify(localeObj), {
      maxAge: new Date() * 0.001 + 300,
      domain: 'mydomain.com',
      secure: true,
      sameSite:'none',
    });

Другие вопросы по теме