Скачать CV
Назад к бизнес-кейсам

Авторизация

Microcache, который выучил каждую cookie

nginx кэшировал HTML по auth_token. Hit rate умер. Публичным страницам этот ключ в cookie не нужен.

Анонимные страницы каталога всё равно промахивались мимо microcache nginx. В ключе кэша был заголовок Cookie. Sanctum кладёт auth_token в сессию после логина, а cookie аналитики приходят раньше. У каждого посетителя получался свой ключ. Двухсекундный кэш не видел второго попадания.

Опасная версия той же ошибки наоборот: закэшировать публичный HTML по ответу для вошедшего. Так утекает приватный фрагмент. Правило должно назвать обе стороны.

Проблема была в Cookie как измерении кэша. Hit rate для анонимных покупателей умер. HTML вошедшего в публичном слоте был бы хуже. auth_token нужен как бит обхода, не как часть ключа.

Нет auth_token: кэш по host, uri, locale. Есть auth_token: bypass, не писать.
Нет auth_token: кэш по host, uri, locale. Есть auth_token: bypass, не писать.

Разделение

nginx смотрит только на cookie auth_token. Если её нет, ключ это scheme, host, uri, locale. Query, которые не меняют страницу, в ключ не входят. Если cookie есть, включены proxy_cache_bypass и proxy_no_cache. PHP по-прежнему ходит в Memcached за фрагментами. nginx персональный документ не сохраняет.

Logout чистит cookie на хосте API. Следующий анонимный запрос может взять публичный слот. Логин его не портит, потому что этот ответ туда не писали.

  • SameSite и httpOnly остаются на auth_token. JavaScript её не читает.
  • Админ-маршруты в карте microcache не живут вовсе.
  • Vary это locale, не Cookie.

Hit rate на листинге вернулся. HTML вошедшего не попадал в анонимный слот. Cookie осталась credentials, а не измерением кэша.

Какой опыт из этого

Ключ кэша с Cookie это уникальный ключ на посетителя. Cookie аналитики делают это правдой до логина.

Обход по имени credentials безопаснее Vary: Cookie. Vary по Cookie всё равно хранит N копий и всё равно рискует записью вошедшего в публичный слот, если правило кривое.

auth_token остаётся httpOnly. Край и nginx могут смотреть на наличие. JavaScript её по-прежнему не читает.

Назад к бизнес-кейсам