COEP kullanarak CORP başlıkları olmayan kaynaklar arası kaynakları yükleme: kimlik bilgisi yok

Üçüncü tarafların sunduğu kaynaklar arası kaynaklar genellikle yeterli CORP başlıkları içermez. Kimlik bilgileri olmadan istenebiliyorsa artık bu şekilde işaretleyerek kökler arası izolasyonu etkinleştirebilirsiniz.

Çerezler gibi kimlik bilgileri içermeyen bir istek göndererek tarayıcının, Kaynaklar Arası Kaynak Politikası'nı (CORP) kullanmayan çapraz kaynak kaynaklarını yüklemesini sağlayan yeni Çapraz Kökenli Yerleştirme Politikası (COEP) değerini credentialless kullanıma sunduk. Bu, geliştiricilerin kökler arası izolasyonu daha kolay bir şekilde benimsemesine yardımcı olur.

Kökler arası erişime neden ihtiyacımız var?

Bazı web API'leri, Spectre gibi yan kanal saldırıları riskini artırır. Tarayıcılar bu riski azaltmak için kökler arası izolasyon adı verilen tercihe dayalı yalıtılmış bir ortam sunar. Kaynaklar arası erişime kapalı durumdayken web sayfası, etkinleştirilmediği sürece kaynağı diğerlerinden izole ederken SharedArrayBuffer, performance.measureUserAgentSpecificMemory() ve daha iyi çözünürlüklü yüksek hassasiyetli zamanlayıcılar gibi ayrıcalıklı özellikleri kullanabilir.

Web sayfası, çapraz kaynak izolasyonunu etkinleştirmek için iki HTTP üstbilgisi göndermelidir:

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

Kökler arası erişime kapalı durumda tüm kökler arası kaynaklar CORS ile sunulmalı veya yüklenecek bir Cross-Origin-Resource-Policy üst bilgisi ayarlamalıdır.

Kökler arası erişime izin vermenin zorlukları

Kökler arası erişime kapalı web sayfalarının güvenliği ve güçlü özellikleri etkinleştirme olanağı sağlasa da bu özelliğin dağıtılması zor olabilir. En büyük zorluklardan biri, tüm çapraz kaynak kaynaklar için CORS veya CORP'nin etkinleştirilmesi gerekliliğidir. Bu başlıklara sahip olmayan kaynaklar, kökler arası erişime kapalı bir sayfaya tarayıcı tarafından yüklenmez.

Bu çapraz kaynak kaynaklara genellikle gerekli üst bilgileri eklemek kolay olmayabilecek üçüncü taraflarca sunulur.

Peki kaynağın yüklenmek için yeterince güvenli olduğunu bilirsek ne olur? Aslında risk altında olan tek kaynak, kimlik bilgileriyle istenen kaynaklardır. Bunun nedeni, bu kaynaklarda saldırganın kendi başına yükleyemeyeceği hassas bilgiler bulunması olasıdır. Bu, kimlik bilgileri olmadan istenebilen kaynakların herkesin kullanımına açık olduğu ve yüklenmesinin güvenli olduğu anlamına gelir.

credentialless kurtarır

İşte COEP: credentialless burada devreye giriyor. credentialless, Cross-Origin-Embedder-Policy başlığı için yeni bir değerdir. require-corp ile benzer şekilde, kaynaklar arası yalıtımı etkinleştirebilir ancak kaynaklar arası bağlantı içermeyen istekler için bir CORP:cross-origin üst bilgisi gerektirmek yerine, kimlik bilgileri (ör. çerezler) olmadan gönderilirler.

Alternatif olarak, aşağıdaki iki üst bilgiyi kullanarak kökler arası izolasyonu etkinleştirebilirsiniz:

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

Bu, istenen kaynaklar arası sunucunun hassas bir kaynakla yanıt veremeyeceği ve istekte bulunan kişinin, her zaman yanıtın yalnızca herkese açık bilgiler içerdiğini varsayabileceği anlamına gelir.

Bu, tarayıcıların üçüncü taraf çerezlerini aşamalı olarak kullanımdan kaldırma planıyla da uyumludur.

Demografi

Bu demoda çeşitli başlık seçeneklerini deneyebilirsiniz: https://cross-origin-isolation.glitch.me

SSS

credentialless ortamında kimlik bilgileri içeren bir istek gönderebilir miyim?

Kesinlikle istek modunu, yanıt için CORS kontrolü gerektirecek şekilde değiştirme pahasına. <audio>, <img>, <link>, <script> ve <video> gibi HTML etiketlerinde, tarayıcının kimlik bilgileri içeren istekler göndermesini bildirmek için crossorigin="use-credentials" öğesini açıkça eklemeniz yeterlidir.

Örneğin, https://www.example.com üzerindeki bir dokümanda Cross-Origin-Embedder-Policy: credentialless başlığı olsa bile <img src="https://images.example.com/avatar.png" crossorigin="use-credentials">, kimlik bilgileri içeren bir istek gönderir.

fetch() API için request.mode = 'cors' kullanılabilir.

Sağlanan COEP: credentialless, COEP: require-corp web sitem için hâlâ nasıl yararlı olur?

COEP: require-corp, bazı çapraz kaynak alt kaynakları için çerez gerekirse istek modunu manuel olarak CORS'a geçirmenizi gerektirmez.

Kaynaklar arası iframe'leri, özel üstbilgiler olmadan bir credentialless ortamı altında da yükleyebilir miyim?

Hayır. Bir credentialless ortamı altında kaynaklar arası iframe'ler yüklemek için yine de require-corp ile aynı koşullar gerekir. iframe dokümanları iki başlıkla sunulmalıdır:

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

Neyse ki iframe'ler crossorigin="anonymous" vererek, kaynaklar arası iframe'lerin bu başlıklar olmadan yüklenmesine izin verme konusunda devam eden bir tartışma var. Bu işlem, kaynaklar arası iframe'lerin başlıklar ve kimlik bilgileri olmadan yüklenmesine izin verir.

Bu özellik diğer tarayıcılar tarafından da benimsenecek mi?

Sırada ne var?

Kökler arası erişime kapalı kalmayla ilgili diğer zorlukları azaltmak için iki güncelleme daha yapılacak:

Yukarıdaki engeller nedeniyle SharedArrayBuffer değişikliğini uzatmak için Chrome kaynak denemesine kaydolanlar, değişikliğin ne zaman sonlandırılacağını merak ediyor olabilir. Başta Chrome 96'da sonlandırılacağını duyurmuştuk, ancak bunu Chrome 106'ya ertelemeye karar verdik.

Kaynaklar

Fotoğraf: Martin Adams (Unsplash)