COOP ve COEP kullanarak web sitenizi "kökenler arası erişime kapalı" hale getirme

Kökler arası erişime kapalı bir ortam oluşturmak ve SharedArrayBuffer, performance.measureUserAgentSpecificMemory() ve yüksek çözünürlüklü zamanlayıcı gibi güçlü özellikleri daha hassas bir şekilde etkinleştirmek için COOP ve COEP'yi kullanın.

Güncellemeler

  • 21 Haziran 2022: Kökler arası erişime kapalı web siteleri etkinleştirildiğinde çalışan komut dosyalarının da dikkat etmesi gerekir. Birkaç açıklama eklendi.
  • 5 Ağustos 2021: JS Self-Profiling API'nin kökler arası erişime kapalı olması zorunlu kılınan ancak yönde yakın zamanda yapılan değişikliği yansıtan API'lerden biri olduğu belirtildi. Bu API kaldırıldı.
  • 6 Mayıs 2021: Aldığımız geri bildirimler ve bildirilen sorunlar doğrultusunda, Chrome M92'de çapraz kaynak izolasyonu uygulanmayan sitelerde SharedArrayBuffer kullanımının kısıtlanacağı zaman çizelgesini düzenlemeye karar verdik.
  • 16 Nisan 2021: Kaynaklar arası yalıtım için yeni bir COEP kimlik bilgisi gerektirmeyen mod ve COOP aynı kaynakta pop-up'lara izin verilecek şekilde gevşek bir koşul hakkında notlar eklendi.
  • 5 Mart 2021: SharedArrayBuffer, performance.measureUserAgentSpecificMemory() ve hata ayıklama işlevleriyle ilgili sınırlamalar kaldırıldı. Bu işlevler artık Chrome 89'da tam olarak etkinleştirildi. Daha yüksek hassasiyete sahip olacak şekilde yakında kullanıma sunulacak performance.now() ve performance.timeOrigin özellikleri eklendi.
  • 19 Şubat 2021: Geliştirici Araçları'na allow="cross-origin-isolated" özellik politikası ve hata ayıklama işlevi hakkında bir not eklendi.
  • 15 Ekim 2020: self.crossOriginIsolated, Chrome 87'den itibaren kullanılabilir. Aynı şekilde, self.crossOriginIsolated, true değerini döndürdüğünde document.domain değiştirilemez. performance.measureUserAgentSpecificMemory(), kaynak deneme sürümünü sonlandırıyor ve Chrome 89'da varsayılan olarak etkinleştiriliyor. Android Chrome'daki Paylaşılan Dizi Arabelleği, Chrome 88 ve sonraki sürümlerde kullanıma sunulacaktır.

Bazı web API'leri, Spectre gibi yan kanal saldırısı riskini artırır. Tarayıcılarda, bu riski azaltmak için kökler arası erişime kapalı olarak adlandırılan, etkinleştirmeye dayalı bir izole ortam sunulur. Kaynaklar arası yalıtılmış durumdayken web sayfası aşağıdakiler gibi ayrıcalıklı özellikleri kullanabilir:

API Açıklama
SharedArrayBuffer WebAssembly iş parçacıkları için gereklidir. Bu özellik, Android Chrome 88 sürümünden itibaren kullanılabilir. Masaüstü sürümü şu anda Site İzolasyonu aracılığıyla varsayılan olarak etkindir ancak kökler arası erişime kapalı durumunu gerektirir ve Chrome 92'de varsayılan olarak devre dışı bırakılır.
performance.measureUserAgentSpecificMemory() Chrome 89 ve sonraki sürümlerde kullanılabilir.
performance.now() performance.timeOrigin Şu anda 100 mikrosaniye veya daha yüksek çözünürlüğe sahip birçok tarayıcıda kullanılabilir. Kaynaklar arası yalıtımla çözünürlük 5 mikrosaniye veya daha yüksek olabilir.
Kökler arası erişime kapalı durumda kullanılabilecek özellikler.

Kökler arası erişime kapalı durum, document.domain öğesinin değiştirilmesini de engeller. (document.domain değerini değiştirmek, aynı sitedeki dokümanlar arasında iletişime izin verir ve aynı kaynak politikasında bir boşluk olarak kabul edilir.)

Kökler arası izole durumu etkinleştirmek için ana dokümanda aşağıdaki HTTP üst bilgilerini göndermeniz gerekir:

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

Bu üstbilgiler, tarayıcıya kaynak veya kaynak dışı dokümanlar tarafından yüklenmesi etkinleştirilmemiş iframe'lerin yüklenmesini engellemesini ve kaynak dışı pencerelerin dokümanınızla doğrudan etkileşim kurmasını önlemesini söyler. Bu, kökler arası yüklenen kaynakların etkinleştirilmesini gerektirdiği anlamına da gelir.

Bir web sayfasının kökler arası erişime kapalı durumda olup olmadığını self.crossOriginIsolated değerini inceleyerek belirleyebilirsiniz.

Bu makalede, bu yeni üstbilgilerin nasıl kullanılacağı açıklanmaktadır. Bir sonraki makalede daha fazla arka plan ve bağlam bilgisi paylaşacağım.

Web sitenizi kaynakta izole hale getirmek için COOP ve COEP'yi dağıtma

COOP ve COEP'yi entegre etme

1. Üst düzey belgede Cross-Origin-Opener-Policy: same-origin başlığını ayarlama

Üst düzey bir dokümanda COOP: same-origin etkinleştirildiğinde, aynı COOP ayarıyla aynı kaynakta olmadıkları sürece aynı kaynağa sahip pencereler ve dokümandan açılan pencereler ayrı bir tarama bağlamı grubuna sahip olur. Böylece, açık pencereler için yalıtım uygulanır ve her iki pencere arasındaki karşılıklı iletişim devre dışı bırakılır.

Göz atma bağlam grubu, birbirine referans verebilen bir pencere kümesidir. Örneğin, <iframe> aracılığıyla yerleştirilmiş bir üst düzey doküman ve alt dokümanları. Bir web sitesi (https://a.example) pop-up pencere (https://b.example) açarsa açan pencere ile pop-up pencere aynı tarama bağlamını paylaşır. Bu nedenle, window.opener gibi DOM API'leri aracılığıyla birbirlerine erişebilirler.

Tarama Bağlam Grubu

Pencereyi açan kullanıcının ve pencereyi açan kullanıcının ayrı tarama bağlamı gruplarında olup olmadığını Geliştirici Araçları'ndan kontrol edebilirsiniz.

2. Kaynaklarda CORP veya CORS'un etkinleştirildiğinden emin olun

Sayfadaki tüm kaynakların CORP veya CORS HTTP üstbilgileriyle yüklendiğinden emin olun. Bu adım, COEP'in etkinleştirildiği dördüncü adım için gereklidir.

Kaynağın niteliğine bağlı olarak şunları yapmanız gerekir:

  • Kaynağın yalnızca aynı kaynaktan yüklenmesi bekleniyorsa Cross-Origin-Resource-Policy: same-origin başlığını ayarlayın.
  • Kaynağın yalnızca aynı siteden ancak kaynaklar arasında yüklenmesi bekleniyorsa Cross-Origin-Resource-Policy: same-site başlığını ayarlayın.
  • Kaynak, kontrolünüzdeki çapraz kaynaklardan yükleniyorsa mümkünse Cross-Origin-Resource-Policy: cross-origin başlığını ayarlayın.
  • Kontrolünüz olmayan kaynakta çapraz kaynaklar için:
    • Kaynak CORS ile sunuluyorsa yükleme HTML etiketinde crossorigin özelliğini kullanın. (Örneğin, <img src="***" crossorigin>.)
    • Kaynağın sahibinden CORS veya CORP'yi desteklemesini isteyin.
  • iFrame'ler için yukarıdakilerle aynı ilkeleri uygulayın ve Cross-Origin-Resource-Policy: cross-origin (veya bağlama bağlı olarak same-site, same-origin) değerini ayarlayın.
  • WebWorker ile yüklenen komut dosyaları aynı kaynaktan sunulmalıdır. Bu nedenle, CORP veya CORS başlıklarına ihtiyacınız yoktur.
  • COEP: require-corp ile yayınlanan bir belge veya çalışan için CORS olmadan yüklenen kaynaklar arası alt kaynaklar, Cross-Origin-Resource-Policy: cross-origin başlığını yerleştirmeyi etkinleştirecek şekilde ayarlamalıdır. Örneğin bu, <script>, importScripts, <link>, <video>, <iframe> vb. için geçerlidir.

3. Yerleşik kaynakları değerlendirmek için COEP Yalnızca Raporlama HTTP üst bilgisini kullanma

COEP'yi tam olarak etkinleştirmeden önce, politikanın gerçekten işe yarayıp yaramadığını incelemek için Cross-Origin-Embedder-Policy-Report-Only başlığını kullanarak bir prova yapabilirsiniz. Yerleşik içeriği engellemeden rapor alırsınız.

Bu işlemi üst düzey belge, iframe'ler ve çalışan komut dosyaları dahil tüm dokümanlara yinelemeli olarak uygulayın. Salt Rapor HTTP başlığı hakkında bilgi için Raporlama API'sini kullanarak sorunları gözlemleme bölümüne bakın.

4. COEP'yi etkinleştirme

Her şeyin çalıştığından ve tüm kaynakların başarıyla yüklenebileceğinden emin olduktan sonra Cross-Origin-Embedder-Policy-Report-Only başlığını, iframe'ler ve işleyici komut dosyaları aracılığıyla yerleştirilenler de dahil olmak üzere tüm belgelerde aynı değere sahip Cross-Origin-Embedder-Policy başlığıyla değiştirin.

İzolasyonun self.crossOriginIsolated ile başarılı olup olmadığını belirleyin

Web sayfası kaynak ötesi izole durumdayken ve tüm kaynaklar ile pencereler aynı tarama bağlamı grubunda izole edildiğinde self.crossOriginIsolated mülkü true değerini döndürür. Tarama bağlamı grubunu başarıyla izole edip performance.measureUserAgentSpecificMemory() gibi güçlü özelliklere erişip erişmediğinizi belirlemek için bu API'yi kullanabilirsiniz.

Chrome Geliştirici Araçları'nı kullanarak sorunları ayıklama

Resimler gibi ekranda oluşturulan kaynaklarda istek engelleneceği ve sayfada eksik resim gösterileceği için COEP sorunlarını tespit etmek oldukça kolaydır. Ancak komut dosyaları veya stiller gibi görsel bir etkisi olmayan kaynaklarda COEP sorunları fark edilmeyebilir. Bu tür veriler için Geliştirici Araçları Ağ panelini kullanın. COEP ile ilgili bir sorun varsa Durum sütununda (blocked:NotSameOriginAfterDefaultedToSameOriginByCoep) görürsünüz.

Ağ panelinin Durum sütununda COEP sorunları olduğunu görürsünüz.

Ardından, daha fazla ayrıntı görmek için girişi tıklayabilirsiniz.

COEP sorununun ayrıntıları, Ağ panelinde bir ağ kaynağı tıklandıktan sonra Başlıklar sekmesinde gösterilir.

iframe'lerin ve pop-up pencerelerin durumunu Uygulama panelinden de belirleyebilirsiniz. Kaynak yapısının dökümünü görmek için sol taraftaki "Çerçeveler" bölümüne gidin ve "üst"ü genişletin.

iframe'in durumunu (ör. SharedArrayBuffer kullanılabilirliği vb.) kontrol edebilirsiniz.

Chrome Geliştirici Araçları iframe denetleyicisi

Pop-up pencerelerin durumunu (ör. kaynak ayırma olup olmadığı) da kontrol edebilirsiniz.

Chrome Geliştirici Araçları pop-up pencere denetleyicisi

Reporting API'yi kullanarak sorunları gözlemleme

Reporting API, çeşitli sorunları tespit edebileceğiniz başka bir mekanizmadır. Reporting API'yi, COEP bir kaynağın yüklenmesini engellediğinde veya COOP bir pop-up pencereyi izole ettiğinde kullanıcılarınızın tarayıcısına rapor göndermesini talimat verecek şekilde yapılandırabilirsiniz. Chrome, Reporting API'yi sürüm 69'dan beri COEP ve COOP gibi çeşitli kullanımlar için desteklemektedir.

Reporting API'yi nasıl yapılandıracağınızı ve rapor alacak bir sunucu nasıl oluşturacağınızı öğrenmek için Reporting API'yi kullanma başlıklı makaleyi inceleyin.

Örnek COEP raporu

Kaynaklar arası kaynak engellendiğinde örnek bir COEP raporu yükü şöyle görünür:

[{
  "age": 25101,
  "body": {
    "blocked-url": "https://third-party-test.glitch.me/check.svg?",
    "blockedURL": "https://third-party-test.glitch.me/check.svg?",
    "destination": "image",
    "disposition": "enforce",
    "type": "corp"
  },
  "type": "coep",
  "url": "https://cross-origin-isolation.glitch.me/?coep=require-corp&coop=same-origin&",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4249.0 Safari/537.36"
}]

Örnek COOP raporu

Bir pop-up pencere tek başına açıldığında örnek bir COOP raporu yükü şöyle görünür:

[{
  "age": 7,
  "body": {
    "disposition": "enforce",
    "effectivePolicy": "same-origin",
    "nextResponseURL": "https://third-party-test.glitch.me/popup?report-only&coop=same-origin&",
    "type": "navigation-from-response"
  },
  "type": "coop",
  "url": "https://cross-origin-isolation.glitch.me/coop?coop=same-origin&",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4246.0 Safari/537.36"
}]

Farklı tarama bağlamı grupları birbirine erişmeye çalıştığında (yalnızca "yalnızca rapor" modunda) COOP da bir rapor gönderir. Örneğin, postMessage() girişiminde bulunulduğunda oluşturulan rapor aşağıdaki gibi görünür:

[{
  "age": 51785,
  "body": {
    "columnNumber": 18,
    "disposition": "reporting",
    "effectivePolicy": "same-origin",
    "lineNumber": 83,
    "property": "postMessage",
    "sourceFile": "https://cross-origin-isolation.glitch.me/popup.js",
    "type": "access-from-coop-page-to-openee"
  },
  "type": "coop",
  "url": "https://cross-origin-isolation.glitch.me/coop?report-only&coop=same-origin&",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4246.0 Safari/537.36"
},
{
  "age": 51785,
  "body": {
    "disposition": "reporting",
    "effectivePolicy": "same-origin",
    "property": "postMessage",
    "type": "access-to-coop-page-from-openee"
  },
  "type": "coop",
  "url": "https://cross-origin-isolation.glitch.me/coop?report-only&coop=same-origin&",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4246.0 Safari/537.36"
}]

Sonuç

Bir web sayfasını kökler arası özel bir duruma getirmek için COOP ve COEP HTTP başlıklarının bir kombinasyonunu kullanın. Bir web sayfasının kaynaktan bağımsız izole durumda olup olmadığını belirlemek için self.crossOriginIsolated öğesini inceleyebilirsiniz.

Bu kaynaktan kaynaka yalıtılmış durumda yeni özellikler kullanıma sunulduğunda ve COOP ile COEP ile ilgili DevTools'ta daha fazla iyileştirme yapıldığında bu yayını güncellemeye devam edeceğiz.

Kaynaklar