Cookie автоматически становится httpOnly

У меня есть веб-приложение, развернутое в WebSphere в корневом контексте /app. Внутри приложения есть javascript, который запускается сразу после загрузки, он выглядит примерно так:

document.cookie = "foo=bar; path=/app";

setTimeout(function () {
    document.cookie = "baz=qux; path=/app";
}, 1000);

Поведение Chrome

Из DevTools я вижу, что изначально foo=bar создается как non -httpOnly, а через 1-2 секунды автоматически становится httpOnly. После ожидания примерно 5 секунд (на всякий случай) создается и второй файл cookie, но в режиме, отличном от httpOnly, окончательный результат выглядит следующим образом:

foo=bar (httpOnly=true)
baz=qux (httpOnly=false)

Вопрос 1. Почему foo = bar через некоторое время становится httpOnly?

Q2: Почему отложенное создание файлов cookie имеет такое значение?

Я могу сказать, что порог составляет где-то 700-800 мс, если я задерживаю создание файла cookie с меньшим, чем это значение, он ведет себя точно так же, как и без задержки.

Поведение Firefox

Здесь в случае задержки ниже порогового значения (или без какого-либо setTimeout) он создает 2 файла cookie для каждого kay, пары значений, например:

foo=bar; path=/app  (httpOnly=false)
foo=bar; path=/app/ (httpOnly=true)
baz=qux; path=/app  (httpOnly=false)
baz=qux; path=/app/ (httpOnly=true)

в то время как в случае задержки, превышающей пороговое значение, он не создает дублирующий файл cookie (для baz = qux):

foo=bar; path=/app  (httpOnly=false)
foo=bar; path=/app/ (httpOnly=true)
baz=qux; path=/app  (httpOnly=false)

Q3: Не говоря уже о том, почему FF добавляет косую черту в конце (я слышал, что разные браузеры по-разному обрабатывают файлы cookie), почему это не относится к отложенному созданию файлов cookie?

Я даже подумал, что, возможно, где-то в приложении есть фрагмент скрипта, который через некоторое время "перезаписывает" файлы cookie, не относящиеся к httpOnly, в httpOnly one, но я не думаю, что это так, потому что выполнение этого из консоли ничего не меняет :

document.cookie="baz=qux; path=/app; HttpOnly"

т.е. baz = qux остается не-httpOnly. Некоторые даже утверждают, что это невозможно

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

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

Любые идеи? К сожалению, я не могу поделиться настоящим кодом. Если бы кто-то смог хотя бы теоретически объяснить, в чем может быть причина, это было бы действительно полезно.

Другие примечания:

  • Это не относится к файлам cookie, созданным с помощью path = /
  • Версия Chrome: 75.0.3770.100
  • Версия Firefox: 67.0.4
  • Я использую окно в режиме инкогнито без расширений

person tsobe    schedule 04.07.2019    source источник


Ответы (1)


Хорошо, немного покопавшись, я думаю, что нашел объяснение

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

Это не совсем так, очевидно, WebSphere отправлял cookie с установленным флагом httpOnly, вероятно, это произошло из-за HTTPOnly flag. Однако это не всегда было видно в сетевом представлении Chrome / Firefox DevTools. Помню только один случай (из нескольких десятков), когда это было видно. Не уверен, почему браузеры не отображали его постоянно (даже при жестком обновлении)

person tsobe    schedule 29.07.2019