Przeprowadź migrację do wskazówek dotyczących klienta użytkownika

Strategie migracji witryny z ciągu znaków klienta użytkownika do nowych wskazówek dla klienta użytkownika.

Ciąg znaków User-Agent to istotna powierzchnia pasywnego odcisku palca, która jest również trudna do przetworzenia w przeglądarkach. Istnieje jednak wiele uzasadnionych powodów gromadzenia i przetwarzania danych klienta użytkownika, więc potrzebna jest ścieżka do lepszego rozwiązania. Wskazówki dla klienta użytkownika umożliwiają zarówno wyraźne zadeklarowanie, że potrzebujesz danych klienta użytkownika, jak i metody ich zwracania w łatwym w użyciu formacie.

Z tego artykułu dowiesz się, jak kontrolować dostęp do danych klienta użytkownika i jak przenieść użycie ciągu znaków klienta użytkownika do instrukcji klienta użytkownika.

Kontrola zbierania i wykorzystywania danych klienta użytkownika

Podobnie jak w przypadku każdej formy zbierania danych, zawsze zastanów się, dlaczego to robisz. Pierwszym krokiem, niezależnie od tego, czy podejmiesz jakieś działanie, jest zrozumienie, gdzie i dlaczego używasz danych klienta użytkownika.

Jeśli nie wiesz, czy i gdzie są używane dane klienta użytkownika, rozważ wyszukanie w kodzie frontendu użycia navigator.userAgent, a w kodzie backendu zastosowanie nagłówka HTTP User-Agent. Zalecamy też sprawdzenie kodu frontendu pod kątem korzystania z wycofanych już funkcji, takich jak navigator.platform czy navigator.appVersion.

Z praktycznego punktu widzenia zastanów się nad miejscem w kodzie, w którym rejestrujesz lub przetwarzasz:

  • Nazwa lub wersja przeglądarki
  • Nazwa lub wersja systemu operacyjnego
  • Marka lub model urządzenia
  • Typ, architektura lub szybkość transmisji bitów (np. 64-bitowa)

Możliwe też, że do przetwarzania klienta użytkownika korzystasz z biblioteki lub usługi innej firmy. W takim przypadku sprawdź, czy aktualizują się, by obsługiwać podpowiedzi klienta użytkownika.

Czy używasz tylko podstawowych danych klienta użytkownika?

Domyślny zestaw wskazówek dla klienta użytkownika zawiera:

  • Sec-CH-UA: nazwa przeglądarki i wersja główna/znacząca.
  • Sec-CH-UA-Mobile: wartość logiczna wskazująca urządzenie mobilne.
  • Sec-CH-UA-Platform: nazwa systemu operacyjnego.
    • Zaktualizowaliśmy to w specyfikacji i wkrótce uwzględnimy to w Chrome i innych przeglądarkach opartych na Chromium.

Proponowana skrócona wersja ciągu znaków klienta użytkownika również zachowa te podstawowe informacje w sposób zgodny wstecznie. Na przykład zamiast Chrome/90.0.4430.85 ciąg znaków zawiera ciąg Chrome/90.0.0.0.

Jeśli w ciągu klienta użytkownika sprawdzasz tylko nazwę przeglądarki, wersję główną lub system operacyjny, Twój kod będzie nadal działać, choć mogą się wyświetlać ostrzeżenia o wycofaniu.

Możesz i powinien przejść na wskazówki dla klienta użytkownika, ale możliwe, że masz do czynienia ze starszymi ograniczeniami kodu lub zasobów, które to uniemożliwiają. Zmniejszenie informacji w ciągu znaków klienta użytkownika w taki sposób wsteczny ma sprawić, że chociaż istniejący kod będzie otrzymywał mniej szczegółowe informacje, nadal zachowa podstawowe funkcje.

Strategia: interfejs API JavaScript działający po stronie klienta na żądanie

Jeśli obecnie używasz navigator.userAgent, przed powrotem do analizy ciągu znaków klienta użytkownika wybierz navigator.userAgentData.

if (navigator.userAgentData) {
  // use new hints
} else {
  // fall back to user-agent string parsing
}

Jeśli sprawdzasz wersję na urządzenia mobilne lub komputery, użyj wartości logicznej mobile:

const isMobile = navigator.userAgentData.mobile;

userAgentData.brands to tablica obiektów o właściwościach brand i version, w której przeglądarka może ocenić zgodność z tymi markami. Możesz uzyskać do niego dostęp bezpośrednio w postaci tablicy lub użyć wywołania some(), aby sprawdzić, czy jest w nim obecny określony wpis:

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
}

Jeśli potrzebujesz jednej z bardziej szczegółowych wartości klienta użytkownika o dużej entropii, musisz ją określić i sprawdzić wynik w zwracanym obiekcie Promise:

navigator.userAgentData.getHighEntropyValues(['model'])
  .then(ua => {
    // requested hints available as attributes
    const model = ua.model
  });

Może Ci się też przydać ta strategia, jeśli chcesz przejść z przetwarzania po stronie serwera na przetwarzanie po stronie klienta. Interfejs JavaScript API nie wymaga dostępu do nagłówków żądań HTTP, więc wartości klienta użytkownika można zażądać w dowolnym momencie.

Strategia: statyczny nagłówek po stronie serwera

Jeśli używasz na serwerze nagłówka żądania User-Agent i Twoje potrzeby związane z tymi danymi są względnie spójne w całej witrynie, możesz określić żądane wskazówki dotyczące klienta w postaci statycznego zbioru odpowiedzi. Jest to stosunkowo proste, ponieważ zwykle wystarczy skonfigurować je tylko w jednym miejscu. Może to być np. konfiguracja serwera WWW, jeśli już tam dodano nagłówki, konfiguracja hostingu lub konfiguracja najwyższego poziomu platformy lub platformy, z której korzystasz w witrynie.

Rozważ tę strategię, jeśli przekształcasz lub dostosowujesz odpowiedzi wyświetlane na podstawie danych klienta użytkownika.

Przeglądarki i inne klienty mogą podawać inne domyślne wskazówki, dlatego warto określić wszystkie potrzebne informacje, nawet jeśli zazwyczaj są one ustawione domyślnie.

Bieżące wartości domyślne Chrome będą na przykład widoczne w takiej postaci:

🥭️ Nagłówki odpowiedzi

Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA

Jeśli w odpowiedzi chcesz też otrzymać informacje o modelu urządzenia, możesz wysłać:

🥭️ Nagłówki odpowiedzi

Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform, Sec-CH-UA

Podczas przetwarzania tego nagłówka po stronie serwera sprawdź najpierw, czy odpowiedni nagłówek Sec-CH-UA został wysłany. Jeśli to zrobisz, skorzystaj z analizy nagłówka User-Agent, jeśli ten nagłówek jest niedostępny.

Strategia: przekazywanie wskazówek do żądań z innych domen

Jeśli prosisz o podzasoby pochodzące z innych domen lub z innych witryn, które wymagają wysyłania w żądaniach podpowiedzi klienta User-Agent, musisz wyraźnie wskazać oczekiwane wskazówki za pomocą zasady uprawnień.

Załóżmy na przykład, że https://blog.site hostuje w https://cdn.site zasoby, które mogą zwracać zasoby zoptymalizowane pod kątem konkretnego urządzenia. https://blog.site może poprosić o wskazówkę Sec-CH-UA-Model, ale musi wyraźnie przekazać ją użytkownikowi https://cdn.site za pomocą nagłówka Permissions-Policy. Lista wskazówek kontrolowanych przez zasady jest dostępna w wersji roboczej infrastruktury wskazówek dla klientów

📲 Odpowiedź od użytkownika blog.site przekazująca wskazówkę

Accept-CH: Sec-CH-UA-Model
Permissions-Policy: ch-ua-model=(self "https://cdn.site")

⬆️ Poproś o dostęp do zasobów podrzędnych w cdn.site – dołącz wskazówkę dotyczącą delegowanego

Sec-CH-UA-Model: "Pixel 5"

Możesz podać wiele wskazówek dla wielu źródeł, a nie tylko z zakresu ch-ua:

🥭️ Odpowiedź z kanału blog.site z przekazaniem wielu wskazówek różnym źródłom

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")

Strategia: przekazywanie wskazówek do elementów iframe

Elementy iframe z innych domen działają podobnie do zasobów z innych domen, ale wskazówki, które chcesz przekazać, określasz w atrybucie allow.

🎮️ Odpowiedź od użytkownika blog.site

Accept-CH: Sec-CH-UA-Model

↪️ Kod HTML: blog.site

<iframe src="https://widget.site" allow="ch-ua-model"></iframe>

⬆️ Prośba do: widget.site

Sec-CH-UA-Model: "Pixel 5"

Atrybut allow w elemencie iframe zastępuje każdy nagłówek Accept-CH, który widget.site może wysłać samodzielnie, dlatego upewnij się, że podano wszystkie elementy potrzebne witrynie w elemencie iframe.

Strategia: dynamiczne wskazówki po stronie serwera

Jeśli masz określone fragmenty ścieżki użytkownika, w przypadku których potrzebujesz większego wyboru wskazówek niż w pozostałych częściach witryny, możesz prosić o ich podpowiedzi na żądanie, a nie na stałe w całej witrynie. Zarządzanie takim procesem jest bardziej skomplikowane, ale jeśli masz już ustawione różne nagłówki dla poszczególnych tras, być może uda się to zrobić.

Pamiętaj, że każde wystąpienie nagłówka Accept-CH skutecznie zastąpi istniejący zbiór. Jeśli dynamicznie ustawiasz nagłówek, każda strona musi żądać pełnego zestawu wymaganych wskazówek.

Na przykład możesz mieć w swojej witrynie sekcję, w której chcesz dodać ikony i elementy sterujące zgodne z systemem operacyjnym użytkownika. W tym celu warto dodatkowo pobrać Sec-CH-UA-Platform-Version, aby udostępnić odpowiednie zasoby podrzędne.

🎮️ Nagłówki odpowiedzi dla zapytania /blog

Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA

🎮️ Nagłówki odpowiedzi dla zapytania /app

Accept-CH: Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA-Platform-Version, Sec-CH-UA

Strategia: wskazówki po stronie serwera wymagane przy pierwszym żądaniu

Może się zdarzyć, że będziesz potrzebować więcej niż domyślny zestaw wskazówek w pierwszym żądaniu, ale będzie to rzadko używane, dlatego zapoznaj się z uzasadnieniem.

Tak naprawdę pierwsze żądanie oznacza pierwsze żądanie najwyższego poziomu dotyczące danego źródła wysłane w ramach tej sesji przeglądania. Domyślny zestaw wskazówek zawiera nazwę przeglądarki z wersją główną, platformę oraz wskaźnik urządzenia mobilnego. Zadaj sobie pytanie, czy potrzebujesz danych rozszerzonych przy wstępnym wczytaniu strony.

Dodatkowe wskazówki dotyczące pierwszego zgłoszenia dostępne są na 2 sposoby. Po pierwsze możesz użyć nagłówka Critical-CH. Ma on taki sam format jak Accept-CH, ale informuje przeglądarkę, że powinna natychmiast ponowić żądanie, jeśli pierwsza wiadomość została wysłana bez krytycznej podpowiedzi.

⬆️ Wstępne żądanie

[With default headers]

🥭️ Nagłówki odpowiedzi

Accept-CH: Sec-CH-UA-Model
Critical-CH: Sec-CH-UA-Model

🔃 Przeglądarka ponawia początkowe żądanie z dodatkowym nagłówkiem

[With default headers + …]
Sec-CH-UA-Model: Pixel 5

Wiąże się to z narzutem na ponowienie próby przy pierwszym żądaniu, ale koszt implementacji jest stosunkowo niski. Wyślij dodatkowy nagłówek, a przeglądarka zajmie się resztą.

W sytuacjach, gdy naprawdę wymagasz dodatkowych wskazówek przy pierwszym wczytaniu strony, propozycja niezawodności wskazówek dla klienta określa trasę do określania wskazówek w ustawieniach na poziomie połączenia. Wykorzystuje rozszerzenie Application-Layer Protocol Settings(ALPS) do TLS 1.3, aby umożliwić wcześniejsze przekazywanie wskazówek dotyczących połączeń HTTP/2 i HTTP/3. Wciąż jesteśmy na bardzo wczesnym etapie, ale jeśli aktywnie zarządzasz własnymi ustawieniami TLS i połączeniami, to dobry moment, aby coś z tym zrobić.

Strategia: obsługa starszej wersji

W witrynie może znajdować się starszy lub zewnętrzny kod, który zależy od parametru navigator.userAgent. Dotyczy to m.in. fragmentów ciągu znaków klienta użytkownika, które zostaną ograniczone. W dłuższej perspektywie należy zaplanować przejście na równoważne wywołania navigator.userAgentData, ale jest dostępne rozwiązanie tymczasowe.

Uzupełnianie UA-CH to mała biblioteka, która umożliwia zastąpienie navigator.userAgent nowym ciągiem znaków utworzonym na podstawie żądanych wartości navigator.userAgentData.

Na przykład ten kod wygeneruje ciąg klienta użytkownika, który będzie dodatkowo zawierał wskazówkę „model”:

import { overrideUserAgentUsingClientHints } from './uach-retrofill.js';
overrideUserAgentUsingClientHints(['model'])
  .then(() => { console.log(navigator.userAgent); });

Powstały ciąg znaków będzie zawierać model Pixel 5, ale nadal będzie pokazywać zredukowaną wartość 92.0.0.0, ponieważ wskazówka uaFullVersion nie została wysłana:

Mozilla/5.0 (Linux; Android 10.0; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.0.0 Mobile Safari/537.36

Dalsza pomoc

Jeśli te strategie nie dotyczą Twojego przypadku użycia, rozpocznij dyskusję w repozytorium privacy-sandbox-dev-support, a my wspólnie zajmiemy się Twoim problemem.

Fot. Ricardo Rocha w Unsplash