Önbelleği bölümlendirerek güvenlik ve gizlilik kazanma

Eiji Kitamura
Eiji Kitamura

Önbelleğe alma genel olarak, gelecekteki aynı verilere yönelik isteklerin daha hızlı sunulmasını sağlayacak şekilde verileri depolayarak performansı artırabilir. Örneğin, ağdaki önbelleğe alınmış bir kaynak, sunucuya gidiş dönüşü önleyebilir. Önbelleğe alınan bir hesaplama sonucu, aynı hesaplamayı yapmak için gereken süreyi atlayabilir.

Chrome'da önbellek mekanizması çeşitli şekillerde kullanılır ve HTTP Önbelleği buna örnektir.

Chrome'un HTTP Önbelleğinin şu anda çalışma şekli

Sürüm 85'ten itibaren Chrome, ağdan getirilen kaynakları önbelleğe almak için bu kaynakların URL'lerini önbellek anahtarı olarak kullanır. (Önbellek anahtarı, önbelleğe alınan bir kaynağı tanımlamak için kullanılır.)

Aşağıdaki örnekte, tek bir resmin nasıl önbelleğe alındığı ve üç farklı bağlamda nasıl işlendiği gösterilmektedir:

Önbellek Anahtarı: https://x.example/doge.png
Önbellek Anahtarı: { https://x.example/doge.png }

Kullanıcı, resim (https://x.example/doge.png) isteyen bir sayfayı (https://a.example) ziyaret eder. Resim ağdan istenir ve anahtar olarak https://x.example/doge.png kullanılarak önbelleğe alınır.

Önbellek Anahtarı: https://x.example/doge.png
Önbellek Anahtarı: { https://x.example/doge.png }

Aynı kullanıcı, aynı resmi (https://x.example/doge.png) isteyen başka bir sayfayı (https://b.example) ziyaret eder. Tarayıcı, anahtar olarak resim URL'sini kullanarak bu kaynağın zaten önbelleğe alınmış olup olmadığını görmek için HTTP Önbelleğini kontrol eder. Tarayıcı, Önbelleğinde bir eşleşme bulur ve kaynağın önbelleğe alınan sürümünü kullanır.

Önbellek Anahtarı: https://x.example/doge.png
Önbellek Anahtarı: { https://x.example/doge.png }

Resmin iframe içinden yüklenmesi önemli değildir. Kullanıcı, iframe (https://d.example) içeren başka bir web sitesini (https://c.example) ziyaret ederse ve iframe aynı resmi (https://x.example/doge.png) isterse önbellek anahtarı tüm sayfalarda aynı olduğundan tarayıcı, resmi önbelleğinden yükleyebilir.

Performans açısından bakıldığında, bu mekanizma uzun zamandır iyi bir şekilde çalışmaktadır. Ancak, bir web sitesinin HTTP isteklerine yanıt vermesi için geçen süre, tarayıcının geçmişte aynı kaynağa eriştiğini ortaya çıkarabilir. Bu da, tarayıcıyı aşağıdakiler gibi güvenlik ve gizlilik saldırılarına karşı açar:

  • Bir kullanıcının belirli bir siteyi ziyaret edip etmediğini tespit etme: Kötü niyetli kişiler, önbellekte belirli bir siteye veya site grubuna özgü olabilecek bir kaynak olup olmadığını kontrol ederek kullanıcının tarama geçmişini tespit edebilir.
  • Siteler arası arama saldırısı: Kötü niyetli bir kişi, belirli bir web sitesi tarafından kullanılan "arama sonucu yok" resminin tarayıcının önbelleğinde olup olmadığını kontrol ederek kullanıcının arama sonuçlarında rastgele bir dizenin olup olmadığını tespit edebilir.
  • Siteler arası izleme: Önbellek, çerez benzeri tanımlayıcıları siteler arası izleme mekanizması olarak depolamak için kullanılabilir.

Bu riskleri azaltmak amacıyla Chrome, 86'dan itibaren HTTP önbelleğini bölümlendirecektir.

Önbellek bölümlendirme, Chrome'un HTTP Önbelleğini nasıl etkiler?

Önbellek bölümlendirmesi ile önbelleğe alınan kaynaklar, kaynak URL'sine ek olarak yeni bir "Ağ Yalıtımı Anahtarı" kullanılarak anahtarlanır. Ağ İzolasyonu Anahtarı, üst düzey site ve mevcut çerçeve sitesinden oluşur.

Önbellek bölümlendirmenin farklı bağlamlarda nasıl çalıştığını görmek için önceki örneği tekrar inceleyin:

Önbellek Anahtarı { https://a.example, https://a.example, https://x.example/doge.png}
Önbellek Anahtarı: { https://a.example, https://a.example, https://x.example/doge.png }

Bir kullanıcı, resim (https://x.example/doge.png) isteyen bir sayfayı (https://a.example) ziyaret eder. Bu durumda, resim ağdan istenir ve https://a.example (üst düzey site), https://a.example (geçerli çerçeve site) ve https://x.example/doge.png (kaynak URL'si) anahtarlarından oluşan bir unsur kullanılarak ağdan istenir. (Kaynak isteği üst düzey çerçeveden geldiğinde, Ağ Yalıtımı Anahtarı'ndaki üst düzey site ile geçerli çerçeveli site aynı olur.)

Önbellek Anahtarı { https://a.example, https://a.example, https://x.example/doge.png}
Önbellek Anahtarı: { https://b.example, https://b.example, https://x.example/doge.png }

Aynı kullanıcı, aynı resmi (https://x.example/doge.png) isteyen farklı bir sayfayı (https://b.example) ziyaret eder. Önceki örnekte aynı resim yüklenmiş olsa da, anahtar eşleşmediği için bu bir önbellek isabeti olmaz.

Görüntü ağdan istenir ve anahtar olarak https://b.example, https://b.example ve https://x.example/doge.png'den oluşan bir unsur kullanılarak önbelleğe alınır.

Önbellek Anahtarı { https://a.example, https://a.example, https://x.example/doge.png}
Önbellek Anahtarı: { https://a.example, https://a.example, https://x.example/doge.png }

Kullanıcı şimdi https://a.example uygulamasına geri dönüyor ancak bu kez resim (https://x.example/doge.png) iframe içine yerleştirilmiş. Bu durumda anahtar; https://a.example, https://a.example ve https://x.example/doge.png içeren bir unsurdur ve bir önbellek isabeti gerçekleşir. (Üst düzey site ve iframe aynı site olduğunda, üst düzey çerçeveyle önbelleğe alınan kaynağın kullanılabileceğini unutmayın.

Önbellek Anahtarı { https://a.example, https://a.example, https://x.example/doge.png}
Önbellek Anahtarı: { https://a.example, https://c.example, https://x.example/doge.png }

Kullanıcı https://a.example konumuna geri döndü. Ancak bu kez resim, https://c.example uygulamasındaki bir iframe'de barındırılıyor.

Bu durumda resim, önbellekte https://a.example, https://c.example ve https://x.example/doge.png öğelerinden oluşan anahtarla eşleşen bir kaynak olmadığından ağdan indirilir.

Önbellek Anahtarı { https://a.example, https://a.example, https://x.example/doge.png}
Önbellek Anahtarı: { https://a.example, https://c.example, https://x.example/doge.png }

Alan bir alt alan adı veya bağlantı noktası numarası içeriyorsa ne olur? Kullanıcı, resmi isteyen bir iframe (https://c.example:8080) yerleştiren https://subdomain.a.example sitesini ziyaret eder.

Anahtar "scheme://eTLD+1"e göre oluşturulduğundan alt alan adları ve bağlantı noktası numaraları yoksayılır. Bu nedenle bir önbellek isabeti oluşur.

Önbellek Anahtarı { https://a.example, https://a.example, https://x.example/doge.png}
Önbellek Anahtarı: { https://a.example, https://c.example, https://x.example/doge.png }

iframe birden çok kez iç içe yerleştirilmişse ne olur? Kullanıcı https://a.example ziyaretini ziyaret eder. Bu işlemde iframe (https://b.example) yerleştirilerek başka bir iframe (https://c.example) yerleştirilir ve bu şekilde son olarak resim istenir.

Anahtar üst çerçeveden (https://a.example) ve kaynağı yükleyen hemen çerçeveden (https://c.example) alındığı için bir önbellek isabeti gerçekleşir.

SSS

Chrome'umda zaten etkin mi? Nasıl kontrol edebilirim?

Bu özellik, 2020'nin sonlarında kullanıma sunulacaktır. Chrome örneğinizin bunu destekleyip desteklemediğini kontrol etmek için:

  1. chrome://net-export/ dosyasını açın ve Diske Günlük Kaydını Başlat'a basın.
  2. Günlük dosyasının bilgisayarınızda nereye kaydedileceğini belirtin.
  3. Chrome'la web'e bir dakika göz atın.
  4. chrome://net-export/ uygulamasına geri dönün ve Günlüğe Kaydetmeyi Durdur'a basın.
  5. Şuraya git: https://netlog-viewer.appspot.com/#import.
  6. Dosya Seç'e basın ve kaydettiğiniz günlük dosyasını iletin.

Günlük dosyasının çıkışını görürsünüz.

Aynı sayfada SplitCacheByNetworkIsolationKey uygulamasını bulun. Ardından Experiment_[****] geliyorsa Chrome'unuzda HTTP Önbelleği bölümlendirmesi etkindir. Ardından Control_[****] veya Default_[****] geliyorsa etkinleştirilmez.

Chrome'umda HTTP Önbelleği bölümlendirmesini nasıl test edebilirim?

Chrome'unuzda HTTP Önbelleği bölümlendirmeyi test etmek için Chrome'u şu komut satırı işaretiyle başlatmanız gerekir: --enable-features=SplitCacheByNetworkIsolationKey. Chrome'u platformunuzda bir komut satırı işaretiyle nasıl başlatacağınızı öğrenmek için Chromium'u bayraklarla çalıştırma bölümündeki talimatları uygulayın.

Web geliştiricisi olarak bu değişikliğe yanıt olarak yapmam gereken herhangi bir işlem var mı?

Bu durum zarara yol açmasa da bazı web hizmetleri için performansla ilgili kaygılar doğurabilir.

Örneğin, birçok sitede (yazı tipi ve popüler komut dosyaları gibi) yüksek hacimde önbelleğe alınabilir kaynak sunan kaynakların trafiklerinde artış görülebilir. Ayrıca, bu tür hizmetleri kullananların bu hizmetlere olan güveni de artabilir.

(Paylaşılan kitaplıkların, Web Paylaşımlı Kitaplıklar (sunu videosu) adı verilen ve gizliliği korumaya yönelik bir yöntemle etkinleştirilmesi için bir öneri vardır ancak bu öneri hâlâ değerlendirilmektedir.)

Bu davranış değişikliğinin etkisi nedir?

Genel önbellek kaçırma oranı yaklaşık %3,6, FCP'deki (First Contentful Paint) değişiklikler az (~%0,3) ve ağdan yüklenen baytların toplam oranı yaklaşık %4 artar. HTTP önbellek bölümlendirme açıklayıcısından performans üzerindeki etkisi hakkında daha fazla bilgi edinebilirsiniz.

Bu standart bir hale mi getirildi? Diğer tarayıcılar farklı mı davranıyor?

"HTTP önbellek bölümleri", getirme spesifikasyonunda standart hale getirilmiştir ancak tarayıcılar farklı şekilde davranır:

  • Chrome: Üst düzey şema://eTLD+1 ile çerçeve şeması://eTLD+1'i kullanır.
  • Safari: Üst düzey eTLD+1 kullanır
  • Firefox: Üst düzey şema://eTLD+1 ile uygulamayı planlama ve Chrome gibi ikinci bir anahtar eklemeyi değerlendirme

Çalışanlardan getirme işlemi nasıl ele alınır?

Özel çalışanlar, geçerli çerçeveleriyle aynı anahtarı kullanır. Service Worker'lar ve paylaşılan çalışanlar, birden fazla üst düzey site arasında paylaşılabilir. Bu nedenle daha karmaşıktır. Bunların çözümü şu anda tartışılıyor.

Kaynaklar