Відповіді:
Поточна специфікація файлів 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 на одному хості вже не відрізняються портами.