HTTP Sıkıştırma (Gzip, Brotli) Nedir?
Kısa tanım
HTTP sıkıştırma, sunucunun HTML, CSS, JavaScript ve JSON gibi metin tabanlı yanıtları göndermeden önce gzip, Brotli veya Zstandard (zstd) gibi kayıpsız bir algoritmayla küçültmesi, tarayıcının da bunları açmasıdır. Tarayıcı desteklediği yöntemleri Accept-Encoding başlığıyla bildirir, sunucu seçtiği yöntemi Content-Encoding başlığıyla belirtir. Metin dosyalarının aktarılan boyutunu çoğu zaman yarıdan fazla azaltır.
Diğer adları: gzip, Brotli, zstd, Zstandard, Content-Encoding, metin sıkıştırma

Accept-Encoding ve Content-Encoding pazarlığı
Sıkıştırma, tarayıcı ile sunucu arasında küçük bir pazarlıkla başlar. Tarayıcı her istekte hangi yöntemleri açabildiğini Accept-Encoding başlığıyla bildirir; sunucu bunlardan birini seçer, yanıt gövdesini o yöntemle sıkıştırır ve seçimini Content-Encoding başlığında belirtir:
GET /assets/app.js HTTP/1.1
Host: example.com
Accept-Encoding: gzip, deflate, br, zstd
HTTP/1.1 200 OK
Content-Type: text/javascript
Content-Encoding: br
Vary: Accept-EncodingVary: Accept-Encoding satırı önemlidir: aradaki CDN ve önbelleklere aynı adresin farklı sıkıştırılmış sürümleri olduğunu söyler. Bu satır eksikse bir önbellek, Brotli açamayan bir istemciye Brotli ile sıkıştırılmış yanıtı verebilir. Sunucu, tarayıcının listelemediği bir yöntemi seçmemelidir; ortak bir yöntem yoksa yanıt sıkıştırılmadan gönderilir.
gzip, Brotli ve zstd
| gzip | Brotli (br) | Zstandard (zstd) | |
|---|---|---|---|
| Tanım | RFC 1952 | RFC 7932 | RFC 8878 |
| Tarayıcı desteği | Evrensel | Tüm güncel tarayıcılar | Chrome ve Edge 123, Firefox 126, Safari 26.3 ve sonrası |
| Güçlü yanı | Her yerde çalışır, hızlıdır | Metin dosyalarında gzip'ten daha iyi oran; web metni için yerleşik sözlük | Yüksek sıkıştırma hızında iyi oran |
| Dikkat edilecek nokta | Oranı diğerlerinden düşük | En yüksek seviyeleri yavaş; dinamik yanıtta orta seviye tercih edilir | Eski tarayıcılar için gzip veya Brotli yedeği gerekir |
Tarayıcı desteği bilgisi MDN'nin Content-Encoding sayfasındaki uyumluluk verisine dayanır. Pratikte bugün çoğu site Brotli'yi tercih edip gzip'i yedek olarak tutar; zstd ise özellikle anlık üretilen yanıtlarda sunucu CPU'sunu yormadan iyi oran verdiği için giderek daha sık görülür. Chrome ayrıca dcb ve dcz değerleriyle, örneğin bir dosyanın önceden indirilmiş sürümünü sözlük olarak kullanan sıkıştırmayı (Compression Dictionary Transport) destekler; bu yöntem henüz tüm tarayıcılarda yoktur.
Statik ve dinamik sıkıştırma
Statik sıkıştırmada CSS ve JavaScript dosyaları derleme sırasında en yüksek seviyede bir kez sıkıştırılır ve diske .br ile .gz uzantılı kopyalar olarak yazılır; sunucu her istekte hazır dosyayı gönderir. Sıkıştırma süresi önemli olmadığı için en iyi oran alınır. Dinamik sıkıştırmada ise HTML ya da API yanıtı her istekte üretildiği için anında sıkıştırılır; burada çok yüksek seviyeler, kazandırdığı birkaç kilobayttan fazlasını CPU süresi olarak geri alabilir.
Örnek bir Nginx yapılandırması (Nginx'in çekirdeği gzip içerir; Brotli için ayrı bir modül gerekir):
gzip on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_types text/css application/javascript application/json image/svg+xml;
gzip_vary on;
gzip_static on; # varsa önceden sıkıştırılmış .gz dosyasını kullanSıkıştırma, küçültme (minification) işleminin yerine geçmez; ikisi birlikte çalışır. Küçültme boşlukları ve yorumları kaldırır, sıkıştırma ise kalan tekrarları kodlar.
Neyi sıkıştırmamalı?
- Zaten sıkıştırılmış biçimler: JPEG, PNG, WebP, AVIF, video, ses ve WOFF2 fontları ikinci kez sıkıştırmadan kazanç sağlamaz; bazen boyut büyür ve CPU boşa harcanır. Bu dosyalarda kazanç görsel optimizasyonu ile elde edilir. SVG ise metin olduğu için sıkıştırılmalıdır.
- Çok küçük yanıtlar: Birkaç yüz baytlık bir yanıtta başlık ve algoritma ek yükü kazancı aşabilir; yukarıdaki
gzip_min_lengthbu yüzden vardır. - Gizli bilgi ile kullanıcı girdisinin bir arada yansıtıldığı yanıtlar: BREACH olarak bilinen saldırı sınıfı, HTTPS üzerinden bile, sıkıştırılmış yanıtın boyut değişimlerinden sayfadaki gizli bir değeri (ör. CSRF jetonu) çıkarmaya dayanır. Önlem olarak bu tür jetonlar her yanıtta maskelenir veya bu yanıtlar sıkıştırılmaz.
Çalışıp çalışmadığını kontrol etmek
Tarayıcının geliştirici araçlarında Network sekmesinde yanıt başlıklarında Content-Encoding değerine bakabilir, aktarılan boyutu dosyanın gerçek boyutuyla karşılaştırabilirsiniz. Komut satırından:
curl -s -o /dev/null -D - -H "Accept-Encoding: br, gzip" https://example.com/ | grep -i content-encodingHiç satır dönmüyorsa yanıt sıkıştırılmamıştır. Sık görülen sebepler: sunucuda sıkıştırmanın yalnızca text/html için açık olması, CDN'in kaynak sunucudan gelen sıkıştırmayı kaldırması ya da uygulama katmanının yanıtı zaten akış (stream) halinde gönderip sıkıştırma katmanını atlaması. Ana HTML belgesinin sıkıştırılıp sıkıştırılmadığını SEO Analiz Aracı da kontrol eder.

