Sitenizi kullanıcı aracısı dizesinden yeni User-Agent İstemci İpuçları'na taşıma stratejileri.
Kullanıcı aracısı dizesi, tarayıcılarda önemli bir pasif dijital parmak izi oluşturur ve işlenmesi zordur. Bununla birlikte, kullanıcı aracısı verilerini toplamak ve işlemek için her türlü geçerli neden vardır. Bu nedenle, daha iyi bir çözüme giden yol olması gerekir. Kullanıcı Aracısı İstemci İpuçları, kullanıcı aracısı verilerine ihtiyacınızı beyan etmek ve bu verileri kullanımı kolay bir biçimde döndürmek için yöntemler sunar.
Bu makale, kullanıcı aracısı verilerine erişiminizi denetleme ve kullanıcı aracısı dizesi kullanımını Kullanıcı Aracısı İstemci İpuçları'na taşıma konusunda size yol gösterecektir.
Kullanıcı aracısı verilerinin toplanmasını ve kullanılmasını denetleyin
Tüm veri toplama biçimlerinde olduğu gibi, bu verileri neden topladığınızı her zaman anlamanız gerekir. Herhangi bir işlem yapıp yapmamanızdan bağımsız olarak ilk adım, kullanıcı aracısı verilerini nerede ve neden kullandığınızı anlamaktır.
Kullanıcı aracısı verilerinin kullanılıp kullanılmadığını veya nerede kullanıldığını bilmiyorsanız, navigator.userAgent
kullanımı için ön uç kodunuzda, User-Agent
HTTP üst bilgisi kullanımı için arka uç kodunuzda arama yapabilirsiniz. Ayrıca navigator.platform
ve navigator.appVersion
gibi kullanımdan kaldırılmış özelliklerin kullanımı için kullanıcı arabirimi kodunuzu da kontrol etmelisiniz.
İşlevsel bir açıdan, kodunuzda kaydettiğiniz veya işlediğiniz herhangi bir yeri düşünün:
- Tarayıcı adı veya sürümü
- İşletim sisteminin adı veya sürümü
- Cihaz markası veya modeli
- CPU türü, mimarisi veya bit hızı (örneğin, 64 bit)
Kullanıcı aracısını işlemek için bir üçüncü taraf kitaplığı veya hizmeti kullanıyor da olabilirsiniz. Bu durumda, bunların Kullanıcı Aracısı İstemci İpuçları'nı destekleyecek şekilde güncellenip güncellenmediğini kontrol edin.
Yalnızca temel kullanıcı aracısı verilerini mi kullanıyorsunuz?
Kullanıcı Aracısı İstemci İpuçları'nın varsayılan grubu şunları içerir:
Sec-CH-UA
: tarayıcı adı ve ana/anlamlı sürümSec-CH-UA-Mobile
: Bir mobil cihazı gösteren boole değeriSec-CH-UA-Platform
: işletim sisteminin adı- Bu özelliğin spesifikasyonda güncellendiğini, kısa süre içinde Chrome ve diğer Chromium tabanlı tarayıcılara yansıtılacağını unutmayın.
Önerilen kullanıcı aracısı dizesinin kısaltılmış sürümü, bu temel bilgileri de geriye dönük olarak uyumlu bir şekilde korur. Örneğin, dizede Chrome/90.0.4430.85
yerine Chrome/90.0.0.0
bulunur.
Kullanıcı aracısı dizesini yalnızca tarayıcı adı, ana sürüm veya işletim sistemi için kontrol ediyorsanız kullanımdan kaldırma uyarıları görme olasılığınız yüksek olsa da kodunuz çalışmaya devam eder.
Kullanıcı Aracısı İstemci İpuçları'na geçiş yapabilirsiniz ve geçiş yapmanız gerekir ancak bunu engelleyen eski kodunuz veya kaynak kısıtlamalarınız olabilir. Kullanıcı aracısı dizesindeki bilgilerin geriye dönük olarak uyumlu bir şekilde azaltılması, mevcut kodun daha az ayrıntılı bilgi alması ve temel işlevselliği sürdürmesi için tasarlanmıştır.
Strateji: İsteğe bağlı istemci tarafı JavaScript API'si
Şu anda navigator.userAgent
kullanıyorsanız kullanıcı aracısı dizesini ayrıştırmaya geri dönmeden önce navigator.userAgentData
seçeneğini tercih etmeye geçmeniz gerekir.
if (navigator.userAgentData) {
// use new hints
} else {
// fall back to user-agent string parsing
}
Mobil veya masaüstü için kontrol ediyorsanız mobile
boole değerini kullanın:
const isMobile = navigator.userAgentData.mobile;
userAgentData.brands
, tarayıcının bu markalarla uyumluluğunu listeleyebildiği brand
ve version
özelliklerine sahip bir nesne dizisidir. Buna doğrudan bir dizi olarak erişebilir veya belirli bir girişin mevcut olup olmadığını kontrol etmek için bir some()
çağrısı kullanmak isteyebilirsiniz:
function isCompatible(item) {
// In real life you most likely have more complex rules here
return ['Chromium', 'Google Chrome', 'NewBrowser'].includes(item.brand);
}
if (navigator.userAgentData.brands.some(isCompatible)) {
// browser reports as compatible
}
Daha ayrıntılı, yüksek entropili kullanıcı aracısı değerlerinden birine ihtiyacınız varsa bunu belirtmeniz ve döndürülen Promise
öğesinde sonucu kontrol etmeniz gerekir:
navigator.userAgentData.getHighEntropyValues(['model'])
.then(ua => {
// requested hints available as attributes
const model = ua.model
});
Sunucu tarafı işlemeden istemci taraflı işlemeye geçmek isterseniz de bu stratejiyi kullanmak isteyebilirsiniz. JavaScript API, HTTP istek başlıklarına erişim gerektirmediğinden kullanıcı aracısı değerleri herhangi bir noktada istenebilir.
Strateji: Statik sunucu tarafı üstbilgi
Sunucuda User-Agent
istek başlığını kullanıyorsanız ve bu verilere yönelik ihtiyaçlarınız siteniz genelinde nispeten tutarlıysa, istediğiniz istemci ipuçlarını yanıtlarınızda statik bir küme olarak belirtebilirsiniz. Genellikle bunu tek bir yerde yapılandırmanız gerektiğinden, bu nispeten basit bir yaklaşımdır. Örneğin, zaten başlıkları, barındırma yapılandırmanızı veya siteniz için kullandığınız çerçevenin ya da platformun üst düzey yapılandırmasını eklediyseniz web sunucusu yapılandırmanızda olabilir.
Kullanıcı aracısı verilerine göre sunulan yanıtları dönüştürüyor veya özelleştiriyorsanız bu stratejiyi göz önünde bulundurun.
Tarayıcılar veya diğer istemciler, farklı varsayılan ipuçları sağlamayı seçebilir. Bu nedenle, genellikle varsayılan olarak sağlansa bile ihtiyacınız olan her şeyi belirtmek iyi bir uygulamadır.
Örneğin, Chrome'un mevcut varsayılanları şu şekilde gösterilir:
⬇️ Yanıt başlıkları
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA
Yanıtlarda cihaz modelini de almak isterseniz şunu göndermeniz gerekir:
⬇️ Yanıt başlıkları
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA
Bunu sunucu tarafında işlerken, ilk olarak istenen Sec-CH-UA
başlığının gönderilip gönderilmediğini kontrol etmeniz ve ardından kullanılabilir olmadığı durumlarda User-Agent
üst bilgi ayrıştırmasına geri dönmeniz gerekir.
Strateji: Kaynaklar arası isteklere ipuçları için yetki verme
Kendi isteklerinde Kullanıcı Aracısı İstemci İpuçlarının gönderilmesini gerektiren kaynaklar arası veya siteler arası alt kaynaklar istiyorsanız bir İzin Politikası kullanarak istenen ipuçlarını açıkça belirtmeniz gerekir.
Örneğin, https://blog.site
hizmetinin https://cdn.site
üzerinde belirli bir cihaz için optimize edilmiş kaynaklar döndürebilen kaynaklar barındırdığını varsayalım.
https://blog.site
, Sec-CH-UA-Model
ipucunu isteyebilir, ancak Permissions-Policy
üst bilgisini kullanarak https://cdn.site
öğesine açıkça yetki vermesi gerekir. Politika kontrollü ipuçlarının listesine İstemci İpuçları Altyapı taslağı bölümünden ulaşabilirsiniz.
⬇️ İpucu için yetki veren blog.site
adlı kullanıcının yanıtı
Accept-CH: Sec-CH-UA-Model
Permissions-Policy: ch-ua-model=(self "https://cdn.site")
⬆️ cdn.site
üzerindeki alt kaynaklara yapılan isteklerde yetki verilmiş ipucu bulunur
Sec-CH-UA-Model: "Pixel 5"
Yalnızca ch-ua
aralığı için değil, birden çok kaynak için birden fazla ipucu belirtebilirsiniz:
⬇️ blog.site
tarafından birden fazla kaynağa birden fazla ipucu için yetki veren yanıt
Accept-CH: Sec-CH-UA-Model, DPR
Permissions-Policy: ch-ua-model=(self "https://cdn.site"),
ch-dpr=(self "https://cdn.site" "https://img.site")
Strateji: İpuçları için iframe'lere yetki verme
Kaynaklar arası iframe'ler, kaynaklar arası kaynaklara benzer şekilde çalışır ancak allow
özelliğinde yetkilendirmek istediğiniz ipuçlarını belirtirsiniz.
⬇️ blog.site
adlı kullanıcının yanıtı
Accept-CH: Sec-CH-UA-Model
↪️ blog.site
için HTML
<iframe src="https://widget.site" allow="ch-ua-model"></iframe>
⬆️ widget.site
isteği
Sec-CH-UA-Model: "Pixel 5"
iframe'deki allow
özelliği, widget.site
tarafından gönderilen tüm Accept-CH
üst bilgilerini geçersiz kılar. Bu nedenle, iframe'e sahip sitenin ihtiyaç duyacağı her şeyi belirttiğinizden emin olun.
Strateji: Dinamik sunucu tarafı ipuçları
Kullanıcı yolculuğunun, sitenin geri kalanına göre daha fazla ipucuna ihtiyaç duyduğunuz belirli bölümleri varsa sitenin tamamında sabit olarak değil, isteğe bağlı olarak bu ipuçlarını istemeyi seçebilirsiniz. Bunun yönetilmesi daha karmaşıktır, ancak zaten her rota için farklı başlıklar ayarladıysanız bunu yapmanız makul olabilir.
Burada unutulmaması gereken önemli nokta, her bir Accept-CH
üst bilgisi örneğinin etkin bir şekilde mevcut grubun üzerine yazılacağıdır. Bu nedenle, başlığı dinamik olarak ayarlıyorsanız her sayfanın gerekli ipuçlarının tamamını istemesi gerekir.
Örneğin, sitenizde kullanıcının işletim sistemiyle eşleşen simgeler ve denetimler sağlamak istediğiniz bir bölüm olabilir. Bunun için uygun alt kaynaklar sunmak üzere Sec-CH-UA-Platform-Version
öğesini de kullanabilirsiniz.
⬇️ /blog
için yanıt başlıkları
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA
⬇️ /app
için yanıt başlıkları
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA
Strateji: İlk istekte sunucu tarafı ipuçları gerekir
İlk istekte varsayılan ipucundan daha fazlasına ihtiyaç duyduğunuz durumlar olabilir. Ancak bu durum nadiren nadiren yaşanır. Bu nedenle gerekçeleri incelediğinizden emin olun.
İlk istek, söz konusu kaynak için söz konusu göz atma oturumunda gönderilen ilk üst düzey istek anlamına gelir. Varsayılan ipucu grubu, ana sürümün yer aldığı tarayıcı adını, platformu ve mobil göstergesini içerir. Burada sormamız gereken soru şudur: İlk sayfa yüklemesinde genişletilmiş veriye ihtiyaç duyuyor musunuz?
İlk istekle ilgili ek ipuçları için iki seçenek vardır. İlk olarak, Critical-CH
üst bilgisini kullanabilirsiniz. Bu dosya Accept-CH
ile aynı biçimi alır ancak ilk istek kritik ipucu olmadan gönderilirse tarayıcıya isteği hemen yeniden denemesi gerektiğini bildirir.
⬆️ İlk istek
[With default headers]
⬇️ Yanıt başlıkları
Accept-CH: Sec-CH-UA-Model
Critical-CH: Sec-CH-UA-Model
🔃 Tarayıcı, ek başlıkla ilk isteği yeniden dener
[With default headers + …]
Sec-CH-UA-Model: Pixel 5
Bu, ilk istekteki yeniden deneme işleminin ek yüküne neden olur ancak uygulama maliyeti nispeten düşüktür. Ekstra üstbilgiyi gönderin, tarayıcı gerisini halleder.
İlk sayfa yüklemesinde gerçekten ek ipuçlarına ihtiyaç duyduğunuz durumlarda İstemci İpuçları Güvenilirliği teklifi, bağlantı düzeyi ayarlarında ipuçlarını belirtmek için bir yol göstermektedir. Bu işlev, HTTP/2 ve HTTP/3 bağlantılarında ipuçlarının erken geçirilmesini sağlamak için TLS 1.3'e yönelik Uygulama Katmanı Protokolü Ayarları(ALPS) uzantısından yararlanır. Henüz çok erken bir aşamada olsak da kendi TLS ve bağlantı ayarlarınızı aktif olarak yönetiyorsanız bu, katkı sağlamak için ideal bir zamandır.
Strateji: Eski destek
Sitenizde, kullanıcı aracısı dizesinin kısaltılacak bölümleri de dahil olmak üzere navigator.userAgent
temelli eski veya üçüncü taraf kodu bulunabilir. Uzun vadede, eşdeğer navigator.userAgentData
çağrılarına geçiş yapmayı planlamanız gerekir ancak geçici bir çözüm vardır.
UA-CH retro doldurması, istenen navigator.userAgentData
değerlerinden oluşturulan yeni bir dizeyle navigator.userAgent
öğesinin üzerine yazmanıza olanak tanıyan küçük bir kitaplıktır.
Örneğin, bu kod, ek olarak "model" ipucunu da içeren bir kullanıcı aracısı dizesi oluşturur:
import { overrideUserAgentUsingClientHints } from './uach-retrofill.js';
overrideUserAgentUsingClientHints(['model'])
.then(() => { console.log(navigator.userAgent); });
Sonuçta elde edilen dize, Pixel 5
modelini gösterir ancak uaFullVersion
ipucu istenmediği için azaltılmış 92.0.0.0
değerini göstermeye devam eder:
Mozilla/5.0 (Linux; Android 10.0; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.0.0 Mobile Safari/537.36
Daha fazla destek
Bu stratejiler kullanım alanınızı kapsamıyorsa lütfen privacy-sandbox-dev-support deposunda tartışma başlatın. Böylece sorununuzu birlikte inceleyebiliriz.
Fotoğrafçı: Ricardo Rocha Unsplash'ta