HTTP-кэширование — набор заголовков, регулирующих, когда браузер/CDN могут повторно использовать уже полученный ответ вместо нового запроса. Правильная настройка — самая дешёвая и мощная оптимизация web-производительности.
Ключевые заголовки: (1) `Cache-Control: public, max-age=31536000, immutable` — статика (JS/CSS с хешем в имени) — год, никогда не re-validate. (2) `Cache-Control: private, max-age=0, must-revalidate` — HTML пользователя — всегда re-validate. (3) `Cache-Control: s-maxage=60` — CDN держит 60 сек, браузер не кеширует. (4) `ETag: "abc123"` + `If-None-Match` — сервер отвечает 304 Not Modified, если ETag совпал.
Стратегии: (1) Immutable статика с хешем — `app.a3f9b7.js`, `Cache-Control: max-age=31536000, immutable` — браузер вообще не спрашивает. (2) Stale-While-Revalidate — `Cache-Control: max-age=60, stale-while-revalidate=86400` — 60 сек fresh, далее сутки отдаём кэш + фоново обновляем. (3) Vary: Accept-Encoding, Accept-Language — раздельные кеши для разных клиентов.
Проблемы: (1) забыли `no-store` на странице банк-транзакции → секретные данные в кеше. (2) забыли хеш в JS → обновление сайта не доходит до пользователей неделями. (3) неверный `Vary` → CDN отдаёт gzip клиенту без gzip → 500 ошибок.