Открыть сервисСервис

Браузерное кэширование

Браузерное кэширование — это механизм временного хранения веб-ресурсов (HTML-страниц, изображений, CSS-файлов, JavaScript-скриптов, шрифтов и других данных) на стороне клиента (в браузере пользователя) с целью ускорения загрузки веб-страниц при повторных посещениях и снижения нагрузки на сервер и сеть. Кэш браузера представляет собой локальное хранилище, в котором сохраняются копии ответов сервера, полученных при первом запросе.

Принцип работы

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

При последующем запросе той же страницы браузер проверяет, имеется ли в кэше актуальная копия запрошенного ресурса. Если ресурс признаётся «свежим» (fresh), браузер использует локальную копию, не отправляя запрос на сервер. Если же ресурс устарел (stale), браузер может выполнить условный запрос (conditional request) к серверу, чтобы проверить, не изменился ли ресурс с момента последнего кэширования. Если ресурс не изменился, сервер возвращает статус 304 Not Modified, и браузер продолжает использовать кэшированную копию. Если ресурс изменился, сервер возвращает новый ответ с кодом 200 OK.

HTTP-заголовки, управляющие кэшированием

Управление браузерным кэшированием осуществляется через HTTP-заголовки ответа сервера. Основные из них:

Cache-Control

Этот заголовок является основным современным механизмом управления кэшированием. Он может содержать несколько директив, разделённых запятыми:

  • public — ресурс может кэшироваться любым кэшем, включая прокси-серверы.
  • private — ресурс может кэшироваться только браузером конечного пользователя, но не промежуточными кэшами.
  • no-cache — ресурс не может быть использован из кэша без предварительной проверки на сервере (условный запрос).
  • no-store — ресурс не должен кэшироваться вообще ни в каком кэше.
  • max-age=<секунды> — указывает максимальное время в секундах, в течение которого ресурс считается свежим с момента его получения браузером.
  • s-maxage=<секунды> — аналогично max-age, но действует только для общих (shared) кэшей, например, прокси-серверов.
  • must-revalidate — браузер обязан проверять актуальность ресурса после истечения срока его свежести.
  • immutable — указывает, что ресурс никогда не изменится в течение своего времени жизни (полезно для статических ресурсов с версионированием в URL).

Expires

Устаревший заголовок, содержащий абсолютную дату и время, после которого ресурс считается устаревшим. Например: Expires: Wed, 21 Oct 2024 07:28:00 GMT. В современных проектах рекомендуется использовать Cache-Control: max-age вместо Expires, так как он точнее и не зависит от часовых поясов.

Last-Modified

Заголовок, указывающий дату и время последнего изменения ресурса на сервере. Используется для условных запросов: браузер отправляет значение этого заголовка в запросе If-Modified-Since. Если ресурс не изменился, сервер возвращает 304 Not Modified.

ETag

Заголовок, содержащий уникальный идентификатор версии ресурса (например, хеш содержимого). Используется для условных запросов: браузер отправляет значение ETag в запросе If-None-Match. Если ресурс не изменился, сервер возвращает 304 Not Modified. ETag считается более точным механизмом, чем Last-Modified, так как способен обнаруживать изменения, произошедшие в течение одной секунды.

Vary

Заголовок, указывающий, что кэшированная версия ресурса может различаться в зависимости от определённых заголовков запроса (например, Accept-Encoding, User-Agent).

Виды кэширования

Полное кэширование (Cache-First)

Браузер сначала проверяет кэш. Если ресурс найден и свеж, он используется без обращения к серверу. Если ресурса в кэше нет или он устарел, выполняется запрос к серверу. Этот режим характерен для статических ресурсов (изображения, CSS, JS).

Кэширование с проверкой (Network-First)

Браузер сначала обращается к серверу. Если сервер недоступен или возвращает ошибку, используется кэшированная копия. Этот режим часто применяется для HTML-страниц и API-запросов.

Кэширование только при ошибке (Stale-While-Revalidate)

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

Стратегии кэширования для веб-разработчиков

Версионирование ресурсов

Один из наиболее эффективных методов — включение хеша содержимого или номера версии в имя файла (например, style.a1b2c3d4.css). При изменении содержимого файла меняется и его имя, что делает старую версию в кэше недействительной. Для таких ресурсов можно устанавливать Cache-Control: max-age=31536000, immutable (год).

Кэширование HTML

HTML-страницы, как правило, кэшируются с коротким сроком жизни или с проверкой (no-cache), чтобы пользователи видели актуальный контент. Для динамических страниц часто используется Cache-Control: no-cache, no-store, must-revalidate.

Кэширование API-ответов

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

Проблемы и ограничения

Устаревший контент

Неправильная настройка заголовков кэширования может привести к тому, что пользователи долгое время видят устаревшие версии страниц или ресурсов. Особенно остро эта проблема стоит при обновлении CSS-файлов или JavaScript-скриптов без изменения их имён.

Проблемы с приватностью

Кэширование приватных данных (например, содержимого личного кабинета) может привести к тому, что один пользователь увидит данные другого, если они используют общий компьютер. Для таких данных необходимо использовать Cache-Control: private или no-store.

Ограничение объёма кэша

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

Кэширование и Service Workers

Технология Service Workers (часть Progressive Web Apps) позволяет разработчикам программно управлять кэшированием, перехватывая сетевые запросы и реализуя собственные стратегии кэширования, независимые от HTTP-заголовков. Это даёт больше гибкости, но требует более сложной реализации.

Кэширование в разных браузерах

Хотя базовые принципы кэширования универсальны, реализации в разных браузерах могут незначительно отличаться. Например, браузеры могут по-разному интерпретировать заголовок Cache-Control при его отсутствии или при наличии конфликтующих директив. Также существуют различия в объёме кэша и алгоритмах его очистки. В целом, все современные браузеры (Google Chrome, Mozilla Firefox, Apple Safari, Microsoft Edge) следуют спецификациям HTTP-кэширования.

Инструменты для отладки кэширования

Для анализа и отладки браузерного кэширования разработчики используют встроенные инструменты разработчика (DevTools) в браузерах. Вкладка «Network» (Сеть) позволяет просматривать HTTP-заголовки запросов и ответов, а также информацию о том, был ли ресурс загружен из кэша (статус 200 (from disk cache) или 200 (from memory cache)). Вкладка «Application» (Приложение) предоставляет интерфейс для просмотра и очистки кэша браузера.

Источники

  • RFC 7234 — Hypertext Transfer Protocol (HTTP/1.1): Caching
  • Документация MDN Web Docs: HTTP caching
  • Документация Google Developers: Web Fundamentals — HTTP caching
  • Спецификация Service Workers (W3C)
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru