Как работает кэширование в HTTP?

«Как работает кэширование в HTTP?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные компоненты и заголовки:

  • Cache-Control — главный заголовок для управления кэшем. Указывает директивы:

    • max-age=<seconds> — максимальное время хранения ресурса в кэше.
    • public / privatepublic разрешает кэширование на прокси, private — только в браузере пользователя.
    • no-cache — перед использованием кэшированную версию необходимо проверить на актуальность у сервера.
    • no-store — полностью запрещает кэширование.
  • Валидаторы (для проверки свежести):

    • ETag (Entity Tag): Уникальный хэш-идентификатор версии ресурса. Клиент отправляет его в заголовке If-None-Match.
    • Last-Modified: Дата последнего изменения. Клиент отправляет её в заголовке If-Modified-Since.

Типичный жизненный цикл запроса с кэшем:

  1. Первый запрос: Браузер загружает ресурс. Сервер отвечает с заголовками, например:

    HTTP/1.1 200 OK
    Cache-Control: public, max-age=3600
    ETag: "abc123"
    Last-Modified: Mon, 01 Jan 2024 12:00:00 GMT

    Браузер сохраняет ресурс и эти заголовки в своём кэше.

  2. Повторный запрос (через 30 минут): Браузер видит, что max-age=3600 (1 час) не истёк, и загружает ресурс напрямую из кэша, без сетевого запроса.

  3. Повторный запрос (через 2 часа): max-age истёк. Браузер отправляет условный запрос с валидаторами:

    GET /style.css HTTP/1.1
    Host: example.com
    If-None-Match: "abc123"
    If-Modified-Since: Mon, 01 Jan 2024 12:00:00 GMT
    • Если ресурс не изменился, сервер отвечает статусом 304 Not Modified (без тела ответа). Браузер использует кэшированную версию.
    • Если ресурс изменился, сервер отвечает 200 OK с новым содержимым и обновлёнными заголовками кэша.

Практическая польза: Правильная настройка кэширования статических ресурсов (CSS, JS, изображения) — один из ключевых факторов высокой производительности веб-сайта.