Üçüncü tarafların sunduğu kaynaklar arası kaynaklar genellikle yeterli CORP başlıkları içermez. Kimlik bilgileri olmadan istenebiliyorsa artık bu şekilde işaretleyerek kökler arası izolasyonu etkinleştirebilirsiniz.
Çerezler gibi kimlik bilgileri içermeyen bir istek göndererek tarayıcının, Kaynaklar Arası Kaynak Politikası'nı (CORP) kullanmayan çapraz kaynak kaynaklarını yüklemesini sağlayan yeni Çapraz Kökenli Yerleştirme Politikası (COEP) değerini credentialless
kullanıma sunduk. Bu, geliştiricilerin kökler arası izolasyonu daha kolay bir şekilde benimsemesine yardımcı olur.
Kökler arası erişime neden ihtiyacımız var?
Bazı web API'leri, Spectre gibi yan kanal saldırıları riskini artırır. Tarayıcılar bu riski azaltmak için kökler arası izolasyon adı verilen tercihe dayalı yalıtılmış bir ortam sunar. Kaynaklar arası erişime kapalı durumdayken web sayfası, etkinleştirilmediği sürece kaynağı diğerlerinden izole ederken SharedArrayBuffer
, performance.measureUserAgentSpecificMemory()
ve daha iyi çözünürlüklü yüksek hassasiyetli zamanlayıcılar gibi ayrıcalıklı özellikleri kullanabilir.
Web sayfası, çapraz kaynak izolasyonunu etkinleştirmek için iki HTTP üstbilgisi göndermelidir:
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Kökler arası erişime kapalı durumda tüm kökler arası kaynaklar CORS ile sunulmalı veya yüklenecek bir Cross-Origin-Resource-Policy
üst bilgisi ayarlamalıdır.
Kökler arası erişime izin vermenin zorlukları
Kökler arası erişime kapalı web sayfalarının güvenliği ve güçlü özellikleri etkinleştirme olanağı sağlasa da bu özelliğin dağıtılması zor olabilir. En büyük zorluklardan biri, tüm çapraz kaynak kaynaklar için CORS veya CORP'nin etkinleştirilmesi gerekliliğidir. Bu başlıklara sahip olmayan kaynaklar, kökler arası erişime kapalı bir sayfaya tarayıcı tarafından yüklenmez.
Bu çapraz kaynak kaynaklara genellikle gerekli üst bilgileri eklemek kolay olmayabilecek üçüncü taraflarca sunulur.
Peki kaynağın yüklenmek için yeterince güvenli olduğunu bilirsek ne olur? Aslında risk altında olan tek kaynak, kimlik bilgileriyle istenen kaynaklardır. Bunun nedeni, bu kaynaklarda saldırganın kendi başına yükleyemeyeceği hassas bilgiler bulunması olasıdır. Bu, kimlik bilgileri olmadan istenebilen kaynakların herkesin kullanımına açık olduğu ve yüklenmesinin güvenli olduğu anlamına gelir.
credentialless
kurtarır
İşte COEP: credentialless
burada devreye giriyor. credentialless
, Cross-Origin-Embedder-Policy
başlığı için yeni bir değerdir. require-corp
ile benzer şekilde, kaynaklar arası yalıtımı etkinleştirebilir ancak kaynaklar arası bağlantı içermeyen istekler için bir CORP:cross-origin
üst bilgisi gerektirmek yerine, kimlik bilgileri (ör. çerezler) olmadan gönderilirler.
Alternatif olarak, aşağıdaki iki üst bilgiyi kullanarak kökler arası izolasyonu etkinleştirebilirsiniz:
Cross-Origin-Embedder-Policy: credentialless
Cross-Origin-Opener-Policy: same-origin
Bu, istenen kaynaklar arası sunucunun hassas bir kaynakla yanıt veremeyeceği ve istekte bulunan kişinin, her zaman yanıtın yalnızca herkese açık bilgiler içerdiğini varsayabileceği anlamına gelir.
Bu, tarayıcıların üçüncü taraf çerezlerini aşamalı olarak kullanımdan kaldırma planıyla da uyumludur.
Demografi
Bu demoda çeşitli başlık seçeneklerini deneyebilirsiniz: https://cross-origin-isolation.glitch.me
SSS
credentialless
ortamında kimlik bilgileri içeren bir istek gönderebilir miyim?
Kesinlikle istek modunu, yanıt için CORS kontrolü gerektirecek şekilde değiştirme pahasına. <audio>
, <img>
, <link>
, <script>
ve <video>
gibi HTML etiketlerinde, tarayıcının kimlik bilgileri içeren istekler göndermesini bildirmek için crossorigin="use-credentials"
öğesini açıkça eklemeniz yeterlidir.
Örneğin, https://www.example.com
üzerindeki bir dokümanda Cross-Origin-Embedder-Policy: credentialless
başlığı olsa bile <img
src="https://images.example.com/avatar.png" crossorigin="use-credentials">
, kimlik bilgileri içeren bir istek gönderir.
fetch()
API için request.mode = 'cors'
kullanılabilir.
Sağlanan COEP: credentialless
, COEP: require-corp
web sitem için hâlâ nasıl yararlı olur?
COEP: require-corp
, bazı çapraz kaynak alt kaynakları için çerez gerekirse istek modunu manuel olarak CORS'a geçirmenizi gerektirmez.
Kaynaklar arası iframe'leri, özel üstbilgiler olmadan bir credentialless
ortamı altında da yükleyebilir miyim?
Hayır. Bir credentialless
ortamı altında kaynaklar arası iframe'ler yüklemek için yine de require-corp
ile aynı koşullar gerekir. iframe dokümanları iki başlıkla sunulmalıdır:
Cross-Origin-Embedder-Policy: credentialless
(veyarequire-corp
)Cross-Origin-Resource-Policy: cross-origin
Neyse ki iframe'ler crossorigin="anonymous"
vererek, kaynaklar arası iframe'lerin bu başlıklar olmadan yüklenmesine izin verme konusunda devam eden bir tartışma var.
Bu işlem, kaynaklar arası iframe'lerin başlıklar ve kimlik bilgileri olmadan yüklenmesine izin verir.
Bu özellik diğer tarayıcılar tarafından da benimsenecek mi?
- Firefox izleme sorunu
- Konum için Webkit İsteği: Sinyal yok
- W3C ETİKETİ Konum isteği: Beklemede
Sırada ne var?
Kökler arası erişime kapalı kalmayla ilgili diğer zorlukları azaltmak için iki güncelleme daha yapılacak:
Yukarıdaki engeller nedeniyle SharedArrayBuffer değişikliğini uzatmak için Chrome kaynak denemesine kaydolanlar, değişikliğin ne zaman sonlandırılacağını merak ediyor olabilir. Başta Chrome 96'da sonlandırılacağını duyurmuştuk, ancak bunu Chrome 106'ya ertelemeye karar verdik.
Kaynaklar
- COOP ve COEP kullanarak web sitenizi "kökenler arası erişime kapalı" hale getirme
- Güçlü özellikler için neden "kaynaklar arası erişime" ihtiyacınız var?
- Çapraz kaynak izolasyonunu etkinleştirme rehberi
- Android Chrome 88 ve masaüstü Chrome 92'de SharedArrayBuffer güncellemeleri
Fotoğraf: Martin Adams (Unsplash)