У меня есть следующие поддомены:
api.example.com
app1.example.com
app2.example.com
Я использую nginx в качестве веб-сервера для обслуживания всех этих.api.example.com
это приложение на python-flask, которое я разрабатываю.app1.example.com
и app2.example.com
- это статический js-контент, не разработанный мной.
Nginx настроен на совместное использование ресурсов между источниками:
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' $http_origin always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Max-Age' 1728000 always;
add_header 'Content-Type' 'text/plain; charset=utf-8' always;
add_header 'Content-Length' 0 always;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' $http_origin always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' $http_origin always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
}
Над землей в блоке location
, который передает управление сокету uwsgi.То же самое копируется для api1
, а api2
.
app1
и app2
делают запросы к api
, а api
устанавливает cookie в ответ на некоторые из этих запросов.
Cookies установлены следующим образом:
response.set_cookie(
key='some_cookie_name',
value=some_token,
max_age=current_app.config["JWT_EXP"],
secure=True,
httponly=True)
path
по умолчанию установлено в '/'
, атрибут
domain
отсутствует в ответе, атрибут samesite
также отсутствует
все вышеизложенное согласно этой документации .
Исправьте меня, если я ошибаюсь, но согласно моему пониманию, когда app1
запрашивает api
ресурс (который устанавливает cookie), этот cookie ограничен app1.example.com
и не должен присутствовать в app2.example.com
(и наоборот).
Поведение, которое я наблюдаю в chrome, отличается.
Установка cookie для запроса app1
, а затем установка cookie (с тем же именем) для запроса app2
, переопределение cookie для app1
.app2
на субдомене нет файлов cookie (проверка с помощью инструментов разработчика Chrome).
Теперь, когда я изменяю имя файла cookie для второго субдомена (app2
), файлы cookie все равно не будут присутствовать на app2
, однако, второй cookie с другим именем теперь виден на поддомене app1
.
Похоже, что все, что я делаю, все файлы cookie установлены на поддомене app1
.Эти файлы cookie также присутствуют при проверке example.com
.
Более того, когда app2.example.com
отправляет запрос на api
, он отправляет обратно все файлы cookie, видимые на app1
.
Правильно ли это поведение?Это связано с тем, что CORS включен на стороне сервера?Как разделить файлы cookie между app1
и app2
?
edit: добавлен код конфигурации cors