Üçüncü tarafların sunduğu kaynaklar arası kaynaklar genellikle yeterli CORP başlıkları içermez. Kimlik bilgileri olmadan istenebiliyorlarsa artık bunları işaretleyerek kaynak ayırmayı etkinleştirebilirsiniz.
Tarayıcıya, ç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ısı 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. Kökler arası erişime kapalı web sayfası; SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
ve daha iyi çözünürlüklü yüksek hassasiyetli zamanlayıcılar gibi ayrıcalıklı özellikleri kullanırken, etkinleştirilmediği sürece kaynağı diğer kullanıcılardan izole edebilir.
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ı izole durumda, 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 sitelerinin etkinleştirilmesiyle 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 başlıkları eklemesi kolay olmayabilecek üçüncü taraflarca yayınlanır.
Peki kaynağın yüklenmek için yeterince güvenli olduğunu biliyorsak ne olur? Aslında, risk altındaki tek kaynaklar kimlik bilgileriyle istenen kaynaklardır. Bunun nedeni, saldırganın tek başına yükleyemeyeceği hassas bilgileri içermeleridir. 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şimi kapatılmış isteklerde CORP:cross-origin
başlığı yerine kimlik bilgileri (ör. çerezler) olmadan gönderilir.
Alternatif olarak aşağıdaki iki başlıkla kökler arası izolasyonu 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 bir CORS kontrolü gerektirecek şekilde değiştirmek pahasına. <audio>
, <img>
, <link>
, <script>
ve <video>
gibi HTML etiketleri için tarayıcıya kimlik bilgisi içeren istekler göndermesini bildirmek üzere 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ı altında kaynaklar arası iframe'ler yüklemek için require-corp
ile aynı koşulların sağlanması gerekir. iFrame belgelerinin iki üstbilgiyle sunulması gerekir:
Cross-Origin-Embedder-Policy: credentialless
(veyarequire-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ı?
- Firefox izleme sorunu
- Webkit'in konum isteği: Sinyal yok
- W3C TAG Konum isteği: Beklemede
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 denemesine kaydolan kullanıcılar, değişikliğin 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
- COOP ve COEP'yi kullanarak web sitenizi "kaynaklar arası izole" hale getirme
- Güçlü özellikler için neden "kökler arası erişime kapalı" ayarını kullanmanız gerekir?
- Kaynaklar arası izolasyonu etkinleştirme kılavuzu
- Android Chrome 88 ve masaüstü Chrome 92'de SharedArrayBuffer güncellemeleri
Fotoğraf: Martin Adams, Unsplash