Üçü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
(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 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
- 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ına ihtiyacınız var?
- Kaynaklar arası izolasyonu etkinleştirme kılavuzu
- Android Chrome 88 ve masaüstü Chrome 92'de SharedArrayBuffer güncellemeleri
Fotoğraf: Martin Adams, Unsplash