Кеширование
Cache-Control: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый отражает заголовок, который ты реально отправишь — и тихий инцидент, который следует, когда директива делает не то, что подсказывает её имя.
Убедись, что выбираешь верную директиву для хранения против ревалидации, разделяешь TTL браузера и TTL CDN и рассуждаешь об утечках и ловушках, которые подставляют дефолты.
Команда отправляет Cache-Control: no-cache на эндпоинт баланса банка, рассчитывая, что ничего не сохранится. Позже на киоске один клиент видит баланс предыдущего по нажатию «назад». Что пошло не так?
Ты ставишь Cache-Control: max-age=0 на HTML, чтобы браузер всегда был свежим. Впереди стоит CDN. Без s-maxage что происходит на CDN?
Аутентифицированный маршрут /account отдаётся с Cache-Control: public, max-age=300 за CDN. Каждый посетитель в следующие пять минут видит страницу аккаунта первого пользователя. Корневая причина?
Статические бандлы отдаются с Cache-Control: public, max-age=31536000, immutable. Какая единственная практика делает кэш на год безопасным, а не багом на год?
JSON-API за CDN отправляет Cache-Control: max-age=60, s-maxage=300, stale-while-revalidate=3600. Какое получится поведение?
Ответ ставит Vary: Cookie, чтобы держать страницу залогиненного пользователя вне общих кэшей. Почему это ненадёжный механизм безопасности для персонального контента?
Сквозная линия юнита — одно дерево решений. Сначала спроси, может ли кэш вообще хранить ответ: no-store — единственная директива, запрещающая хранение, а no-cache лишь форсирует ревалидацию, поэтому no-cache утекает чувствительные данные в браузер и bfcache. Затем раздели уровни: max-age управляет всеми кэшами, s-maxage переопределяет его только для общих кэшей, а private держит ответы на пользователя вне CDN — его отсутствие на аутентифицированном маршруте и есть классическая утечка данных. Для статики public, max-age=31536000, immutable верен только с именами по хешу содержимого, потому что изменённый файл тогда меняет URL. stale-while-revalidate и stale-if-error меняют устарелость на задержку и устойчивость, а Vary ключует варианты, а не исключает разделение — поэтому реальная безопасность всегда живёт в private/no-store.