Почему Тестирование Кэширования Важно

Кэширование значительно улучшает производительность, сохраняя копии ресурсов. Однако некорректное кэширование приводит к тому, что пользователи видят устаревший контент или сталкиваются со сломанными страницами после деплоя.

Уровни Кэша

Каждый уровень может независимо кэшировать и отдавать устаревший контент: Кэш Браузера → CDN Edge → Реверс-Прокси → Кэш Приложения → База Данных.

Ключевые Заголовки Кэша

ЗаголовокНазначениеПример
Cache-ControlОсновная директиваmax-age=3600, public
ETagОтпечаток содержимого"abc123def456"
Last-ModifiedДата последнего измененияДата
VaryКэш различается по заголовкуVary: Accept-Language

Директивы Cache-Control

ДирективаЗначение
publicМожет кэшироваться любым кэшем
privateТолько браузер пользователя
no-cacheОбязательна ревалидация с сервером
no-storeНе кэшировать вообще
max-age=NВалиден N секунд
immutableКонтент никогда не изменится

Что Тестировать

Корректное Поведение Кэша

Тип ресурсаОжидаемое кэшированиеПричина
Статические ресурсы (JS, CSS)Длинный кэш (1 год) с хэшемCache busting обрабатывает обновления
HTML-страницыno-cache или короткийКонтент часто меняется
API (публичные)Короткий кэш (минуты)Баланс свежести и производительности
API (авторизованные)private, no-storeПредотвращение утечки между пользователями
Эндпоинты аутентификацииno-storeЧувствительные данные

Инвалидация После Деплоя

  1. Задеплойте изменения CSS/JS
  2. Проверьте, что пользователи получают новую версию
  3. Проверьте, что старая кэшированная версия не ломает новый HTML

Кэш и Аутентификация

  • Данные Пользователя A никогда не должны отдаваться из кэша Пользователю B
  • Выход из системы должен инвалидировать кэш специфичного контента
  • Vary: Cookie или private для авторизованных ответов

Упражнение: Аудит Кэширования

Шаг 1: Инспекция Заголовков

DevTools > Network. Загрузите страницу и проверьте заголовки:

РесурсCache-ControlETagMax-AgeКорректно?
HTML-страница
CSS-файл
JS-бандл
Изображение
API публичная
API авторизованная

Шаг 2: Тестирование Cache Busting

  1. Зафиксируйте текущие URL JS/CSS (с хэшами)
  2. Внесите изменение и задеплойте
  3. Проверьте, что URL изменились
  4. Hard refresh (Ctrl+Shift+R) загружает новые файлы

Шаг 3: Тестирование Устаревшего Контента

  1. Загрузите страницу с динамическим контентом
  2. Обновите контент из другого браузера/API
  3. Обновите в исходном браузере
  4. Проверьте отображение обновлённого контента

Шаг 4: Cross-User Тестирование Кэша

  1. Войдите как Пользователь A, посетите профиль
  2. Выйдите, войдите как Пользователь B
  3. Посетите тот же эндпоинт профиля
  4. Проверьте данные Пользователя B (не кэшированные данные A)
Решение: Типичные Баги Кэширования

Баг 1: CSS закэширован без хэша в URL. После деплоя пользователи видели старый CSS.

Баг 2: Авторизованный API-ответ закэширован CDN. CDN закэшировал профиль и отдавал другим пользователям.

Баг 3: Цена товара закэширована на 1 час. Клиенты видели старую цену после обновления.

Баг 4: Устаревший HTML после деплоя. HTML ссылался на старые JS-файлы, которых больше не существовало.

Баг 5: Кнопка «Назад» показывает чувствительные данные. После выхода кнопка «Назад» показывала дашборд предыдущего пользователя.

Отладка Проблем Кэша

# Проверка заголовков кэша
curl -I https://example.com/page

# Проверка CDN-кэша (ищите заголовок Age)
curl -I https://example.com/style.css | grep -i "age\|cache-control\|etag"

Ключевые Выводы

  • Тестирование кэша должно охватывать все уровни: браузер, CDN и сервер
  • Статические ресурсы должны использовать длинный кэш с хэшами для cache busting
  • HTML должен использовать no-cache, чтобы пользователи всегда получали актуальную версию
  • Авторизованные ответы должны использовать private или no-store
  • Всегда тестируйте кэш после деплоев
  • Кнопка «Назад» браузера может отдавать устаревший кэшированный контент