Загрузка ресурсов из разных источников без заголовков CORP с помощью COEP: без учетных данных

Ресурсы с перекрестным происхождением, обслуживаемые третьими сторонами, часто не содержат адекватных заголовков CORP. Если их можно запросить без учетных данных, теперь вы можете включить изоляцию между источниками, пометив их как таковые.

Мы добавили новое значение политики внедрения перекрестного происхождения (COEP) credentialless , которое позволяет браузеру загружать ресурсы перекрестного происхождения, которые не используют политику ресурсов перекрестного происхождения (CORP), путем отправки запроса без учетных данных, например файлов cookie. . Это помогает разработчикам легче применять изоляцию между источниками.

Зачем нам нужна изоляция между источниками

Некоторые веб-API повышают риск атак по побочным каналам, например Spectre . Чтобы снизить этот риск, браузеры предлагают изолированную среду на основе согласия, называемую изоляцией между источниками . В изолированном состоянии между источниками веб-страница может использовать привилегированные функции, включая SharedArrayBuffer , performance.measureUserAgentSpecificMemory() и высокоточные таймеры с лучшим разрешением , изолируя источник от других, если они не включены.

Веб-страница должна отправить два HTTP-заголовка, чтобы включить изоляцию между источниками:

Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin

В изолированном состоянии между источниками все ресурсы между источниками должны обслуживаться с помощью CORS или устанавливать заголовок Cross-Origin-Resource-Policy для загрузки.

Проблемы с включением изоляции между источниками

Хотя изоляция между источниками повышает безопасность веб-страниц и дает возможность использовать мощные функции, ее развертывание может быть затруднено . Одной из самых больших проблем является требование включить CORS или CORP для всех ресурсов с перекрестным происхождением. Ресурсы без этих заголовков не будут загружаться браузером на изолированной странице с перекрестным происхождением.

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

Но что, если мы знаем, что ресурс достаточно безопасен для загрузки? Фактически, единственные ресурсы, которые подвергаются риску, — это те, которые запрашиваются с учетными данными, поскольку они потенциально содержат конфиденциальную информацию, которую злоумышленник не может загрузить самостоятельно. Это означает, что ресурсы, которые можно запросить без учетных данных, общедоступны и их можно безопасно загружать.

credentialless спешит на помощь

Вот тут-то и появляется COEP: credentialless . credentialless — это новое значение для заголовка Cross-Origin-Embedder-Policy . Подобно require-corp , он может включать изоляцию между источниками, но вместо требования заголовка CORP:cross-origin для запросов no-cors между источниками они отправляются без учетных данных (например, файлов cookie).

Альтернативно вы сможете включить изоляцию между источниками с помощью следующих двух заголовков:

Cross-Origin-Embedder-Policy: credentialless
Cross-Origin-Opener-Policy: same-origin

Это означает, что запрошенный междоменный сервер не сможет ответить конфиденциальным ресурсом, и запрашивающая сторона всегда может предположить, что ответ содержит только общедоступную информацию.

Это также соответствует плану браузеров по поэтапному отказу от сторонних файлов cookie .

Демо

Вы можете попробовать различные варианты заголовка в этой демонстрации: https://cross-origin-isolation.glitch.me

Часто задаваемые вопросы

Могу ли я отправить запрос с учетными данными в среде credentialless ?

Конечно, за счет изменения режима запроса, требующего проверки CORS для ответа. Для тегов HTML, таких как <audio> , <img> , <link> , <script> и <video> , просто добавьте crossorigin="use-credentials" явно, чтобы сообщить браузеру о необходимости отправки запросов с учетными данными.

Например, даже если документ на https://www.example.com имеет заголовок Cross-Origin-Embedder-Policy: credentialless , <img src="https://images.example.com/avatar.png" crossorigin="use-credentials"> отправит запрос с учетными данными.

Для API fetch() можно использовать request.mode = 'cors' .

Если COEP: credentialless , каким образом COEP: require-corp все еще полезен для моего веб-сайта?

COEP: require-corp не требует, чтобы вы вручную переключали режим запроса на CORS, если файлы cookie необходимы для некоторых подресурсов с перекрестным происхождением.

Могу ли я также загружать iframe из разных источников без специальных заголовков в среде credentialless ?

Нет. Загрузка iframe из разных источников в среде credentialless по-прежнему требует тех же условий, что и require-corp . Документы iframe должны обслуживаться с двумя заголовками:

  • Cross-Origin-Embedder-Policy: credentialless (или require-corp )
  • Cross-Origin-Resource-Policy: cross-origin

Хорошей новостью является то, что продолжается дискуссия о том, чтобы разрешить загрузку iframe с перекрестным происхождением без этих заголовков, указав iframes crossorigin="anonymous" . Это позволит загружать iframe из разных источников без заголовков, но без учетных данных.

Будет ли эта функция принята другими браузерами?

Что будет дальше

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

Те, кто зарегистрировался для участия в пробной версии Chrome Origin, чтобы продлить изменение SharedArrayBuffer из-за вышеупомянутых препятствий, могут задаться вопросом, когда оно будет прекращено. Первоначально мы объявили, что поддержка этой функции будет прекращена в Chrome 96, но мы решили перенести это на Chrome 106.

Ресурсы

Фото Мартина Адамса на Unsplash