Відповіді:
Поточна специфікація файлів cookie - RFC 6265 , яка замінює RFC 2109 та RFC 2965 (обидва RFC тепер позначені як "Історичні") та формалізує синтаксис для використання файлів cookie в реальному світі. У ньому чітко зазначено:
- Вступ
...
З історичних причин файли cookie містять низку порушень безпеки та конфіденційності. Наприклад, сервер може вказати, що певний файл cookie призначений для "захищених" з'єднань, але атрибут Secure не забезпечує цілісності в присутності активного мережевого зловмисника. Аналогічно, файли cookie для даного хоста поділяються у всіх портах цього хоста, навіть якщо звичайна "політика того самого походження", яка використовується веб-браузерами, виділяє вміст, отриманий через різні порти.
А також:
8.5. Слабка конфіденційність
Файли cookie не забезпечують ізоляції по порту . Якщо файл cookie читається службою, що працює на одному порту, файл cookie також читається службою, що працює на іншому порту того ж сервера. Якщо файл cookie можна записувати службою на одному порту, файл cookie також може бути записаний службою, що працює на іншому порту того ж сервера. З цієї причини, сервери НЕ повинні обидва запускати послуги, що взаємно недовіряють, на різних портах одного хоста і використовують файли cookie для зберігання інформації, що стосується безпеки.
Відповідно до RFC2965 3.3.1 (за яким браузери можуть дотримуватися або можуть не дотримуватися), якщо порт прямо не вказаний через portпараметр Set-Cookieзаголовка, файли cookie можуть або не можуть бути надіслані до будь-якого порту.
Посібник з безпеки веб-переглядачів Google говорить: за замовчуванням область використання файлів cookie обмежена всіма URL-адресами поточного імені хоста - і не пов'язана з інформацією про порт або протокол. а деякі рядки пізніше. Немає можливості обмежувати файли cookie лише одним ім'ям DNS [...], також немає можливості обмежити їх певним портом. (Крім того , майте на увазі, що IE робить число не фактор порту в його ж походження політики взагалі .)
Тому, здається, не покладатися на будь-яку чітко визначену поведінку тут.
Це справді старе питання, але я думав, що я додам вирішення, яке я використав.
У мене на ноутбуці працює дві служби (одна на порту 3000, а інша на 4000). Коли я переходжу між ( http://localhost:3000і http://localhost:4000), Chrome передає один і той же файл cookie, кожна служба не розумітиме файли cookie та генерує новий.
Я виявив, що якщо я отримав доступ http://localhost:3000і http://127.0.0.1:4000, проблема пішла, оскільки Chrome зберігав файл cookie для localhost та один для 127.0.0.1.
Знову ж таки, ніхто не може байдуже в цей момент, але це було легко і корисно для моєї ситуації.
localhostне може бути спільним для спільного використання 127.0.0.1та навпаки. Але куки на одному хості / домені, незалежно від порту, можна поділитись.
Це велика сіра зона у cookie SOP (однакова політика щодо оригіналу).
Теоретично ви можете вказати номер порту в домені, і файл cookie не буде надано спільним. На практиці це не працює з кількома браузерами, і ви зіткнетеся з іншими проблемами. Тож це можливо лише в тому випадку, якщо ваші веб-сайти не є загальнодоступними та ви можете контролювати, якими браузерами користуватися.
Кращий підхід - отримати 2 доменних імені для одного і того ж IP-адреси і не покладатися на номери портів для файлів cookie.
Альтернативний спосіб вирішити проблему - зробити так, щоб ім'я файлу cookie сеансу було пов’язане з портом. Наприклад:
Ваш код може отримати доступ до конфігурації веб-сервера, щоб дізнатися, який порт використовує ваш сервер, і відповідно назвати файл cookie.
Майте на увазі, що ваша програма отримає обидва файли cookie, і вам потрібно подати запит на той, який відповідає вашому порту.
У назві файлу cookie не потрібно мати точний номер порту, але це зручніше.
Загалом, ім'я файлу cookie може кодувати будь-який інший параметр, характерний для використовуваного вами екземпляра сервера, тому його можна декодувати правильним контекстом.
У мене виникли подібні проблеми із запуском (і намаганням налагодити) два різних програми Django на одній машині.
Я запускав їх із цими командами:
./manage.py runserver 8000
./manage.py runserver 8001
Коли я робив логін у першому, а потім у другому, я завжди виходив із першого та viceversa.
Я додав це до свого / etc / hosts
127.0.0.1 app1
127.0.0.1 app2
Потім я запустив дві програми з цими командами:
./manage.py runserver app1:8000
./manage.py runserver app2:8001
Проблема вирішена :)
127.0.0.1:8000один, localhost:8000другий, а можливо ::1:8000(можливо [::1]:8080) і третій, не торкаючись файлів хостів.
::1 app1 app2 app3 app4 app5 appN
Це необов’язково.
Порт може бути визначений, щоб файли cookie могли бути специфічними для порта. Це не обов'язково, веб-сервер / програма повинні дбати про це.
Джерело: стаття німецької Вікіпедії , RFC2109 , глава 4.3.1
Portпараметр уSet-Cookieзаголовку (оскільки практично ніхто його фактично не використовував на практиці), і робить це явно, що файли cookie на одному хості вже не відрізняються портами.