Специфичен ли порт http cookies?

У меня есть две службы HTTP, работающие на одной машине. Я просто хочу знать, делятся ли они своими куки-файлами или браузер различает два сокета сервера.

8 ответов


текущая спецификация cookie является RFC 6265, который заменяет RFC 2109 и RFC 2965 (оба RFCs теперь помечены как "исторические") и формализует синтаксис для реального использования файлов cookie. В нем ясно сказано:

  1. введение

...

по историческим причинам cookies содержат ряд нарушений безопасности и конфиденциальности. Например, сервер может указать, что данный файл cookie предназначен для" безопасных " соединений, но атрибут Secure не обеспечивает целостность в присутствии активного сетевого злоумышленника. аналогично, cookies для данного хоста являются общими для всех портов на этом хосте, даже если обычная" политика того же происхождения", используемая веб-браузерами, изолирует контент, полученный через разные порты.

а также:

8.5. Слабая Конфиденциальность

Cookies делают не обеспечить изоляцию портом. Если файл cookie читается службой, работающей на одном порту, файл cookie также читается службой, работающей на другом порту того же сервера. Если файл cookie доступен для записи службой на одном порту, файл cookie также доступен для записи службой, работающей на другом порту того же сервера. По этой причине серверы не должны одновременно запускать службы с взаимным недоверием на разных портах одного и того же хоста и использовать cookies для хранения конфиденциальных данных информация.


по данным RFC2965 3.3.1 (за которым могут следовать или не следовать браузеры), если порт явно не указан через на Set-Cookie заголовок, cookies могут или не могут быть отправлены в любой порт.

Google Руководство По Безопасности Браузера говорит: по умолчанию область cookie ограничена всеми URL-адресами текущего имени хоста и не привязана к информации о порте или протоколе. и несколько строк позднее нет способ ограничить cookies только одним 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.

опять же, никто не может заботиться в этот момент, но это было легко и полезно в моей ситуации.


Это большая серая область в cookie SOP (та же политика происхождения).

теоретически вы можете указать номер порта в домене, и файл cookie не будет использоваться совместно. На практике это не работает с несколькими браузерами, и вы столкнетесь с другими проблемами. Поэтому это возможно только в том случае, если ваши сайты не предназначены для широкой публики, и вы можете контролировать, какие браузеры использовать.

лучший подход-получить 2 доменных имени для одного и того же IP и не полагаться на номера портов для cookies.


альтернативный способ обойти проблему - сделать имя файла cookie сеанса связанным с портом. Например:

  • mysession8080 сервер работает на порту 8080
  • mysession8000 сервер работает на порту 8000

ваш код может получить доступ к конфигурации веб-сервера, чтобы узнать, какой порт использует ваш сервер, и назвать файл cookie соответственно.

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

нет необходимости иметь точный номер порта в имени файла cookie, но это более удобно.

В общем случае имя cookie может кодировать любой другой параметр, специфичный для используемого вами экземпляра сервера, поэтому его можно декодировать в правильном контексте.


в IE 8 куки (проверенные только против localhost) совместно используются между портами. В FF 10 это не так.

Я опубликовал этот ответ, чтобы у читателей был хотя бы один конкретный вариант для тестирования каждого сценария.


у меня возникла аналогичная проблема с запуском (и попыткой отладки) двух разных приложений Django на одной машине.

я запускал их с помощью следующих команд:

./manage.py runserver 8000
./manage.py runserver 8001

когда я вошел в первый, а затем во второй, я всегда выходил из первого и viceversa.

я добавил Это на мой /и т. д./хосты

127.0.0.1    app1
127.0.0.1    app2

затем я начал два приложения с этими команды:

./manage.py runserver app1:8000
./manage.py runserver app2:8001

проблема решена :)


Это необязательно.

порт может быть указан, поэтому cookies могут быть специфичными для порта. Это не обязательно, веб-сервер / приложение должно заботиться об этом.

источник: статья в немецкой Википедии, RFC2109 глава 4.3.1