Почему Chrome устанавливает cookie на неправильный поддомен? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть следующие поддомены:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...