Önbellekleme ve Güvenliği Ayıklamak İçin HTTP Yanıt Başlıklarını Okumak
Yanıt başlıkları, bir CDN'in sayfanızı önbelleğe alıp almadığını, bir tarayıcının onu ne kadar tutacağını ve hangi güvenlik politikalarının yürürlükte olduğunu söyler. İşte önemli olanları nasıl okuyacağınız.
Adım adım
- 1
Bir URL için başlıkları alın
Tam URL'yi HTTP Başlık Denetleyici aracına yapıştırın; bir istek gönderir ve sunucunun geri gönderdiği ham yanıt başlıklarını gösterir. Bir kullanıcının vurduğu tam URL'yi, yolu ve varsa sorgu dizesini içerecek şekilde test edin çünkü önbellekleme ve yönlendirmeler yola göre değişebilir. Bir önbellekleme sorununu kovalıyorsanız aynı URL'yi iki kez isteyin ve karşılaştırın; ilginç alanlar genelde bir CDN önbelleğini doldurduktan sonra yalnızca ikinci vuruşta gerçek değerlerine oturur.
- 2
Durum satırıyla başlayın
İlk satır durum kodudur ve altındaki her şeyi çerçeveler. Bir 200 normal bir isabettir. Bir 301 ya da 302 yönlendirildiğiniz anlamına gelir ve Location başlığı size nereye olduğunu söyler; o zinciri izleyin çünkü beklediğiniz bir başlık yazdığınız URL'de değil son URL'de olabilir. Bir 304 Not Modified bir önbellekleme başarısıdır, sunucunun istemcinin önbellekteki kopyasının hâlâ taze olduğunu doğrulamasıdır. Bir 5xx kaynağın başarısız olduğu anlamına gelir ve üzerindeki herhangi bir önbellek başlığı, o hatanın kendisinin ne kadar önbelleğe alınabileceğini tarif eder ki bu tatsız bir sürpriz olabilir.
- 3
Cache-Control, ETag ve Age'i birlikte okuyun
Cache-Control birincil önbellekleme talimatıdır. max-age=3600 bir saat taze demektir; no-store asla önbelleğe alma demektir; private tarayıcıların önbelleğe alabileceği ama paylaşılan CDN'lerin alamayacağı anlamına gelir; s-maxage ise özellikle CDN'ler için max-age'i geçersiz kılar. ETag, istemcinin bir şeyin değişip değişmediğini sormak için If-None-Match'te geri gönderdiği bir içerik parmak izidir ve o verimli 304 yanıtlarını mümkün kılar. Age, bir nesnenin bir önbellekte kaç saniyedir oturduğunu söyler, dolayısıyla büyük ve artan bir Age, CDN'in her seferinde kaynaktan getirmek yerine saklanmış bir kopya sunduğunu kanıtlar.
- 4
CDN HIT veya MISS işaretini bulun
Çoğu CDN önbellek kararını bir başlığa damgalar, ancak ad değişir: x-cache: HIT, cf-cache-status: HIT, x-served-by ya da bir via başlığıyla birleşmiş age. HIT, uç noktanın nesneyi kaynağınıza dokunmadan önbellekten sunduğu anlamına gelir; MISS, bu istek için kaynağa geri gittiği, genelde önbelleğin soğuk olduğu ya da nesnenin süresinin dolduğu anlamına gelir. Önbelleklemeyi bekliyordunuz ama her istek MISS bildiriyorsa, kaynak yanıtındaki Cache-Control'e yukarı bakın; bir no-store ya da eksik bir max-age, CDN'e hiçbir şey saklamamasını söyler.
- 5
Content-Type ve Content-Encoding'i kontrol edin
Content-Type, gövdenin gerçekte ne olduğunu, karakter kümesi dahil, text/html; charset=utf-8 ya da application/json gibi bildirir. Yanlış bir tür gerçek hatalara yol açar: text/plain olarak yanlış etiketlenmiş bir JSON API'si bir istemci ayrıştırıcısını bozabilir ve bir bozuk karakter sayfası neredeyse her zaman buradaki bir karakter kümesi uyumsuzluğudur. Content-Encoding sıkıştırmayı gösterir, genelde gzip ya da Brotli için br. Büyük bir metin varlığı Content-Encoding olmadan dönüyorsa sıkıştırma gerçekleşmiyordur ve ihtiyacınızdan çok daha fazla bayt gönderiyorsunuzdur ki bu yalnızca başlıklardan yakalanabilecek kolay bir performans kazancıdır.
- 6
Güvenlik başlıklarını denetleyin
Birkaç başlık yanıtı sertleştirir. Strict-Transport-Security, tarayıcılara belirli bir max-age boyunca yalnızca HTTPS kullanmalarını söyler ve bu, düşürme saldırılarını kapatır; saniye değerini ve includeSubDomains'in bulunup bulunmadığını kontrol edin. Content-Security-Policy, betiklerin, stillerin ve çerçevelerin nereden yüklenebileceğini kısıtlar ve enjekte edilmiş betiğe karşı en güçlü savunmadır. X-Content-Type-Options: nosniff, tarayıcının bir MIME türünü tahmin edip bir dosyayı yanlış çalıştırmasını durdurur. Bunların yokluğu sunucunun bildirdiği bir hata değildir; bunu yalnızca başlıkları okuyup satırın eksik olduğunu bularak fark edersiniz.
- 7
Server ve yönlendirme Location'ını not edin
Server başlığı yanıt veren yazılımı adlandırır, nginx ya da cloudflare gibi, ve hangi katmanın yanıt verdiğini, bir uç düğüm mü yoksa kaynağınız mı, doğrulamanın hızlı bir yoludur. Bir yönlendirmede Location başlığı hedef URL'yi taşır; yaygın bir tuzak, Location'ın tekrar yönlendiren bir URL'ye geri işaret ettiği bir yönlendirme döngüsüdür. Bunlar taşıma düzeyi ayrıntıları olduğundan başlık okumasını bir TLS / SSL Denetleyici aracıyla, bir yönlendirme HTTP ve HTTPS arasında zıplarken eşleştirin ki son uç noktadaki sertifikayı da görebilesiniz.
Örnek bir başlık dökümü
İşte bir CDN üzerinden sunulan bir sayfadan kırpılmış bir yanıt. Yukarıdan aşağıya okuyun: bir 200 durumu, uç noktanın saklanmış bayt sunduğunu kanıtlayan sıfırdan farklı bir Age ile bir önbellek HIT'i, Brotli sıkıştırması ve tümü mevcut çekirdek güvenlik başlıkları.
HTTP/2 200
content-type: text/html; charset=utf-8
content-encoding: br
cache-control: public, max-age=3600, s-maxage=86400
age: 512
etag: "a1b2c3d4e5"
cf-cache-status: HIT
strict-transport-security: max-age=63072000; includeSubDomains; preload
content-security-policy: default-src 'self'; script-src 'self'
x-content-type-options: nosniff
server: cloudflareBir önbellekleme sorunu için hızlı kontroller
- Kaynaktaki Cache-Control izin verici mi? Bir no-store ya da private herhangi bir paylaşılan önbelleği anında durdurur.
- Önbellek durumu başlığı ikinci istekte HIT diyor mu? Kalıcı bir MISS, CDN'in nesneyi saklamayı reddettiği anlamına gelir.
- Age istekler boyunca artıyor mu? Artan bir Age, uç noktanın yeniden getirmek yerine kopyayı tuttuğunu doğrular.
- Bir Set-Cookie var mı? Birçok CDN çerez ayarlayan yanıtları önbelleğe almayı reddeder ki bu sessizce önbeklemeyi devre dışı bırakır.
Cache-Control ve cache-control aynı başlıktır ve HTTP/2 her alan adını hat üzerinde küçük harfe çevirir, dolayısıyla büyük-küçük harften anlam çıkarmayın. Değerler ise başka bir hikayedir: no-cache gibi bir yönerge no-store ile aynı değildir ve bir Content-Security-Policy'deki bir belirteç yazım hatası o kuralı sessizce düşürür. Değerleri tam olarak okuyun.