У меня есть веб-приложение, развернутое в 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
- Я использую окно в режиме инкогнито без расширений