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

Üçüncü taraflarca sunulan kaynakta farklı kaynaklı kaynaklar genellikle yeterli CORP üstbilgileri içermez. Kimlik bilgileri olmadan istenebiliyorlarsa artık bunları işaretleyerek kaynak ayırmayı etkinleştirebilirsiniz.

Tarayıcının, çerezler gibi kimlik bilgileri olmadan istek göndererek Merkezler Arası Kaynak Politikası'nı (CORP) kullanmayan merkezler arası kaynakları yüklemesine olanak tanıyan yeni Merkezler Arası Yerleştiren Politikası (COEP) değerini credentialless kullanıma sunduk. Bu, geliştiricilerin kaynak ayırmayı daha kolay benimsemesine yardımcı olur.

Kökler arası erişime kapalılığa neden ihtiyacımız var?

Bazı web API'leri, Spectre gibi yan kanal saldırılarının riskini artırır. Tarayıcılarda, bu riski azaltmak için kökler arası izolasyon adı verilen etkinleştirmeye dayalı bir izole ortam sunulur. Kaynaklar arası izole durumdayken web sayfası, SharedArrayBuffer, performance.measureUserAgentSpecificMemory() ve daha iyi çözünürlük sağlayan yüksek hassasiyetli zamanlayıcılar gibi ayrıcalıklı özellikleri kullanabilir. Bu durumda, etkinleştirilmediği sürece kaynak diğer kaynaklardan izole edilir.

Kökler arası erişimin kapatılması için web sayfası iki HTTP üst bilgisi göndermelidir:

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

Kökler arası erişime kapalı durumdayken tüm kökler arası kaynaklar CORS ile sunulmalı veya yüklenecek bir Cross-Origin-Resource-Policy başlığı ayarlanmalıdır.

Kökler arası erişime kapalı web sitelerini etkinleştirmeyle ilgili zorluklar

Kökler arası erişime kapalı web siteleri, web sayfalarına daha iyi güvenlik ve güçlü özellikleri etkinleştirme olanağı sunsa da dağıtımı zor olabilir. En büyük zorluklardan biri, tüm kaynak dışı kaynaklar için CORS veya CORP'un etkinleştirilmesi şartıdır. Bu başlıkları içermeyen kaynaklar, tarayıcı tarafından kaynakta izole edilmiş bir sayfada yüklenmez.

Bu kaynakta farklı kaynaklı kaynaklar genellikle gerekli üstbilgileri eklemesi kolay olmayabilecek üçüncü taraflarca yayınlanır.

Peki kaynağın yüklenebilir kadar güvenli olduğunu biliyorsak ne yapmalıyız? Aslında, risk altındaki tek kaynaklar, saldırganın tek başına yükleyemeyeceği hassas bilgiler içerebilecekleri için kimlik bilgileriyle istenen kaynaklardır. Bu, kimlik bilgileri olmadan istenebilecek kaynakların herkese açık olduğu ve yüklenmesinin güvenli olduğu anlamına gelir.

credentialless

İşte bu noktada COEP: credentialless devreye giriyor. credentialless, Cross-Origin-Embedder-Policy başlığı için yeni bir değerdir. require-corp'e benzer şekilde, kökler arası erişimin kapatılmasını sağlayabilir ancak kökler arası erişime kapalı olan isteklerde CORP:cross-origin başlığı yerine kimlik bilgileri (ör. çerezler) olmadan gönderilir.

Kökler arası erişimi kapatma özelliğini aşağıdaki iki üstbilgeyle de etkinleştirebilirsiniz:

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

Bu, istenen kaynakta farklı sunucuların hassas bir kaynakla yanıt veremeyeceği anlamına gelir ve istek sahibi, yanıtın her zaman herkese açık bilgiler içerdiğini varsayabilir.

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

Demo

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

SSS

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

Elbette, isteğin modunu yanıtta CORS kontrolü gerektirecek şekilde değiştirmek pahasına. <audio>, <img>, <link>, <script> ve <video> gibi HTML etiketlerinde, tarayıcıya kimlik bilgisi içeren istekler göndermesini bildirmek için crossorigin="use-credentials" etiketini açıkça eklemeniz yeterlidir.

Örneğin, https://www.example.com'teki bir belgede Cross-Origin-Embedder-Policy: credentialless üstbilgisi olsa bile <img src="https://images.example.com/avatar.png" crossorigin="use-credentials"> kimlik bilgisi içeren bir istek gönderir.

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

COEP: credentialless sağlanmışken COEP: require-corp web sitem için neden hâlâ faydalı?

COEP: require-corp, bazı kaynak dışı alt kaynaklar için çerezlere ihtiyaç duyuluyorsa istek modunu manuel olarak CORS olarak değiştirmenizi gerektirmez.

credentialless ortamında özel başlıklar olmadan çapraz kaynak iframe'leri de yükleyebilir miyim?

Hayır. credentialless ortamında kaynakta çapraz iframe'lerin yüklenmesi için require-corp ile aynı koşullar geçerli olmaya devam eder. iFrame belgelerinin iki üstbilgiyle sunulması gerekir:

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

İyi bir haberimiz var. İframe'lere crossorigin="anonymous" vererek çapraz kaynak iframe'lerin bu üstbilgi olmadan yüklenmesine izin verilmesiyle ilgili devam eden bir tartışma var. Bu sayede, çapraz kaynak iframe'ler üstbilgi olmadan ancak kimlik bilgileri olmadan yüklenebilir.

Bu özellik diğer tarayıcılar tarafından da kullanılacak mı?

Sıradaki gelişmeler

Çapraz kaynak izolasyonuyla ilgili diğer zorlukları azaltmak için iki ek güncelleme daha sunuyoruz:

Yukarıdaki engeller nedeniyle SharedArrayBuffer değişikliğini uzatmak için Chrome kaynak deneme sürümüne kaydolanlar, deneme sürümünün ne zaman sonlandırılacağını merak ediyor olabilir. İlk olarak Chrome 96'da sonlandırılacağını duyurmuştuk ancak bu tarihi Chrome 106'ya ertelemeye karar verdik.

Kaynaklar

Fotoğraf: Martin Adams, Unsplash