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 sunulacakperformance.now()
veperformance.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üğündedocument.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ı 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.
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.
- Kaynak CORS ile sunuluyorsa yükleme HTML etiketinde
- iFrame'ler için yukarıdakilerle aynı ilkeleri uygulayın ve
Cross-Origin-Resource-Policy: cross-origin
(veya bağlama bağlı olaraksame-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.
Ardından, daha fazla ayrıntı görmek için girişi tıklayabilirsiniz.
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.
Pop-up pencerelerin durumunu (ör. kaynak ayırma olup olmadığı) da kontrol edebilirsiniz.
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.