Yayınlanma tarihi: 4 Mayıs 2020
COOP ve COEP kullanarak web sitenizi "kökler arası erişime kapalı" yapma başlıklı makalede, COOP ve COEP kullanarak "kökler arası erişime kapalı" durumunu nasıl benimseyeceğinizi açıklamıştık. Bu makalede, tarayıcıda güçlü özellikleri etkinleştirmek için neden kökler arası erişime kapalı web sitelerinin gerekli olduğu açıklanmaktadır.
Sözlük
Bu belgede, benzer şekilde adlandırılmış ve kısaltılmış birçok terim kullanılmaktadır. Daha net bir şekilde açıklamak için mini bir sözlük hazırladık:
- COEP: Çapraz Kaynak Yerleştirme Politikası
- COOP: Çapraz Kaynak Açıcı Politikası
- CORP: Kaynaklar Arası Kaynak Politikası
- CORS: Merkezler Arası Kaynak Paylaşımı
- CORB: Kaynaklar Arası Okumayı Engelleme
Arka plan
Web, dokümanların ve komut dosyalarının başka bir kaynaktaki kaynaklarla nasıl etkileşime girebileceğini kısıtlayan bir güvenlik özelliği olan aynı kaynak politikası üzerine kuruludur. Bu ilke, web sitelerinin kaynaklar arası kaynaklara erişebileceği yöntemleri kısıtlar. Örneğin, https://a.example alanından gelen bir dokümanın https://b.example alanında barındırılan verilere erişmesi engellenir.
Ancak aynı kaynak politikasının geçmişte bazı istisnaları olmuştur. Herhangi bir web sitesi:
- Çapraz kaynak iframe'leri yerleştirme
- Resimler veya komut dosyaları gibi kaynaklar arası kaynakları dahil etme
- DOM referansıyla çapraz kaynak iletişim kutusu pencereleri açma
Web topluluğu katı bir aynı kaynak politikasının faydalarını fark ettiğinde web, bu istisnalara zaten bağımlıydı.
Bu kadar gevşek bir aynı kaynak politikasının güvenlik açısından yan etkileri iki şekilde düzeltildi:
- Merkezler Arası Kaynak Paylaşımı (CORS) protokolü, sunucunun belirli bir kaynakla kaynak paylaşımına izin vermesini sağlar.
- Geliştiriciler, geriye dönük uyumluluğu korurken çapraz kaynak kaynaklara doğrudan komut dosyası erişimini örtülü olarak kaldırır. Bu tür çapraz kaynaklı kaynaklara "opak" kaynaklar denir. Bu nedenle, resme CORS uygulanmadığı sürece
CanvasRenderingContext2Dile çapraz kaynak piksel manipülasyonu başarısız olur.
Bu politika kararlarının tümü bir göz atma bağlamı grubu içinde gerçekleşir.

Uzun süre boyunca bu kombinasyon, tarayıcıları güvende tutmak için yeterliydi. Doğrudan düzeltme gerektiren sınırlı uç durumlar (ör. JSON güvenlik açıkları) vardı.
Bu durum, kodunuzla aynı göz atma bağlamı grubuna yüklenen tüm verileri potansiyel olarak okunabilir hale getiren Spectre ile değişti. Saldırganlar, belirli işlemlerin ne kadar sürdüğünü ölçerek CPU önbelleklerinin ve dolayısıyla işlemin belleğinin içeriğini tahmin edebilir. Bu tür saldırılar, platformda bulunan düşük ayrıntı düzeyine sahip zamanlayıcılarla mümkündür ve hem açık (ör. performance.now()) hem de örtülü (ör. SharedArrayBuffer) yüksek ayrıntı düzeyine sahip zamanlayıcılarla hızlandırılabilir.
evil.com, çapraz kaynak bir resim yerleştirirse yerleştirilen resmin piksel verilerini okumak için Spectre saldırısı kullanabilir. Bu durum, "opaklık" özelliğine dayalı korumaları etkisiz hale getirir.

İdeal olarak, tüm çapraz kaynak istekler, kaynağın sahibi olan sunucu tarafından incelenir. Uygunluk değerlendirmesi yapılmadıysa veriler hiçbir zaman kötü niyetli bir aktörün göz atma bağlamı grubuna ulaşmamalıdır. Bu nedenle, veriler olası Spectre saldırılarının erişemeyeceği bir yerde kalır. Buna kökler arası erişime kapalı durum denir.
Yerleştirilmiş kod, kökler arası erişime kapalı durumda olduğunda istekte bulunan site daha az tehlikeli olarak kabul edilir. Bu sayede, istekte bulunan site olası Spectre saldırılarını önlerken daha iyi hassasiyetle SharedArrayBuffer, performance.measureUserAgentSpecificMemory() ve yüksek çözünürlüklü zamanlayıcılar kullanabilir. Bu durum, document.domain öğesinin değiştirilmesini de engeller.
Çapraz Kaynak Yerleştirme Politikası
Cross Origin Embedder Policy (COEP), bir belgenin CORP veya CORS ile açıkça izin vermeyen kaynaklar arası kaynakları yüklemesini engeller. Bu özellik sayesinde, bir dokümanın bu tür kaynakları yükleyemeyeceğini belirtebilirsiniz.
a.example,
COEP politikasını require-corp olarak ayarladı. a.example, b.example kaynağından 3 öğe yerleştirmek istiyor ancak yalnızca ikisi başarılı oluyor.
Başarılı olan iki yerleştirme arasında, kaynaklar arası CORP politikası içeren bir JavaScript dosyası ve CORS'a izin verilen bir resim yer alıyor. Üçüncü öğe, yalnızca aynı kaynakta yerleştirilmesi gereken bir CORP politikasına sahip bir videodur. Bu nedenle video, a.example üzerinde yüklenmez.
Bu politikayı etkinleştirmek için dokümana aşağıdaki HTTP üstbilgisini ekleyin:
Cross-Origin-Embedder-Policy: require-corp
COEP, tek bir require-corp değeri alır. Bu, belgenin yalnızca aynı kaynaktaki kaynakları veya başka bir kaynaktan yüklenebilir olarak açıkça işaretlenmiş kaynakları yükleyebileceği politikasını zorunlu kılar.
Kaynakların başka bir merkezden yüklenebilmesi için merkezler arası kaynak paylaşımını (CORS) veya merkezler arası kaynak politikasını (CORP) desteklemesi gerekir.
Merkezler Arası Kaynak Paylaşımı
Merkezler arası bir kaynak Merkezler Arası Kaynak Paylaşımı
(CORS)'nı destekliyorsa
crossorigin
özelliğini
kullanarak COEP tarafından engellenmeden web sayfanıza yükleyebilirsiniz.
<img src="https://third-party.example.com/image.jpg" crossorigin>
Örneğin, bu resim kaynağı CORS başlıklarıyla yayınlanıyorsa kaynağı getirme isteğinin CORS modunu kullanması için crossorigin özelliğini kullanın. Bu durum, CORS başlıkları ayarlanmadığı sürece resmin yüklenmesini de engeller.
Benzer şekilde, sunucu doğru HTTP üstbilgileri ile yanıt verdiği sürece özel işlem gerektirmeyen fetch() yöntemiyle de kaynaklar arası veri getirebilirsiniz.
Çapraz Kaynak Kaynak Politikası
Merkezler Arası Kaynak Politikası (CORP), kaynaklarınızı başka bir kaynak tarafından yüklenmeye karşı korumak için başlangıçta isteğe bağlı olarak kullanıma sunulmuştu. COEP bağlamında CORP, bir kaynağı kimin yükleyebileceğine ilişkin kaynak sahibinin politikasını belirtebilir.
Cross-Origin-Resource-Policy başlığı üç olası değer alır:
Cross-Origin-Resource-Policy: same-site
same-site ile işaretlenen kaynaklar yalnızca aynı siteden yüklenebilir.
Cross-Origin-Resource-Policy: same-origin
same-origin ile işaretlenen kaynaklar yalnızca aynı kaynaktan yüklenebilir.
Cross-Origin-Resource-Policy: cross-origin
cross-origin ile işaretlenen kaynaklar herhangi bir web sitesi tarafından yüklenebilir. (Bu değer, COEP ile birlikte CORP spesifikasyonuna eklendi.)
Çapraz Kaynak Açıcı Politikası
Cross Origin Opener Policy
(COOP), belgeleri ayrı bir göz atma bağlamı grubuna yerleştirerek üst düzey bir pencereyi diğer belgelerden izole etmenizi sağlar. Bu şekilde, dokümanlar üst düzey pencereyle doğrudan etkileşim kuramaz. Örneğin, COOP içeren bir doküman bir iletişim kutusu açarsa window.opener özelliği null olur. Açıcı referansının .closed özelliği true.

Cross-Origin-Opener-Policy başlığı üç olası değer alır:
Cross-Origin-Opener-Policy: same-origin
same-origin ile işaretlenen dokümanlar, aynı kaynağa sahip ve açıkça same-origin ile işaretlenmiş dokümanlarla aynı göz atma bağlamı grubunu paylaşabilir.

Cross-Origin-Opener-Policy: same-origin-allow-popups
same-origin-allow-popups içeren üst düzey bir doküman, COOP'u ayarlamayan veya unsafe-none COOP'u ayarlayarak izolasyonu devre dışı bırakan pop-up'larına yönelik referansları korur.

Cross-Origin-Opener-Policy: unsafe-none
unsafe-none varsayılandır ve açıcıda same-origin COOP'u yoksa belgenin açıcısının göz atma bağlamı grubuna eklenmesine izin verir.
Özet
SharedArrayBuffer, performance.measureUserAgentSpecificMemory() veya daha iyi hassasiyete sahip yüksek çözünürlüklü zamanlayıcılar gibi özelliklere erişmek istiyorsanız dokümanınızda hem require-corp değerine sahip COEP hem de same-origin değerine sahip COOP kullanılmalıdır. Bu iki öğeden biri olmadığında tarayıcı, bu güçlü özelliklerin güvenli bir şekilde etkinleştirilmesi için yeterli izolasyonu garanti etmez.
Sayfanızın durumunu, self.crossOriginIsolated
true döndürüp döndürmediğini kontrol ederek belirleyebilirsiniz.
Bu özelliği nasıl uygulayacağınızı COOP ve COEP kullanarak web sitenizi "kaynaklar arası yalıtılmış" hale getirme başlıklı makaleden öğrenebilirsiniz.