Как обрабатывать несколько файлов cookie с одинаковым именем?


скажем, например, у меня было приложение, отправляющее следующие заголовки HTTP для установки в cookie с именем "a":

Set-Cookie: a=1;Path=/;Version=1
Set-Cookie: a=2;Path=/example;Version=1

Если я получу доступ /example на сервере оба пути действительны, поэтому у меня есть два куки с именем "a"! Поскольку браузер не отправляет информацию о пути, эти два куки-файла не могут быть различены.

Cookie: a=2; a=1

как в этом случае быть? Выбрать первый? Создать список со всеми значениями cookie? Или такой случай следует рассматривать как разработчика ошибка?

5 67

5 ответов:

с эта статья на SitePoint:

Если несколько файлов cookie с одинаковым именем соответствуют заданному URI запроса, один из них выбирается браузером.

более конкретный путь, тем выше приоритет. Однако приоритет, основанный на других атрибутах, включая домен, не определен и может варьироваться между браузерами. Это означает, что если вы установили куки с тем же именем против ".example.org-и ...www.example.org-ты не можешь быть уверен, что именно. один будет отправлен обратно.

Edit: эта информация с 2010 года кажется устаревшей, похоже, что браузеры теперь могут отправлять несколько файлов cookie взамен, см. ответ @Nate ниже для получения подробной информации

ответ, относящийся к статье о SitePoint, не является полностью полным. Пожалуйста, смотрите RFC 6265 (справедливости ради, этот RFC был выпущен в 2011 году после публикации этого вопроса, который заменяет предыдущий RFC 2965 2000 и RFC 2109 С 1997 года).

В разделе 5.4, подраздел 2 говорится следующее:

агент пользователя должен отсортировать список cookie в следующем порядке:

  • печенье с более длинные пути перечислены перед файлами cookie с более короткими путями.

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

есть также Этот маленький драгоценный камень в разделе 4.2.2:

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

в вашем примере запрос cookie (Cookie: a=2; a=1) обратите внимание, что файл cookie установлен с пути /пример (a=2) имеет более длинный путь, чем путь / (a=1) и так это отправлено обратно вам первым в строке, которая соответствует рекомендации спецификации. Таким образом, вы более или менее правы в своем предположении, что вы может выбрать первое значение.

к сожалению, язык, используемый в RFC, чрезвычайно специфичен-использование слов должны и НЕ ДОЛЖНО ввести двусмысленность в РКС. Они указывают на то, чтодолжны, но не требуются будет соответствует спецификации. Хотя я хорошо понимаю RFC для этого, я не проводил исследования, чтобы увидеть, что делают клиенты реального мира; возможно, один или несколько браузеров или другое программное обеспечение, действующее как HTTP-клиенты, не могут отправлять файлы cookie с самым длинным путем (например:/пример) сначала в Cookie:.

Если вы в состоянии контролировать значение файла cookie, и вы хотите сделать свое решение надежным, вам лучше всего либо:

  1. использование другого имени файла cookie для переопределения в определенных путях, таких как:

    • Set-cookie: a-global=1; Path=/; Version=1
    • Set-cookie: a-example=2; Path= / example; Version=1
  2. сохранение нужного пути в самом значении cookie:

    • Set-cookie: a=1 & path=/; Path=/; Version=1
    • Set-cookie: a=2 & path= / example; Path= / example; Version=1

оба эти обходные пути требуют дополнительной логики на сервере, чтобы выбрать нужное значение cookie, сравнивая запрошенный URL-адрес со списком доступных файлов cookie. Это не слишком красиво. К сожалению, у RFC не было предвидения, чтобы требовать, чтобы более длинный путь полностью переопределял cookie с более коротким путем (например: в вашем примере вы получите Cookie: a=2 только).

Если вам нужно, чтобы различать их, вы должны дать им разные основные ценности.

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

Я настоятельно рекомендую эту практику избежавший.

однако если вы действительно хотите знать, как браузеры (и приложения) обрабатывают этот сценарий, почему бы не построить тестовую установку и не попробовать ее.

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

Если вы этого не сделаете, то, конечно, разные имена являются решением, если вы хотите оба контекста.

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

теперь, когда вы знаете самая важная часть (как они работают), и что вы можете выполнить то, что вам нужно несколькими различными способами, мой ответ на ваш вопрос: это проблема разработчика.