Timing-Allow-Origin: что аналитика видит в Resource Timing API
Заголовок Timing-Allow-Origin определяет, сколько деталей о времени загрузки cross-origin ресурсов может прочитать страница. Вот что это значит для измерения производительности с приоритетом конфиденциальности.
Заголовок, который никто не задаёт намеренно
Большинство команд сталкиваются с Timing-Allow-Origin (TAO) только тогда, когда график в инструменте мониторинга показывает подозрительные нули. Cross-origin ресурсы — шрифты, изображения из CDN, сторонний скрипт — появляются в Resource Timing API, но их детальные под-тайминги считываются как 0, если только отвечающий сервер явно не даст на это согласие. Этим согласием и является заголовок TAO, и понимание его работы необходимо, если вы хотите получать честные данные о производительности без обращения к инвазивному отслеживанию.
Стандарт Resource Timing предоставляет запись PerformanceResourceTiming для каждого запроса, который делает страница. Для same-origin ресурсов вы получаете полную разбивку: DNS-запрос, TCP-соединение, TLS-согласование, начало запроса и тайминги ответа. Для cross-origin ресурсов спецификация намеренно ограничивает то, что документ может прочитать, потому что эти детальные тайминги могут раскрыть информацию о состоянии сети пользователя, содержимом кэша или внутреннем поведении другого источника.
Что обнуляется
Без соответствующего заголовка TAO следующие атрибуты записи cross-origin PerformanceResourceTiming обнуляются: redirectStart, redirectEnd, domainLookupStart, domainLookupEnd, connectStart, connectEnd, secureConnectionStart, requestStart, responseStart, transferSize, encodedBodySize и decodedBodySize. Вы по-прежнему получаете startTime, duration, responseEnd, а также name и initiatorType ресурса. На практике это означает, что вы можете определить, что ресурс загрузился и сколько времени это заняло в целом, но не то, куда ушло время или сколько байт прошло по сети.
Эта проверка определяется алгоритмом timing allow check в спецификации Resource Timing. Ресурс проходит проверку, если его ответ содержит Timing-Allow-Origin со значением, которое либо совпадает с источником запрашивающего документа, либо является подстановочным знаком *.
Timing-Allow-Origin: https://example.com
# or, to allow any origin
Timing-Allow-Origin: *
Почему это важно для аналитики с приоритетом конфиденциальности
Monoid измеряет производительность в реальных условиях — по реальным переходам реальных посетителей — без cookie, без localStorage и без отпечатков браузера. Resource Timing и Navigation Timing API — это основанный на стандартах способ делать это, а TAO — механизм, который платформа использует, чтобы по умолчанию сохранять конфиденциальность данных о таймингах cross-origin.
Это поведение по умолчанию — функция защиты конфиденциальности, а не препятствие. Обнуление существует именно для того, чтобы страница не могла зондировать сторонние источники в поисках побочных каналов по таймингу. Когда мы рекомендуем задать Timing-Allow-Origin для ваших собственных статических ресурсов и CDN, мы просим вас открыть вашу собственную инфраструктуру для видимости в ваших собственных измерениях — а не ослабить чью-либо защиту.
Core Web Vitals подчёркивают эту мысль. Largest Contentful Paint часто оказывается cross-origin изображением или веб-шрифтом. Если у этих ответов нет заголовка TAO, вы всё равно можете наблюдать элемент LCP через Largest Contentful Paint API, но теряете под-тайминги запроса и ответа, которые сказали бы вам, вызвана ли задержка медленным DNS, холодным TLS-рукопожатием или крупной передачей. Добавление заголовка к источникам ваших ресурсов превращает непрозрачное число в число, с которым можно работать.
Как задать его правильно
Несколько практических замечаний. Во-первых, ненулевое значение transferSize также позволяет отличить попадание в кэш (маленький размер передачи) от сетевого запроса, что бесценно при диагностике производительности повторных просмотров. Во-вторых, если вы отдаёте шрифты cross-origin, CSS-атрибут crossorigin и CORS — это отдельный вопрос от TAO; вам могут понадобиться оба. В-третьих, по возможности предпочитайте указание конкретных источников вместо *, чтобы данные получали только те документы, которым они действительно нужны.
В Cloudflare вы можете добавить заголовок на границе сети с помощью Transform Rule или в ответе Worker, применяя его к путям ваших ресурсов. Поскольку Monoid работает на той же границе, данные о таймингах, которые собирают браузеры ваших посетителей, поступают прямо в агрегированные метрики без идентификаторов — не нужен профиль по каждому пользователю, чтобы узнать, что ваше главное изображение тратит 400 мс на TLS.
Вывод
Timing-Allow-Origin — маленький заголовок с огромным влиянием на то, сколько вы можете узнать из данных о производительности в реальных условиях. Поведение браузера по умолчанию — обнуление cross-origin под-таймингов — это намеренная мера защиты конфиденциальности, и она прекрасно согласуется с тем, как должна работать аналитика с приоритетом конфиденциальности: измерять агрегаты через стандартные API, явно открывать детали только для собственных источников и никогда не рассматривать сетевой отпечаток пользователя как нечто, что нужно собирать. Задайте TAO для ваших ресурсов, и отладка Web Vitals станет точнее без какого-либо отслеживания вообще.
Comments
Loading comments…