Что такое контроль кеша в магазине Пятерочка

Обновлено: 21.11.2024

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

Итак, во время одной из моих оценок безопасности я наткнулся на веб-сайт, который использует только заголовок cache-control: no-cache в ответах, содержащих конфиденциальную информацию, такую ​​как ключи API, кредитные карты и банковские счета.

Должны ли такие ответы содержать cache-control: no-store , pragma: no-cache в ответах для большей безопасности или достаточно cache-control: no-cache?

1 Ответ 1

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

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

Обратите внимание, что "без успешной проверки" означает, что кэшированный ответ может использоваться, если проверка на исходном сервере прошла успешно. (Процесс проверки описан в разделе 4.3.) Следовательно, cache-control: no-cache не запрещает пользовательскому агенту сохранять содержимое ответа.

Прагма: no-cache также неверна по той же причине. См. RFC 7234, раздел 5.4:

Если поле заголовка Cache-Control отсутствует в запросе, кеши ДОЛЖНЫ рассматривать прагму-директиву запроса no-cache как имеющую тот же эффект, как если бы присутствовало «Cache-Control: no-cache» ( см. Раздел 5.2.1).

Директива ответа "no-store" указывает, что кеш НЕ ДОЛЖЕН хранить какую-либо часть немедленного запроса или ответа. Эта директива применяется как к частному, так и к общему кэшу. «НЕ ДОЛЖЕН хранить» в этом контексте означает, что кэш НЕ ДОЛЖЕН преднамеренно хранить информацию в энергонезависимом хранилище и ДОЛЖЕН предпринять все возможные попытки удалить информацию из энергозависимого хранилища как можно быстрее после ее пересылки.

Я не вижу практической разницы между Cache-Control:no-store и Cache-Control:no-cache .

Насколько мне известно, no-store означает, что никакому кэширующему устройству не разрешено кэшировать этот ответ. С другой стороны, отсутствие кеша означает, что никакому устройству кеша не разрешено обслуживать кешированный ответ без его предварительной проверки с помощью источника. Но в чем заключается эта проверка? Условное получение?

Что делать, если в ответе нет кэша, но нет Last-Modified или ETag?

3 ответа 3

См. блок-схему ниже для лучшего понимания

Но для чего этот чек?

Точная проверка Last-Modified или ETag . Клиент спрашивает сервер, есть ли у него новая версия данных, используя эти заголовки, и если ответ отрицательный, он будет обслуживать кэшированные данные.

Не могли бы вы обновить свою цитату, чтобы она соответствовала тексту в этом вопросе? Это помогает проверить, на что именно вы отвечаете.

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

Помимо производительности, есть разница в поведении истории браузера. В разделе 13.13 HTTP 1.1 говорится, что «срок действия не применяется к механизмам истории». Заголовок no-cache описывает срок действия и поэтому не применяется к механизмам истории, таким как кнопка «Назад». Таким образом, пользователь может вернуться на предыдущую страницу без кеша без связи с сервером.

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

Вот как проблема Chromium по этой теме делает различие:

без кэширования не означает "не кэшировать это" (это было бы без сохранения). no-cache означает, что не используйте это для обычных нагрузок, если ресурс не проверен на свежесть. Навигация по истории не является обычной загрузкой.

ПРИМЕЧАНИЕ. Чтобы понять основы очистки и почему она так тесно связана с кэшированием, см. «Akamai 101: Основы очистки». Дополнительные преимущества кэширования см. в разделе «Повышение производительности API с помощью кэширования».

В первом видео из своей "неофициальной" серии видео Тедд Смит и Си Джей Арнесен объясняют основы кэширования: что это такое, почему это важно и как извлечь из этого максимальную пользу.

Тедд и СиДжей — инженеры по решениям в Akamai, которые регулярно привлекают новых клиентов. Они узнали, что хотя краткие руководства и руководства пользователя Akamai оказались полезными для клиентов, им нужно было что-то другое для повышения уровня новых членов команды и представления других отделов компании. Это и последующие видео — отличное введение в Akamai, кэширование и CDN в целом.

Следует расшифровка видео, но я рекомендую вам посмотреть видео, так как иллюстрации на доске забавны и информативны.

Расшифровка

Здравствуйте, меня зовут Тедд Смит, я инженер по решениям в Akamai. Это означает, что я имею честь объяснять, как технология Akamai работает с широким кругом клиентов. Я подумал, что было бы неплохо зафиксировать некоторые из этих знаний в серии видеороликов, которые помогут объяснить некоторые концепции, над которыми мы работаем.

Я хотел начать эту серию видеороликов с краткого введения в кэширование. Концепция кэширования не нова, стреляйте… просто подумайте о своем заднем дворе. Ваши соседские белки всегда стараются спрятать свои желуди в пустых пнях на случай надвигающегося Эль-Ниньо.

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

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

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

Управление кэшем

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

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

Места, которые можно кэшировать

Многие из вас уже знакомы с некоторым уровнем кэширования, которое происходит на вашем веб-сервере или балансировщике нагрузки. Вспомните Varnish или Squid. Это отличные места для начала, но они по-прежнему требуют, чтобы запрос полностью вернулся на ваш веб-сервер, что ограничивает прирост производительности и использует ресурсы, такие как ЦП и пропускная способность.

Следующее место, где вы можете кэшировать, — это ваш партнер CDN. Именно здесь можно получить значительный прирост производительности и разгрузку ресурсов. Используя партнера CDN, ваш контент теперь хранится на их серверах и, если он настроен правильно, хранится рядом с вашими клиентами, что повышает производительность. Благодаря подключению клиентов к CDN им не нужно снова и снова загружать ваш веб-сервер одними и теми же запросами.

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

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

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

Настройка Akamai с помощью Luna Control Center

При настройке параметров кэширования в Akamai Luna Control Center вы должны использовать Property Manager для настройки различных правил. Поведение кэширования дает вам пять вариантов в раскрывающемся списке:

  • учитывать контроль исходного кэша + срок действия — указывает, что серверы Akamai должны учитывать оба заголовка Cache-Control и Expires, полученные от ваших серверов.
  • учитывать исходный контроль кэша — указывает, что серверы Akamai должны учитывать только заголовок Cache-Control, полученный от ваших внутренних серверов.
  • учитывать срок действия источника – указывает серверам Akamai учитывать только заголовок Expires, полученный от внутренних серверов. Примечание. При выборе любого из этих трех вариантов вам необходимо определить максимальный возраст по умолчанию, который будет использоваться в том случае, если ваши серверы НЕ возвращают ни один из указанных заголовков.
  • кэш — позволяет определить время жизни (TTL) всех активов, обслуживаемых через Akamai, независимо от того, что ваши серверы указывают в заголовках Cache-Control или Expires. Мы рекомендуем это для всех ваших статических объектов.
  • без сохранения: кэш Akamai не сохраняет копию файла и всегда запрашивает новую копию с внутренних серверов. Мы рекомендуем это для динамических вызовов HTML или API.

Заключение

Как видите, существует множество способов и мест для управления вашим контентом. Правильное управление кэшированными ресурсами может помочь повысить производительность, гарантируя, что ваш партнер CDN доставляет как можно больше вашего контента из Интернета.

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

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

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

К сожалению, кеш браузера ненадежен: пользователи могут очистить кеш в любое время и даже отключить кеш. Еще одним недостатком является тот факт, что кеш размещается локально, а это означает, что кеш приходится на каждого пользователя.

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

Поскольку широкополосный доступ в Интернет стал более распространенным, локальные кеширующие прокси-серверы перестали иметь решающее значение. Вместо этого увеличение пропускной способности сместило нагрузку с клиента на сервер: всплески трафика стали угрожать стабильности серверов. Как следствие, кеширующие прокси-серверы также изменились.

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

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

Кэшируемое содержимое может быть общедоступным или частным.

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

Заголовки ответов Cache-Control: public и Cache-Control: private используются для установки области кэширования.

Пока не истекло время жизни кэшированного объекта, содержимое считается свежим. Это означает, что он может быть доставлен из кеша запрашивающим клиентам.

Оставшееся время жизни объекта — это значение, которое меняется каждую секунду. Как только он достигает нуля, содержимое перестает быть свежим. Вместо этого он считается устаревшим и нуждается в повторной проверке.

Повторная проверка кэша – это процесс обратного подключения к исходному веб-серверу и получения потенциально обновленного контента. Как только повторная проверка завершена, объект снова считается свежим, пока позволяет время жизни.

Повторная проверка также может быть выполнена условно. Это означает, что исходный веб-сервер будет отправлять полезную нагрузку только в том случае, если запрошенный ресурс изменился. Если ресурс не изменился, будет возвращен код состояния 304 Not Modified без тела ответа.

Это уменьшает объем данных, отправляемых по сети, а также может привести к меньшему потреблению ресурсов сервера на исходном уровне.

Когда кеш получает ответ 304 Not Modified, время жизни, определенное в заголовке Cache-Control или Expires, будет использоваться для установки срока жизни объекта после повторной проверки.

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

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

Исходный веб-сервер может создать заголовок Vary, чтобы сообщить кешу, какой заголовок запроса следует использовать для создания вариантов. В случае многоязычного веб-сайта Vary: Accept-Language является логичным выбором.

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

Убедитесь, что ваши варианты находятся под контролем, иначе лучше вообще не кэшировать ответ.

  • Время жить
  • Кэшируемость
  • Область действия (общая или частная)
  • Повторная проверка

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

Вот пример, когда общедоступный ресурс объявляется через заголовок Cache-Control:

Эквивалент для частного содержания:

Директива max-age используется для установки времени жизни объекта в кеше. Вот пример:

Этот заголовок указывает кэшу хранить объект в течение 3600 секунд, что соответствует часу.

Директива s-maxage делает то же самое, что и max-age , но предназначена для кэширования прокси-серверов, а не для веб-клиентов.

Вот пример, когда кеширующий прокси получает указание кэшировать объект на день:

Эти директивы также можно комбинировать:

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

Директива stale-while-revalidate устанавливает допустимое устаревание кэшированного объекта, позволяя просроченному контенту, срок действия которого истек, обслуживаться из кэша.

Значение stale-while-revalidate задает время в секундах после истечения срока действия, в течение которого устаревшее содержимое может обслуживаться, пока кеш повторно проверяет содержимое.

Вот пример:

В этом примере кэшированный объект считается свежим в течение 900 секунд. После этого необходимо провести переаттестацию. Но из-за директивы stale-while-revalidate=100 объект может обслуживаться из кеша еще 100 секунд, пока кеш асинхронно проверяет исходный веб-сервер.

Если разрешено устаревание, на конечного пользователя не повлияют потенциально медленные серверные части в процессе повторной проверки. Благодаря stale-while-revalidate кэшу можно указать обслуживать устаревшие данные, пока извлекается новая версия ресурса.

Но что происходит, когда исходный веб-сервер не работает?

Пока значение stale-while-revalidate достаточно велико, устаревший контент будет обслуживаться, а неудачная повторная проверка останется незамеченной для пользователя.

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

Директива stale-if-error устанавливает устаревание, когда источник не работает. Вот пример:

В этом примере объект хранится в кэше в течение 900 секунд, и, если источник исправен, этот объект может обслуживаться до 100 секунд после истечения срока действия объекта.

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

Если устаревание не разрешено, для его принудительного применения используется ключевое слово must-revalidate. Вот пример:

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

Если веб-клиенту разрешено обслуживать устаревшие объекты из кеша, а промежуточным кешам — нет, вы можете использовать ключевое слово proxy-revalidate, чтобы обеспечить это.

В этом случае объект кэшируется на час. После этого разрешены дополнительные 100 секунд устаревания, пока происходит повторная проверка. Из-за proxy-revalidate устаревание разрешено только веб-клиентом. Кэширующие прокси-серверы не могут обрабатывать устаревший контент.

Если веб-сервер возвращает некэшируемый ответ, можно использовать синтаксис Cache-Control: no-cache, no-store, чтобы указать кэшу не кэшировать этот ответ.

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

Директива no-store указывает кэшу не сохранять этот ресурс в кэше.

Обе директивы можно использовать по отдельности, но их также можно комбинировать.

Заголовок Expires также можно использовать для установки времени существования объекта. Заголовок Expires не использует относительные числа, как заголовок Cache-Control. Вместо этого он устанавливает дату и время истечения срока действия.

Вот пример:

Этот кэшируемый ресурс считается свежим до субботы, 4 мая 2024 года, 8 часов по Гринвичу.

Установив дату и время в прошлом, заголовок Expires может указать кэшу не сохранять объект.

Заголовок Vary используется для создания вариантов кеша. Как объяснялось ранее, варианты кэша используются для создания нескольких вариантов кэшированного объекта на основе заголовка запроса.

Вот пример:

В этом примере будет создан вариант кеша для этого ресурса на основе значения заголовка запроса Accept-Language. Это позволит правильно кэшировать многоязычные веб-сайты, использующие одну и ту же структуру URL для разных языков.

Вот еще один пример:

Тег Entity, возвращаемый через заголовок ответа Etag, используется для идентификации конкретной версии ресурса.

Значение Etag может быть любым, но оно должно быть уникальным для представляемой версии. Считайте это отпечатком содержания.

Когда веб-сервер возвращает заголовок Etag, значение может быть представлено клиентом при последующих запросах в форме заголовка запроса If-None-Match.

Если значения If-None-Match и Etag различаются, содержимое изменилось, и возвращается обычный ответ 200 ОК, содержащий текст.

Заголовок ответа Last-Modified также определяет конкретную версию ресурса. В отличие от заголовка Etag, он использует дату последнего изменения для идентификации этого ресурса.

Вот пример:

Это значение представляет время последнего изменения ресурса. Значение этого заголовка ответа может быть представлено веб-серверу при последующих запросах в форме заголовка If-Modified-Since.

Вот пример:

Значение заголовка If-Modified-Since старше значения, представленного в заголовке Last-Modified. Это означает, что содержимое изменилось и должен быть возвращен ответ 200 ОК.

Если значения If-Modified-Since и Last-Modified были одинаковыми, клиент имеет самую последнюю версию ресурса, и может быть возвращен ответ 304 Not Modified без текста.

Заголовок Age используется для информирования клиента о том, как долго объект хранится в кэше.

Вот пример:

Это означает, что объект хранится в кэше в течение 100 секунд.

Представьте себе следующий пример:

Мы знаем, что директива max-age=300 устанавливает время жизни кэшированного объекта на 300 секунд. Тот факт, что для заголовка Age задано значение 100 секунд, означает, что у объекта кеша есть оставшееся время жизни 200 секунд.

Когда прокси-сервер с обратным кэшированием, такой как Varnish, используется для ускорения вашего исходного сервера, в зависимости от сценария существует определенный поток.

Мы хотели бы представить четыре сценария:

  • Поток промахов кеша
  • Поток обращений к кешу
  • Процедура повторной проверки кеша
  • Поток условной повторной проверки

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

Несмотря на то, что мы пытаемся свести выборки источника к минимуму, промахи в кеше не обязательно являются чем-то плохим. Промах кеша — это просто еще не случившееся попадание.

Когда исходный веб-сервер отвечает, кэширующий прокси-сервер сохраняет ответ в кэше с временем существования, указанным в заголовке Cache-Control или Expires, и передает кэшированный объект запрашивающим его клиентам.

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

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

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

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

На диаграмме ниже показан процесс повторной проверки:

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

Следующий Cache-Control активирует асинхронную повторную проверку благодаря директиве stale-while-revalidate:

Если мы хотим показывать устаревший контент, когда исходный веб-сервер не работает, мы можем использовать следующий заголовок Cache-Control и использовать директиву stale-if-error:

Повторная проверка также может быть выполнена условно. Это означает, что прокси-сервер кэширования будет определять версию объекта с помощью определенных заголовков запроса, таких как If-None-Match или If-Modified-Since .

Значения этих заголовков берутся из заголовков ответов Etag или Last-Modified, которые являются частью кэшированного объекта.

Если последняя версия соответствует версии, объявленной прокси-сервером, источник подтвердит это и не отправит полную полезную нагрузку. Возвращается ответ 304 Not Modified, устаревшее содержимое снова считается свежим, а повторная проверка приостанавливается до тех пор, пока срок действия содержимого снова не истечет.

Версия соответствует, если значения Etag и If-None-Match идентичны или если значения Last-Modified и If-Modified-Since идентичны:

Если версии различаются, источник отправляет полный ответ, и контент снова считается свежим:

Условные запросы также могут быть отправлены клиентом в Varnish. В этом случае Varnish вернет ожидаемый ответ 304 Not Modified без тела вместо того, чтобы возвращать полезную нагрузку кэшированного объекта.

© Copyright Varnish Software AB

® Varnish Software, Vasagatan 7, 111 20 Stockholm, номер организации. 556805-6203

Читайте также: