Почему в HTTP-ответе следует использовать как кеш, так и нет-хранилище?

Мне говорят, чтобы предотвратить утечку информации пользователя, только "no-cache" в ответ недостаточно. "no-store" также необходим.

Cache-Control: no-cache, no-store

После прочтения этой спецификации http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html, я все еще не совсем уверен, почему.

Мое настоящее понимание заключается в том, что он предназначен только для промежуточного кеш-сервера. Даже если в ответе "no-cache" , промежуточный сервер кеша может сохранить содержимое в энергонезависимой памяти. Сервер промежуточного кеша будет решать, использовать ли сохраненный контент для следующего запроса. Однако, если в ответе "no-store" , промежуточный кеш-сегмент не должен хранить контент. Таким образом, это безопаснее.

Есть ли другая причина, по которой нам нужны как "no-cache" , так и "no-store" ?

Ответ 1

Я должен уточнить, что no-cache не означает, что вы не кешируете. Фактически, это означает "revalidate with server" перед использованием любого кэшированного ответа, который может быть у вас, по каждому запросу.

must-revalidate, с другой стороны, нужно только повторить проверку, когда ресурс считается устаревшим.

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

no-store является фактически полной директивой кэширования и предназначен для предотвращения хранения представления в любой форме кэша вообще.

Я говорю, но заметьте это в спецификации RFC 2616 HTTP:

Буферы истории МОГУТ хранить такие ответы как часть их нормальной работы

Но это исключено из новой спецификации HTTP RFC 7234 в потенциальной попытке сделать no-store сильнее, см.

http://tools.ietf.org/html/rfc7234#section-5.2.1.5

Ответ 2

При определенных обстоятельствах IE6 все равно будет кэшировать файлы, даже если Cache-Control: no-cache находится в заголовках ответов.

состояния W3C no-cache:

Если директива no-cache не укажите имя поля, затем кеш НЕ ДОЛЖНО использовать ответ для удовлетворения последующий запрос без успеха повторная аттестация с сервером происхождения.

В моем приложении, если вы посетили страницу с заголовком no-cache, а затем вышли из системы, а затем отбросили назад в своем браузере, IE6 все равно захватит страницу из кеша (без нового запроса проверки на сервере), Добавление в заголовок no-store остановило его. Но если вы возьмете W3C по их словам, на самом деле нет способа контролировать это поведение:

Буферы истории МОГУТ хранить такие ответы как часть их нормальной работы.

Общие различия между историей браузера и обычным HTTP-кэшированием описаны в определенном подразделе спецификации.

Ответ 3

Из Спецификация HTTP 1.1:

не-магазин

Цель директивы без хранения заключается в предотвращении непреднамеренного выпуска или хранения конфиденциальной информации (например, на лентах резервного копирования). Директива no-store применяется ко всему сообщению, и МОЖЕТ быть отправлена ​​либо в ответе, либо в запросе. Если отправлено в запросе, кеш НЕ ДОЛЖЕН хранить какую-либо часть этого запроса или любой ответ на него. Если отправлено в ответе, кеш НЕ ДОЛЖЕН хранить какую-либо часть этого ответа или запрос, вызвавший его. Эта директива применяется как к не общим, так и к общим кэшам. "НЕ ДОЛЖНО хранить" в этом контексте означает, что кэш НЕ ДОЛЖЕН преднамеренно хранить информацию в энергонезависимой памяти, и ДОЛЖЕН сделать попытку с максимальной эффективностью удалить информацию из энергозависимой памяти как можно быстрее после ее пересылки. Даже когда эта директива связана с ответом, пользователи могут явно хранить такой ответ за пределами системы кэширования (например, с диалогом "Сохранить как" ). Буферы истории МОГУТ хранить такие ответы как часть их нормальной работы. Целью этой директивы является удовлетворение заявленных требований определенных пользователей и авторов услуг, которые обеспокоены случайными выбросами информации через непредвиденные обращения к структурам данных кэша. Хотя использование этой директивы может улучшить конфиденциальность в некоторых случаях, мы предупреждаем, что она никоим образом не является надежным или достаточным механизмом обеспечения конфиденциальности. В частности, вредоносные или скомпрометированные кеши могут не распознавать или подчиняться этой директиве, а сети связи могут быть уязвимы для подслушивания.

Ответ 5

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

Как это устроено:

  • Обычно, даже если пользовательский агент, такой как браузер, определяет, что ответ не должен кэшироваться, он все равно может сохранить его в кеше диска по причинам, внутренним для пользовательского агента. Эта версия может использоваться для таких функций, как "просмотр источника", "назад", "информация о странице" и т.д., Когда пользователь не обязательно запрашивал страницу снова, но браузер не считает ее новым просмотром страницы. и было бы целесообразно предоставить ту же версию, которую просматривает пользователь.

  • Использование no-store предотвратит no-store этого ответа, но это может повлиять на способность браузера предоставлять "просмотр источника", "возврат", "информацию о странице" и т.д. Без создания нового отдельного запроса для сервера, что нежелательно., Другими словами, пользователь может попытаться просмотреть источник, и если браузер не сохранил его в памяти, ему либо сообщат, что это невозможно, либо это вызовет новый запрос к серверу. Таким образом, no-store следует использовать только в том случае, если затрудненный пользовательский интерфейс этих функций не работает должным образом или быстро перевешивается из-за важности обеспечения того, чтобы содержимое не сохранялось в кэше.

В настоящее время я понимаю, что это только для промежуточного сервера кеша. Даже если в ответе нет кэша, сервер промежуточного кэша может сохранять содержимое в энергонезависимой памяти.

Это неверно Серверы промежуточного кэша, совместимые с HTTP 1.1, будут выполнять инструкции no-cache и must-revalidate, гарантируя, что контент не будет кэширован. Использование этих инструкций гарантирует, что ответ не кэшируется каким-либо промежуточным кэшем и что все последующие запросы отправляются обратно на исходный сервер.

Если промежуточный сервер кеша не поддерживает HTTP 1.1, вам нужно будет использовать Pragma: no-cache и надеяться на лучшее. Обратите внимание, что если он не поддерживает HTTP 1.1, то в любом случае no-store.

Ответ 6

Если система кэширования правильно реализует no-store, то вам не понадобится no-cache. Но не все так делают. Кроме того, некоторые браузеры реализуют без кеш-памяти, как это было без магазина. Таким образом, хотя это и не является обязательным требованием, возможно, безопаснее всего включать и то, и другое

Ответ 7

Для chrome no-cache используется для перезагрузки страницы при повторном посещении, но она все еще кэширует ее, если вы вернетесь в историю (кнопка "Назад" ). Чтобы перезагрузить страницу для истории, также используйте no-store. Потребности IE должны-revalidate работать во всех случаях.

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

Cache-Control: no-store, no-cache, must-revalidate

если я хочу убедиться, что он перезагружается.

Ответ 8

Обратите внимание, что Internet Explorer с версии 5 до 8 будет вызывать ошибку при попытке загрузить файл, обслуживаемый через https, и сервер, отправляющий заголовки Cache-Control: no-cache или Pragma: no-cache.

См. http://support.microsoft.com/kb/812935/en-us

Использование Cache-Control: no-store и Pragma: private кажется наиболее близким, которое все еще работает.

Ответ 9

Изначально мы использовали no-cache много лет назад и столкнулись с некоторыми проблемами со старым контентом с определенными браузерами... Не помню специфики, к сожалению.

С тех пор мы все-таки остановились на использовании магазина без магазина. Никогда не оглядывались назад или не имели ни одной проблемы с устаревшим контентом со стороны любого браузера или посредников с тех пор.

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

Ответ 11

OWASP обсуждает это:

В чем разница между директивами управления кэшем: no-cache и no-store?

Директива no-cache в ответе указывает, что ответ не должен использоваться для обслуживания последующего запроса, т.е. В кеше не должно отображаться ответ, для которого эта директива установлена в заголовке, а сервер должен обслуживать запрос. Директива no-cache может содержать некоторые имена полей; в этом случае ответ может быть показан из кэша, за исключением указанных имен полей, которые должны обслуживаться с сервера. Директива no-store применяется ко всему сообщению и указывает, что кэш не должен хранить какую-либо часть ответа или любой запрос, который его запрашивал.

Я полностью в безопасности с этими директивами?

Нет. Но, как правило, используйте Cache-Control: no-cache, no-store и Pragma: no-cache, в дополнение к Expires: 0 (или достаточно поздней дате GMT, такой как эпоха UNIX). Не HTML-типы контента, такие как pdf, документы Word, электронные таблицы Excel и т.д., Часто кэшируются, даже если установлены вышеуказанные директивы управления кэшем (хотя это зависит от версии и дополнительного использования must-revalidate, pre-check = 0, post-check = 0, max-age = 0 и s-maxage = 0 на практике иногда может привести, по крайней мере, к удалению файла при закрытии браузера, в некоторых случаях из-за особенностей браузера и реализации HTTP). Кроме того, функция "Автозаполнение" позволяет браузеру кэшировать все, что пользователь вводит в поле ввода формы. Чтобы проверить это, тег формы или отдельные входные теги должны включать атрибут Autocomplete = "Off". Однако следует отметить, что этот атрибут является нестандартным (хотя он поддерживается основными браузерами), поэтому он нарушит проверку XHTML.

Источник здесь.