Что такое Cache-Control и для чего он используется
Что проверяют
Знаете ли вы, кто именно кэширует ответ (браузер, прокси, CDN) и умеете ли проверить, что настройка совпадает с задумкой. Для тестировщика это источник двух типов дефектов сразу: личные данные оседают в общем кэше, а новый фронтенд не доезжает до пользователя.
Как отвечать
Cache-Control это заголовок, управляющий хранением и свежестью ответа. Основные директивы:
no-store: не сохранять ответ нигде, режим для страниц с личными данными;no-cache: сохранять можно, но перед выдачей обязательна сверка с сервером условным запросом (ETag и If-None-Match, Last-Modified и If-Modified-Since, в ответ 304);max-age: сколько секунд ответ считается свежим,s-maxageто же самое для общих кэшей;privateиpublic: можно ли хранить ответ в общем кэше или только в браузере конкретного пользователя;must-revalidate,immutable,stale-while-revalidateдля тонкой настройки.
Типовая раскладка: статика с хэшем в имени файла получает длинный max-age и immutable, HTML отдаётся с no-cache и валидатором, персональные ответы API с no-store и private.
Проверка со стороны тестировщика: сверить заголовки с ожиданием, повторить запрос и увидеть, что пришло (ответ из кэша, 304 или полный ответ), проверить Vary там, где ответ зависит от заголовка, убедиться, что после выхода из аккаунта страница не достаётся кнопкой «назад», и что общий кэш не отдаёт чужой персональный ответ.
Где спотыкаются
Читают no-cache как запрет кэширования. На деле это «храни, но каждый раз переспрашивай», а запрет хранения называется no-store. Из-за путаницы личные страницы оседают в промежуточных кэшах.
Ставят public с долгим сроком на ответ, который зависит от пользователя, языка или сжатия, и не указывают Vary. Общий кэш честно отдаёт один и тот же ответ всем, а воспроизводится дефект только за CDN, то есть на проде.
Проверяют только первый запрос. Проблемы начинаются со второго: браузер продолжает отдавать старый файл, и релиз до пользователя не доезжает. Лечится это версией в имени файла, а не просьбой обновить страницу со сбросом кэша.