Некоторый небольшой процент времени мы видим поток, подобный этому, выводящий из просмотра журналов сервера (я не смог воспроизвести этот случай с любым браузером):
В момент A клиент заходит на нашу страницу:
- без печенья
- возвращает ответ с
Set-Cookie
заголовком ответа HTTP, который дает им идентификатор сеанса B
- В теле есть JS для запуска AJAX-запроса
/ajax/foo
.
В момент времени A + 1 секунда клиент отправляет нам запрос AJAX на /ajax/foo
- для реферера задана страница на шаге 1, которая запустила AJAX, как и ожидалось
- без печенья - почему?
- возвращает ответ с заголовком
Set-Cookie
, который дает им идентификатор сеанса C (ожидается, так как они не отправили нам cookie)
Через некоторое время все клиентские запросы отправляют либо идентификатор сеанса B, либо C - поэтому проблема в , а не в том, что в браузере отключены файлы cookie.
Похоже, что это, по сути, условие гонки: запрос главной страницы и запрос AJAX выполняются очень близко по времени, и без файлов cookie, и существует гонка за установку файлов cookie. Один выигрывает, а другой проигрывает.
Что меня озадачивает, как это могло случиться? Я предполагаю, что к тому времени, когда браузер прочтет достаточно ответа, чтобы знать, что ему нужно запустить AJAX-запрос, он уже получил заголовки ответа HTTP и, таким образом, заголовок ответа Set-Cookie
. Поэтому мне кажется, что клиент всегда будет отправлять обратно cookie, который мы установили на странице, которая запустила AJAX-запрос. Я просто не понимаю, как это может произойти, если браузер не обрабатывает ответ Set-Cookie
незамедлительно.
Как я уже сказал, я не могу воспроизвести это в Firefox, Safari или Chrome, но мы видим это несколько раз в день.