Kullanıcı Aracısı İstemci İpuçları ile kullanıcı gizliliğini ve geliştirici deneyimini iyileştirme

Kullanıcı Aracısı İstemci İpuçları, İstemci İpuçları API'sinin yeni bir genişletmesidir ve geliştiricilerin kullanıcının tarayıcısıyla ilgili bilgilere gizliliği korumaya yönelik ve ergonomik bir şekilde erişmelerini sağlar.

İstemci İpuçları, geliştiricilerin kullanıcının cihazı veya koşulları hakkında bilgileri Kullanıcı Aracısı (UA) dizesinden ayrıştırmak zorunda kalmadan etkin bir şekilde isteyebilmesini sağlar. Bu alternatif yolun sağlanması, User-Agent dizesi ayrıntı düzeyini nihayetinde azaltmanın ilk adımıdır.

Bunun yerine User-Agent İstemci İpuçları'ndan yararlanmak için User-Agent dizesini ayrıştırmaya dayanan mevcut işlevlerinizi nasıl güncelleyeceğinizi öğrenin.

Arka plan

Web tarayıcıları istek gönderdiğinde, sunucuların analizleri etkinleştirebilmesi ve yanıtı özelleştirebilmesi için tarayıcı ve ortamıyla ilgili bilgiler içerir. Bu, en başından itibaren 1996'da tanımlanmıştır (HTTP/1.0 için RFC 1945). Burada, User-Agent dizesinin orijinal tanımını bulabilirsiniz. Burada ne gösterilir?

User-Agent: CERN-LineMode/2.15 libwww/2.17b3

Bu başlık, önem sırasına göre ürünü (ör. tarayıcı veya kitaplık) ve bir yorumu (ör. sürüm) belirtmek için tasarlanmıştır.

User-Agent dizesinin durumu

Aradan geçen on yıllar boyunca bu dize, isteği yapan istemciyle ilgili çeşitli ek ayrıntılar (ve geriye dönük uyumluluk nedeniyle gereksiz bilgiler) biriktirmiştir. Chrome'un geçerli User-Agent dizesine baktığımızda şunu görebiliriz:

Mozilla/5.0 (Linux; Android 10; Pixel 3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4076.0 Mobile Safari/537.36

Yukarıdaki dize, kullanıcının işletim sistemi ve sürümü, cihaz modeli, tarayıcının markası ve tam sürümü hakkında bilgiler, tarayıcının bir mobil tarayıcı olduğu sonucuna varmak için yeterli ipucu içerir ve geçmişe dönük nedenlerle diğer tarayıcılara ilişkin birçok referanstan bahsetmez.

Bu parametrelerin, olası değerlerin çeşitliliğiyle birlikte kullanılması, User-Agent dizesinin her bir kullanıcının benzersiz şekilde tanımlanması için yeterli bilgi içerebileceği anlamına gelir. Kendi tarayıcınızı AmIUnique'de test ederseniz User-Agent dizenizin sizi ne kadar yakından tanımladığını görebilirsiniz. Sonuçta elde ettiğiniz "Benzerlik Oranı" ne kadar düşük olursa istekleriniz ne kadar benzersiz olursa sunucuların sizi gizlice takip etmesi de o kadar kolay olur.

User-Agent dizesi, birçok geçerli kullanım alanına olanak tanır ve geliştiriciler ile site sahipleri için önemli bir amaca hizmet eder. Ancak, kullanıcıların gizliliğinin gizli izleme yöntemlerine karşı korunması da son derece önemlidir ve varsayılan olarak UA bilgilerinin gönderilmesi bu hedefe aykırıdır.

User-Agent dizesi söz konusu olduğunda, web uyumluluğunun da iyileştirilmesi gerekir. Yapılandırılmamış olduğundan, ayrıştırması gereksiz karmaşıklığa yol açar. Bu da genellikle kullanıcılara zarar veren hataların ve site uyumluluğu sorunlarının nedenidir. Bu sorunlar, daha az kullanılan tarayıcıların kullanıcılarına orantısız bir şekilde zarar verir, çünkü siteler yapılandırmalarına karşı testlerde başarısız olabilir.

Yeni Kullanıcı Aracısı İstemci İpuçları tanıtımı

Kullanıcı Aracısı İstemci İpuçları aynı bilgilere erişimi daha fazla gizliliği koruyacak şekilde etkinleştirir. Böylece tarayıcılar, User-Agent dizesinin her şeyi varsayılan yayınlama ayarını nihayetinde azaltabilir. İstemci İpuçları, sunucunun tarayıcıdan istemciyle ilgili bir veri kümesi (ipuçları) istemesi ve tarayıcının hangi verilerin döndürüleceğini belirlemek için kendi politikalarını veya kullanıcı yapılandırmasını uyguladığı bir modeli zorunlu kılar. Diğer bir deyişle, varsayılan olarak tüm User-Agent bilgilerini göstermek yerine, erişim açık ve denetlenebilir bir şekilde yönetilmektedir. Geliştiriciler, artık düzenli ifadelere gerek kalmayacak şekilde, daha basit bir API'dan da yararlanıyor!

Mevcut İstemci İpuçları grubu öncelikli olarak tarayıcının görüntüleme ve bağlantı özelliklerini açıklar. İstemci İpuçlarıyla Kaynak Seçimini Otomatikleştirme başlıklı makalede ayrıntılı bilgi bulabilirsiniz. Ancak süreçle ilgili bilgilerinizi tazelemek isteriz.

Sunucu, bir başlık aracılığıyla belirli İstemci İpuçlarını ister:

⬇️ Sunucudan gelen yanıt

Accept-CH: Viewport-Width, Width

Veya bir meta etiket:

<meta http-equiv="Accept-CH" content="Viewport-Width, Width" />

Ardından tarayıcı sonraki isteklerde aşağıdaki üstbilgileri geri göndermeyi seçebilir:

⬆️ Sonraki istek

Viewport-Width: 460
Width: 230

Sunucu, örneğin resimleri uygun çözünürlükte sunarak yanıtlarını çeşitlendirmeyi seçebilir.

Kullanıcı Aracısı İstemci İpuçları, Accept-CH sunucu yanıtı başlığı aracılığıyla belirtilebilen Sec-CH-UA önekiyle özellik aralığını genişletir. Tüm ayrıntılar için açıklayıcı ile başlayın ve daha sonra tam teklif konusuna bakın.

Chromium 89'dan Kullanıcı Aracısı İstemci İpuçları

Kullanıcı Aracısı İstemci İpuçları, sürüm 89'dan beri Chrome'da varsayılan olarak etkindir.

Varsayılan olarak tarayıcı; tarayıcı markasını, önemli sürümü / ana sürümü, platformu ve istemcinin mobil cihaz olup olmadığını belirten bir göstergeyi döndürür:

⬆️ Tüm istekler

Sec-CH-UA: "Chromium";v="93", "Google Chrome";v="93", " Not;A Brand";v="99"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "macOS"

Kullanıcı Aracısı yanıtı ve istek üstbilgileri

⬇️ Yanıt Accept-CH
⬆️ İstek başlığı
⬆️ İstek
Örnek değer
Açıklama
Sec-CH-UA "Chromium";v="84",
"Google Chrome";v="84"
Tarayıcı markalarının ve önemli sürümlerinin listesi.
Sec-CH-UA-Mobile ?1 Tarayıcının bir mobil cihazda olup olmadığını gösteren boole değeri (doğru için ?1) (yanlış için ?0).
Sec-CH-UA-Full-Version "84.0.4143.2" [Kullanımdan kaldırıldı]Tarayıcının tam sürümü.
Sec-CH-UA-Full-Version-List "Chromium";v="84.0.4143.2",
"Google Chrome";v="84.0.4143.2"
Tarayıcı markalarının listesi ve tam sürümleri.
Sec-CH-UA-Platform "Android" Cihazın platformu, genellikle işletim sistemi (OS).
Sec-CH-UA-Platform-Version "10" Platform veya işletim sisteminin sürümü.
Sec-CH-UA-Arch "arm" Cihazın temel mimarisi. Bu, sayfanın görüntülenmesiyle ilgili olmayabilir, ancak site varsayılan olarak doğru biçime sahip bir indirme sunmak isteyebilir.
Sec-CH-UA-Model "Pixel 3" Cihazın modeli.
Sec-CH-UA-Bitness "64" Temel mimarinin bit hızı (ör. bir tam sayı veya bellek adresi bit cinsinden boyutu)

Örnek exchange

Örnek bir exchange'in görünümü aşağıdaki gibi olacaktır:

⬆️ Tarayıcıdan ilk istek
Tarayıcı, siteden /downloads sayfasını ister ve varsayılan temel User-Agent'ı gönderir.

GET /downloads HTTP/1.1
Host: example.site

Sec-CH-UA: "Chromium";v="93", "Google Chrome";v="93", " Not;A Brand";v="99"
Sec-CH-UA-Mobile: ?1
Sec-CH-UA-Platform: "Android"

⬇️ Sunucudan yanıt
Sunucu sayfayı geri göndererek ek olarak tam tarayıcı sürümünü ve platformu ister.

HTTP/1.1 200 OK
Accept-CH: Sec-CH-UA-Full-Version-List

⬆️ Sonraki istekler
Tarayıcı, sunucuya ek bilgilere erişim izni verir ve ek ipuçlarını sonraki tüm isteklerde geri gönderir.

GET /downloads/app1 HTTP/1.1
Host: example.site

Sec-CH-UA: " Not A;Brand";v="99", "Chromium";v="98", "Google Chrome";v="98"
Sec-CH-UA-Mobile: ?1
Sec-CH-UA-Full-Version-List: " Not A;Brand";v="99.0.0.0", "Chromium";v="98.0.4738.0", "Google Chrome";v="98.0.4738.0"
Sec-CH-UA-Platform: "Android"

JavaScript API

Üstbilgilerin yanı sıra User-Agent'a JavaScript ile navigator.userAgentData aracılığıyla da erişilebilir. Varsayılan Sec-CH-UA, Sec-CH-UA-Mobile ve Sec-CH-UA-Platform üst bilgi bilgilerine sırasıyla brands ve mobile özellikleri aracılığıyla erişilebilir:

// Log the brand data
console.log(navigator.userAgentData.brands);

// output
[
  {
    brand: 'Chromium',
    version: '93',
  },
  {
    brand: 'Google Chrome',
    version: '93',
  },
  {
    brand: ' Not;A Brand',
    version: '99',
  },
];

// Log the mobile indicator
console.log(navigator.userAgentData.mobile);

// output
false;

// Log the platform value
console.log(navigator.userAgentData.platform);

// output
"macOS";

Ek değerlere getHighEntropyValues() çağrısıyla erişilebilir. "Yüksek entropi" terimi, bilgi entropisi, başka bir deyişle bu değerlerin, kullanıcının tarayıcısı hakkında gösterdiği bilgi miktarı anlamına gelir. Ek başlıkları istemede olduğu gibi, varsa hangi değerlerin döndürüleceği tarayıcıya bağlıdır.

// Log the full user-agent data
navigator
  .userAgentData.getHighEntropyValues(
    ["architecture", "model", "bitness", "platformVersion",
     "fullVersionList"])
  .then(ua => { console.log(ua) });

// output
{
   "architecture":"x86",
   "bitness":"64",
   "brands":[
      {
         "brand":" Not A;Brand",
         "version":"99"
      },
      {
         "brand":"Chromium",
         "version":"98"
      },
      {
         "brand":"Google Chrome",
         "version":"98"
      }
   ],
   "fullVersionList":[
      {
         "brand":" Not A;Brand",
         "version":"99.0.0.0"
      },
      {
         "brand":"Chromium",
         "version":"98.0.4738.0"
      },
      {
         "brand":"Google Chrome",
         "version":"98.0.4738.0"
      }
   ],
   "mobile":false,
   "model":"",
   "platformVersion":"12.0.1"
}

Demografi

Hem üstbilgileri hem de JavaScript API'sini kendi cihazınızda user-agent-client-hints.glitch.me adresinden deneyebilirsiniz.

İpucu ömrü ve sıfırlama

Accept-CH başlığıyla belirtilen ipuçları, tarayıcı oturumu süresince veya farklı bir ipucu grubu belirtilene kadar gönderilir.

Bu, sunucu şunları gönderirse anlamına gelir:

⬇️ Yanıt

Accept-CH: Sec-CH-UA-Full-Version-List

Daha sonra tarayıcı, kapatılana kadar bu siteye ilişkin tüm isteklerde Sec-CH-UA-Full-Version-List üst bilgisini gönderir.

⬆️ Sonraki istekler

Sec-CH-UA-Full-Version-List: " Not A;Brand";v="99.0.0.0", "Chromium";v="98.0.4738.0", "Google Chrome";v="98.0.4738.0"

Ancak, başka bir Accept-CH üst bilgisi alınırsa bu durum, tarayıcının gönderdiği mevcut ipuçlarının tamamen yerini alır.

⬇️ Yanıt

Accept-CH: Sec-CH-UA-Bitness

⬆️ Sonraki istekler

Sec-CH-UA-Platform: "64"

Daha önce gönderilen Sec-CH-UA-Full-Version-List gönderilmeyecek.

Accept-CH üstbilgisini, söz konusu sayfa için istenen ipuçlarının tamamını belirtir, yani tarayıcı daha sonra söz konusu sayfadaki tüm alt kaynaklar için belirtilen ipuçlarını gönderir. İpuçları bir sonraki gezinmeye kadar kullanılmaya devam eder, ancak site bunların yayınlanacağına güvenmemeli veya bunu varsaymamalıdır.

Bunu, yanıtta boş bir Accept-CH göndererek tarayıcı tarafından gönderilen tüm ipuçlarını etkili bir şekilde temizlemek için de kullanabilirsiniz. Kullanıcının tercihlerini sıfırladığı veya sitenizden çıkış yaptığı herhangi bir yere bunu eklemeyi düşünün.

Bu kalıp, ipuçlarının <meta http-equiv="Accept-CH" …> etiketi aracılığıyla çalışma şekliyle de eşleşir. İstenen ipuçları sonraki gezinmelerde değil, yalnızca sayfa tarafından başlatılan isteklerde gönderilir.

İpucu kapsamı ve kaynaklar arası istekler

Varsayılan olarak, İstemci İpuçları yalnızca aynı kaynak isteklerinde gönderilir. Yani https://example.com ile ilgili belirli ipuçları talep ederseniz ancak optimize etmek istediğiniz kaynaklar https://downloads.example.com üzerindeyse herhangi bir ipucu almayacaktır.

Kaynaklar arası isteklerde ipuçlarına izin vermek için her ipucu ve kaynak bir Permissions-Policy başlığı tarafından belirtilmelidir. Bunu bir Kullanıcı Aracısı İstemci İpucu'na uygulamak için ipucunu küçük harfle yazmanız ve sec- önekini kaldırmanız gerekir. Örneğin:

⬇️ example.com adlı kullanıcının yanıtı

Accept-CH: Sec-CH-UA-Platform-Version, DPR
Permissions-Policy: ch-ua-platform-version=(self "downloads.example.com"),
                    ch-dpr=(self "cdn.provider" "img.example.com");

⬆️ downloads.example.com isteği için istek

Sec-CH-UA-Platform-Version: "10"

⬆️ cdn.provider veya img.example.com için yapılan istekler

DPR: 2

Kullanıcı Aracısı İstemci İpuçları nerede kullanılır?

Bunun yerine, User-Agent başlığını ayrıştırıdığınız veya aynı bilgilere erişen JavaScript çağrılarından herhangi birini (ör. navigator.userAgent, navigator.appVersion ya da navigator.platform) kullandığınız tüm örnekleri, Kullanıcı Aracısı İstemci İpuçlarından yararlanacak şekilde yeniden düzenlemeniz gerekir.

Bunu bir adım öteye taşıyarak, Kullanıcı Aracısı bilgilerini kullanımınızı yeniden incelemeli ve mümkün olan durumlarda bu bilgileri başka yöntemlerle değiştirmelisiniz. Genellikle progresif geliştirme, özellik algılama veya duyarlı tasarımdan yararlanarak aynı hedefe ulaşabilirsiniz. User-Agent verilerini kullanmanın temel sorunu, incelediğiniz mülk ile bu mülkün etkinleştirdiği davranış arasındaki eşlemenin her zaman sürdürülüyor olmasıdır. Algılamanızın kapsamlı ve güncel kalmasını sağlamak için bakım gerektiren bir ek yük gerekir.

Bu uyarılar göz önünde bulundurularak, Kullanıcı Aracısı İstemci İpuçları deposunda siteler için bazı geçerli kullanım alanları listelenir.

User-Agent dizesine ne olur?

Plan, mevcut sitelerde gereksiz kesintilere neden olmayacak şekilde mevcut Kullanıcı Aracısı dizesinin açığa çıkardığı tanımlayıcı bilgi miktarını azaltarak web'de gizli izleme olanağını en aza indirmektir. Kullanıcı Aracısı İstemci İpuçları'nın kullanıma sunulması, artık Kullanıcı Aracısı dizelerinde herhangi bir değişiklik yapılmadan önce yeni özelliği anlama ve deneme fırsatı sunuyor.

Nihayetinde User-Agent dizesindeki bilgiler azaltılarak eski biçimi koruyacak ve yalnızca varsayılan ipuçlarıyla aynı üst düzey tarayıcı ve önemli sürüm bilgilerini sağlayacaktır. Chromium'da bu değişiklik, ekosistemin yeni Kullanıcı Aracısı İstemci İpuçları özelliklerini değerlendirmesi için ek süre sağlamak amacıyla en az 2022'ye ertelenmiştir.

Bunun bir sürümünü, Chrome 93'ten about://flags/#reduce-user-agent işaretini etkinleştirerek test edebilirsiniz (Not: Bu bayrak, Chrome 84 - 92 sürümlerinde about://flags/#freeze-user-agent olarak adlandırılmıştır). Bu, uyumluluk nedeniyle geçmiş girişleri içeren, ancak belirli özelliklere sahip bir dize döndürür. Örneğin:

Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Mobile Safari/537.36

Unsplash'teki Sergey Zolkin'in küçük resmi