Strategi untuk memigrasikan situs Anda dari mengandalkan string agen pengguna ke Petunjuk Klien Agen Pengguna baru.
Agen Pengguna string adalah pelacakan sidik jari pasif yang signifikan muncul di browser, serta serta sulit untuk diproses. Namun, ada semua jenis alasan pengumpulan dan pemrosesan data agen pengguna, jadi yang diperlukan adalah ke solusi yang lebih baik. Petunjuk Klien Agen Pengguna memberikan cara yang eksplisit mendeklarasikan kebutuhan Anda akan data agen pengguna dan metode untuk mengembalikan data dalam format yang mudah digunakan.
Artikel ini akan memandu Anda untuk mengaudit akses Anda ke data agen pengguna dan memigrasikan penggunaan string agen pengguna ke Petunjuk Klien Agen Pengguna.
Mengaudit pengumpulan dan penggunaan data agen pengguna
Seperti semua bentuk pengumpulan data, Anda harus selalu memahami mengapa Anda mengumpulkannya. Langkah pertama, terlepas dari apakah Anda akan mengambil tindakan apa pun, adalah memahami di mana dan mengapa Anda menggunakan data agen pengguna.
Jika Anda tidak tahu apakah atau di mana data agen pengguna digunakan, coba telusuri
kode front-end untuk penggunaan navigator.userAgent
dan kode back-end untuk
penggunaan header HTTP User-Agent
. Anda juga harus memeriksa kode {i>front-end<i}
untuk penggunaan fitur yang sudah tidak digunakan lagi, seperti navigator.platform
dan
navigator.appVersion
.
Dari sudut pandang fungsional, pikirkan di mana pun dalam kode di mana Anda berada perekaman atau pemrosesan:
- Nama atau versi browser
- Nama atau versi sistem operasi
- Merek atau model perangkat
- Jenis, arsitektur, atau bit CPU (misalnya, 64-bit)
Anda mungkin juga menggunakan pustaka atau layanan pihak ketiga untuk memproses agen pengguna. Dalam hal ini, periksa untuk melihat apakah mereka memperbarui ke mendukung Petunjuk Klien Agen Pengguna.
Apakah Anda hanya menggunakan data agen pengguna dasar?
Kumpulan default Petunjuk Klien Agen Pengguna mencakup:
Sec-CH-UA
: nama browser dan versi utama/signifikanSec-CH-UA-Mobile
: nilai boolean yang menunjukkan perangkat selulerSec-CH-UA-Platform
: nama sistem operasi- Perhatikan bahwa hal ini telah diperbarui dalam spesifikasi dan akan ditampilkan dalam Chrome dan browser berbasis Chromium lainnya sebentar lagi.
Pengurangan versi string agen pengguna yang diusulkan juga akan mempertahankan
informasi dasar ini dengan cara
yang kompatibel dengan sistem lama. Misalnya, daripada
Chrome/90.0.4430.85
, string akan menyertakan Chrome/90.0.0.0
.
Jika Anda hanya memeriksa string agen pengguna untuk nama browser, versi utama, atau sistem operasi, maka kode Anda akan tetap berfungsi walaupun kemungkinan besar untuk melihat peringatan penghentian penggunaan.
Meskipun Anda dapat dan harus bermigrasi ke Petunjuk Klien Agen Pengguna, Anda mungkin memiliki atau batasan sumber daya yang mencegah hal ini. Pengurangan informasi dalam string agen pengguna dengan cara yang kompatibel dengan versi lama ini dimaksudkan untuk memastikan bahwa meskipun kode yang sudah ada akan menerima informasi yang kurang detail, kode tersebut seharusnya tetap mempertahankan fungsionalitas dasar.
Strategi: JavaScript API sisi klien on-demand
Jika Anda saat ini menggunakan navigator.userAgent
, Anda harus melakukan transisi ke
lebih memilih navigator.userAgentData
sebelum kembali ke penguraian
string agen pengguna.
if (navigator.userAgentData) {
// use new hints
} else {
// fall back to user-agent string parsing
}
Jika Anda memeriksa perangkat seluler atau desktop, gunakan nilai mobile
boolean:
const isMobile = navigator.userAgentData.mobile;
userAgentData.brands
adalah array objek dengan brand
dan version
properti yang browser dapat mencantumkan kompatibilitasnya dengan
perusahaan. Anda dapat mengaksesnya langsung sebagai array atau Anda mungkin ingin menggunakan
Panggilan some()
untuk memeriksa apakah ada entri tertentu:
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
}
Jika Anda membutuhkan salah satu nilai agen pengguna
yang lebih rinci dan entropi tinggi, Anda akan
perlu menentukannya dan memeriksa hasilnya dalam Promise
yang ditampilkan:
navigator.userAgentData.getHighEntropyValues(['model'])
.then(ua => {
// requested hints available as attributes
const model = ua.model
});
Anda juga dapat menggunakan strategi ini jika Anda ingin beralih dari pemrosesan sisi server ke pemrosesan sisi klien. JavaScript API tidak memerlukan akses ke header permintaan HTTP, sehingga nilai agen pengguna dapat diminta di di titik mana pun.
Strategi: Header sisi server statis
Jika Anda menggunakan header permintaan User-Agent
di server dan kebutuhan Anda
bahwa data relatif konsisten di seluruh situs Anda, maka Anda dapat
menentukan client hints yang diinginkan sebagai set statis dalam respons Anda. Ini adalah
pendekatan yang relatif sederhana karena umumnya Anda
hanya perlu mengkonfigurasi dalam satu
lokasi HTTP/HTTPS. Misalnya, mungkin ada di konfigurasi
server web Anda jika Anda sudah
tambahkan {i>header<i} di sana, konfigurasi {i>
hosting Anda<i}, atau konfigurasi tingkat atas dari
kerangka kerja atau platform yang
digunakan untuk situs Anda.
Pertimbangkan strategi ini jika Anda mengubah atau menyesuaikan respons dilayani berdasarkan data agen pengguna.
Browser atau klien lain dapat memilih untuk menyediakan petunjuk default yang berbeda, jadi praktik yang baik untuk menentukan semua yang Anda butuhkan, bahkan jika itu disediakan oleh secara default.
Misalnya, default saat ini untuk Chrome akan ditampilkan sebagai:
⬇️ Header respons
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA
Jika Anda juga ingin menerima model perangkat dalam respons, maka Anda perlu kirim:
⬇️ Header respons
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA
Saat memproses ini di sisi server, Anda harus
memeriksa terlebih dahulu apakah server
Header Sec-CH-UA
telah dikirim lalu kembali ke header User-Agent
mengurai jika tidak tersedia.
Strategi: Mendelegasikan petunjuk ke permintaan lintas origin
Jika Anda meminta subresource lintas origin atau lintas situs yang memerlukan Petunjuk Klien Agen Pengguna akan dikirim pada permintaan mereka, maka Anda harus secara eksplisit menentukan petunjuk yang diinginkan menggunakan Kebijakan Izin.
Sebagai contoh, anggaplah https://blog.site
menghosting resource di
https://cdn.site
yang dapat menampilkan resource yang dioptimalkan untuk perangkat tertentu.
https://blog.site
dapat meminta petunjuk Sec-CH-UA-Model
, tetapi harus
secara eksplisit mendelegasikannya ke https://cdn.site
menggunakan Permissions-Policy
{i>header<i}. Daftar petunjuk yang dikontrol kebijakan tersedia di Petunjuk Klien
Infrastruktur
draf
⬇️ Respons dari blog.site
yang mendelegasikan petunjuk
Accept-CH: Sec-CH-UA-Model
Permissions-Policy: ch-ua-model=(self "https://cdn.site")
⬆️ Permintaan ke subresource di cdn.site
menyertakan petunjuk yang didelegasikan
Sec-CH-UA-Model: "Pixel 5"
Anda dapat menentukan beberapa petunjuk untuk beberapa origin, dan bukan hanya dari rentang ch-ua
:
⬇️ Respons dari blog.site
yang mendelegasikan beberapa petunjuk ke beberapa asal
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")
Strategi: Mendelegasikan petunjuk ke iframe
iframe lintas origin berfungsi dengan cara yang mirip dengan resource lintas origin, tetapi Anda
tentukan petunjuk yang ingin Anda delegasikan dalam atribut allow
.
⬇️ Jawaban dari blog.site
Accept-CH: Sec-CH-UA-Model
↪️ HTML untuk blog.site
<iframe src="https://widget.site" allow="ch-ua-model"></iframe>
⬆️ Permintaan ke widget.site
Sec-CH-UA-Model: "Pixel 5"
Atribut allow
di iframe akan menggantikan header Accept-CH
yang
widget.site
dapat mengirim sendiri, jadi pastikan Anda telah menentukan semua
diperlukan situs iframe.
Strategi: Petunjuk sisi server dinamis
Jika Anda memiliki bagian tertentu dari perjalanan pengguna yang membutuhkan pilihan yang lebih banyak petunjuk dibandingkan di bagian lain situs, Anda dapat memilih untuk meminta petunjuk tersebut sesuai permintaan daripada secara statis di seluruh situs. Ini lebih kompleks untuk mengelola, tetapi jika Anda sudah menetapkan {i> header<i} yang berbeda untuk setiap rute, layak.
Hal penting yang perlu diingat di sini adalah setiap instance Accept-CH
akan menimpa kumpulan
yang ada secara efektif. Jadi, jika Anda secara dinamis
menetapkan {i>header<i} maka setiap halaman harus meminta kumpulan petunjuk lengkap yang diperlukan.
Misalnya, Anda mungkin memiliki satu bagian di situs tempat Anda ingin menyediakan
ikon dan kontrol yang sesuai
dengan sistem operasi pengguna. Untuk itu, Anda dapat
ingin menarik Sec-CH-UA-Platform-Version
juga untuk menayangkan
subresource.
⬇️ Header respons untuk /blog
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA
⬇️ Header respons untuk /app
Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA
Strategi: Petunjuk sisi server diperlukan pada permintaan pertama
Mungkin ada kasus di mana Anda memerlukan lebih daripada kumpulan petunjuk default pada permintaan pertama, namun kemungkinan besar ini jarang terjadi, jadi pastikan Anda meninjau alasannya.
Permintaan pertama benar-benar berarti permintaan tingkat atas pertama untuk origin tersebut yang dikirimkan di sesi penjelajahan. Kumpulan petunjuk default mencakup browser dengan versi utama, platform, dan indikator seluler. Jadi pertanyaannya pertanyaannya adalah, apakah Anda memerlukan data yang diperpanjang pada pemuatan halaman awal?
Ada dua opsi untuk petunjuk tambahan pada permintaan pertama. Pertama, Anda dapat
memanfaatkan header Critical-CH
. Format ini sama dengan Accept-CH
tetapi memberi tahu browser bahwa ia harus segera
mencoba ulang permintaan tersebut jika
satu pesan dikirim tanpa
petunjuk penting.
⬆️ Permintaan awal
[With default headers]
⬇️ Header respons
Accept-CH: Sec-CH-UA-Model
Critical-CH: Sec-CH-UA-Model
🔃 Browser mencoba kembali permintaan awal dengan header ekstra
[With default headers + …]
Sec-CH-UA-Model: Pixel 5
Hal ini akan menimbulkan overhead percobaan ulang pada permintaan pertama, tetapi biaya implementasinya relatif rendah. Kirim header tambahan dan browser akan mengerjakan sisanya.
Untuk situasi di mana Anda memerlukan benar-benar memerlukan petunjuk tambahan pada pemuatan halaman pertama, artikel Keandalan Petunjuk Klien proposal memberikan rute untuk memberikan petunjuk dalam setelan tingkat koneksi. Ini menggunakan protokol Protokol Lapisan Aplikasi Ekstensi Settings(ALPS) ke TLS 1.3 untuk memungkinkan penerusan awal petunjuk ini pada koneksi HTTP/2 dan HTTP/3. Ini masih pada tahap awal, tetapi jika Anda aktif mengelola TLS dan pengaturan koneksi, maka ini adalah waktu yang ideal untuk berkontribusi.
Strategi: Dukungan lama
Anda mungkin memiliki kode lama atau kode pihak ketiga di situs Anda yang bergantung pada
navigator.userAgent
, termasuk bagian dari string agen pengguna yang akan
berkurang. Dalam jangka panjang, Anda harus merencanakan untuk pindah ke lingkungan yang setara
Panggilan navigator.userAgentData
, tetapi ada solusi sementara.
Retrofill UA-CH adalah metode
library yang memungkinkan Anda menimpa navigator.userAgent
dengan string baru
dibuat dari nilai navigator.userAgentData
yang diminta.
Misalnya, kode ini akan menghasilkan string agen pengguna yang juga mencakup "model" petunjuk:
import { overrideUserAgentUsingClientHints } from './uach-retrofill.js';
overrideUserAgentUsingClientHints(['model'])
.then(() => { console.log(navigator.userAgent); });
String yang dihasilkan akan menampilkan model Pixel 5
, tetapi masih menampilkan penurunan
92.0.0.0
sebagai petunjuk uaFullVersion
tidak diminta:
Mozilla/5.0 (Linux; Android 10.0; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.0.0 Mobile Safari/537.36
Dukungan lebih lanjut
Jika strategi ini tidak mencakup kasus penggunaan Anda, mulai Diskusi di privacy-sandbox-dev-support repositori dan kita dapat mempelajari masalah Anda bersama.
Foto oleh Ricardo Rocha di Unsplash