архитектурное решениеобновлено 2026-08-20

Сессия пользователя и публичный кэш: где проходит граница

Публичная страница события хорошо кэшируется на edge, а персональные данные — нет. Показываем, как развести эти два класса ответов, настроить cookie scope, BFF и Cache-Control без риска смешать пользовательские данные.

Иллюстрация к материалу: Сессия пользователя на CDN и API: где заканчивается публичный кэш
Max Braun / Wikimedia CommonsCC BY-SA 2.0

Публичное и персональное надо развести до реализации

Основная ошибка edge-архитектуры не в технологии CDN, а в неявной классификации данных. Страница соревнования может быть публичной, баланс и история ставок — нет. Путь запроса должен заранее знать класс ответа и допустимую политику кеша.

серверный слой интерфейса как граница, а не прокси ради прокси

Browser-facing слой принимает session cookie, но не пропускает её в ключ публичного кеша. Персональные маршруты помечаются private, no-store либо используют строго приватный кеш. Публичные справочники и контент получают отдельные URL/контракты без зависимости от пользовательской сессии.

Разделение кэша по пользовательскому сеансу почти всегда слишком широкое

Технически можно разделить кеш по cookie, но это быстро превращает общий кеш в миллионы почти одноразовых вариантов. Лучше разделять маршруты и данные архитектурно. Персонализация добавляется на клиенте или BFF поверх публичного каркаса.

Набор инвариантов

Ответ с account identifier никогда не имеет public cache directive. Публичный endpoint не меняет payload от наличия session cookie. BFF отбрасывает лишние заголовки при обращении к внутренним сервисам. CSRF-защита применяется к изменяющим состояние browser-командам.

Самый опасный отказ — не 500

Случайно публично закешированный персональный ответ может выглядеть как «успешный» запрос. Поэтому security test должен проверять cache headers и отсутствие пользовательских данных на public routes. Это не задача одного pentest: инвариант полезно держать в автоматических контрактных тестах.

Проверка границы персонализации

Самый надёжный способ защитить edge-кэш — физически разделить публичный и персональный ответ. Страница события, расписание или публичная статистика могут иметь общий cache policy; баланс, настройки пользователя и персональные действия должны идти через отдельный endpoint или BFF с явным private/no-store.

Попытка решить всё через широкий Vary: Cookie часто убивает эффективность кэша и всё равно оставляет риск ошибочной конфигурации. Чем проще правило — «этот URL никогда не содержит персональных данных» — тем легче проверить CDN, тестами и логами.

  • Проверить ответы с разными cookies на CDN и origin.
  • Не включать персональные поля в HTML, который планируется кэшировать публично.
  • Логировать cache class и hit/miss без пользовательских секретов.

Самый важный тест — попытаться получить чужой персональный фрагмент

Проверка cache граница ответственности должна быть агрессивной: два аккаунта, одинаковый публичный URL, разные selections и permissions. Ответ для публичного shell обязан совпадать, а персональные части — приходить только из приватного пути. Любой HTML-фрагмент, где account state попал под общий CDN key, считается критической ошибкой даже без явного security incident.

EventPage удобно собирать из двух классов данных: кэшируемый контент события и персональный слой через BFF/API. Это сохраняет быстрый first render и не заставляет ставить Vary: Cookie на всю страницу.

Наблюдаемость должна показывать cache class и причины bypass. Если после релиза публичный hit rate резко упал, возможно, новый код случайно протащил персональный признак в общий ответ.

Наблюдаем класс кэша

В логах edge/BFF полезно писать не cookie, а рассчитанный cache_class: public, private, no-store. Тогда можно увидеть аномалию — например, персональный маршрут внезапно начал отдавать HIT — без раскрытия содержимого сессии.

Схема решения: Сессия пользователя на CDN и API: где заканчивается публичный кэш
Диаграмма к разбору: Сессия пользователя на периферийном узле и сервере: где заканчивается публичный кэш.
Следующий слой

Связанные разборы по той же архитектурной цепочке

Надёжность

Спортивная платформа под высокой нагрузкой: как проектировать запас прочности

Как меняются очереди, разделение потоков и стратегия деградации, когда число событий и потребителей растёт одновременно.

Перейти к разбору →
Эксплуатация

Контракт телеметрии: события, версии и граница приватности

Как версионировать события телеметрии между клиентом и сервером, сохранять смысл после редизайна и отсекать чувствительные поля до отправки.

Перейти к разбору →
Интерфейсы

Центр событий: точечные обновления без лишних перерисовок

Как обновлять центр спортивных событий точечно: нормализованное хранилище, подписки по сущностям и контроль частоты перерисовки интерфейса.

Перейти к разбору →
Букмекерская логика

Кнопка коэффициента: доступность, изменение цены и приостановка

Как проектировать кнопку коэффициента: изменение цены, приостановка, фокус, клавиатурное управление и понятные состояния после выбора пользователя.

Перейти к разбору →