Cross-Origin Storage API: Общий кэш для моделей и Wasm между сайтами

Transformers.js позволяет разработчикам использовать трансформеры прямо в браузере. Когда запускаешь pipeline, браузер скачивает веса модели и Wasm-файлы, затем кэширует через Cache API. Но проблема: если один и тот же Wasm-файл ort-wasm-simd-threaded.asyncify.wasm нужен двум разным сайтам, браузер скачивает его дважды и кэширует отдельно для каждого сайта. Популярная модель Xenova/whisper-tiny.en + другие pipeline на другом домене = 177 МБ дублирующейся загрузки и хранения. Причина: браузеры изолируют кэши по source (с Network Isolation Key по top-level site и current-frame site) для защиты от timing attacks. Proposed Cross-Origin Storage (COS) API решает это: вместо кэширования по URL, файлы идентифицируются по SHA-256 хешу. Если тот же Wasm лежит в COS с хешом X, любой сайт может найти его по хешу и переиспользовать, не скачивая заново. Разработчик контролирует видимость: origins: '*' (глобально доступно), origins: ['site1', 'site2'] (только эти), или omit (same-site). Браузер проверяет целостность: если написанный файл не совпадает с объявленным хешом, write fails. Это даёт гарантию, что содержимое именно то, что ожидалось. API ещё ранний (в браузере не реализован), но доступен расширением polyfill для экспериментов.
Ключевые факты
- Кэширование по хешу, а не по URL или источнику: один файл, много сайтов, один раз скачан
- Решает масштабную проблему: AI-модели и Wasm runtime на разных сайтах больше не дублируются
- Контроль доступа: разработчик выбирает, видим ли файл глобально или только определённым сайтам
- Целостность встроена: браузер проверяет, что записанный файл совпадает с объявленным хешом
- Ранний этап: ещё не в браузерах, но можно экспериментировать через расширение polyfill
Почему это важно
На Web каждый сайт скачивает свою копию одних и тех же AI-моделей и runtime. Это растрачивает полосу пропускания пользователей и место на диске. Сейчас каждый сайт экономит на собственном хранилище, но планета в целом теряет. Если COS станет стандартом, Web сможет масштабировать AI-приложения без этого оверхеда.
Кому это важно
Разработчикам Web-приложений, которые используют Transformers.js, ONNX Runtime или другие ML-библиотеки в браузере. Пользователям, которые посещают несколько сайтов с AI-функциями и теперь скачивают одни и те же модели несколько раз. Сервис-провайдерам CDN и хостерам, которые хотят оптимизировать трафик. Браузерным вендорам (Chrome, Firefox, Safari), продумывающим встроенную поддержку.
Как это применить
На практике: когда нужна модель, код пытается получить файл по хешу из COS, если miss, скачивает с сети и пишет в COS с тем же хешом. При следующем посещении другого сайта, использующего ту же модель, браузер берёт из COS. Разработчик указывает origins: '*' для публичных моделей (Whisper, BERT и т.п.) или ограничивает доступ для proprietary моделей.
Можно ли доверять
API всё ещё в ранней стадии, не финализирован, не реализован в браузерах. Работает через polyfill-расширение. Концепция sound: криптографические хеши как идентификаторы файлов хорошо известны. Однако production-поддержка может изменить детали. Стоит экспериментировать, но не полагаться на это для критичной функциональности до стандартизации.
Риски и подводные камни
Безопасность зависит от корректности хешей: если разработчик неправильно вычислил хеш, браузер отклонит файл, но attack может остаться незаметной. Privacy concern: даже если файл не глобально доступен, сайт может зондировать наличие файла по хешу (узнать, посещал ли пользователь другой сайт). API предусматривает availability gating для редких файлов, но полная защита сложна. Необходима тщательная интеграция в браузер, чтобы не открыть брешь в песочнице origin.
«Because COS identifies files by their hash rather than by their URL or origin, the same ort-wasm-simd-threaded.asyncify.wasm Wasm runtime you downloaded while visiting one origin is recognized as identical to the one another origin is about to request»
— Hugging Face blog on Cross-Origin Storage