Wprowadzenie do tokenów zaufania

Trust Tokens to nowy interfejs API, który umożliwia witrynie przenoszenie ograniczonej ilości informacji z jednego kontekstu przeglądania do innego (np. z wielu witryn) na potrzeby walki z oszustwami bez konieczności pasywnego śledzenia.



Podsumowanie

Tokeny zaufania umożliwiają źródłom wysyłanie tokenów kryptograficznych zaufanemu użytkownikowi. Tokeny są przechowywane przez przeglądarkę użytkownika. Przeglądarka może następnie użyć tokenów w innych kontekstach, aby ocenić autentyczność użytkownika.

Interfejs Trust Token API umożliwia przeniesienie zaufania użytkownika w jednym kontekście do innego kontekstu bez identyfikowania użytkownika czy łączenia obu tożsamości.

Możesz wypróbować ten interfejs API w wersji demonstracyjnej i sprawdzić tokeny na kartach Sieć i Aplikacja w Narzędziach deweloperskich w Chrome.

Zrzut ekranu przedstawiający tokeny zaufania na karcie Sieć w Narzędziach deweloperskich w Chrome.
Tokeny zaufania na karcie Sieć w Narzędziach deweloperskich w Chrome.
Zrzut ekranu przedstawiający tokeny zaufania na karcie aplikacji w Narzędziach deweloperskich w Chrome.
Tokeny zaufania na karcie Aplikacja w Narzędziach deweloperskich w Chrome.

Dlaczego potrzebujemy tokenów zaufania?

W internecie trzeba tworzyć sygnały zaufania, które dowodzą, że użytkownik jest tym, za kogo się podaje, a nie botem podszywającym się pod człowieka albo złośliwą osobę trzecią defrustrującą prawdziwą osobę lub usługę. Ochrona przed oszustwami jest szczególnie ważna dla reklamodawców, dostawców reklam i sieci CDN.

Niestety wiele istniejących mechanizmów do pomiaru i rozpowszechniania wiarygodności – aby ustalić, czy interakcja ze stroną pochodzi na przykład ze strony prawdziwego człowieka – korzysta z technik, których można też użyć do odcisków cyfrowych.

Interfejs API musi chronić prywatność, umożliwiając rozpowszechnianie zaufania między witrynami bez śledzenia poszczególnych użytkowników.

Co zawiera propozycja dotycząca tokenów zaufania?

Internet wykorzystuje sygnały zaufania do wykrywania oszustw i spamowania. Można to robić na przykład przez śledzenie przeglądania z wykorzystaniem globalnych, identyfikatorów użytkownika w różnych witrynach. W przypadku interfejsu API chroniącego prywatność nie akceptujemy tego.

Z objaśnienia oferty pakietowej:

Ten interfejs API proponuje nowy obszar przechowywania na poszczególnych domenach dla tokenów kryptograficznych w stylu „Privacy Pass”, które są dostępne w kontekstach innych firm. Te tokeny nie są personalizowane i nie można ich używać do śledzenia użytkowników. Są one jednak podpisane kryptograficznie, więc nie można ich sfałszować.

Gdy źródło znajduje się w kontekście, w którym użytkownik jest zaufany, może wysłać do przeglądarki grupę tokenów, które można „wydać” w późniejszym czasie w kontekście, w którym użytkownik byłby nieznany lub mniej zaufany. Tokeny nie można odróżnić od siebie, co uniemożliwia witrynom śledzenie użytkowników za ich pomocą.

Ponadto proponujemy mechanizm rozszerzenia przeglądarki do podpisywania żądań wychodzących za pomocą kluczy powiązanych z konkretnym wykorzystaniem tokena.

Przykładowe wykorzystanie interfejsu API

Ten fragment został zaadaptowany na podstawie przykładowego kodu w wyjaśnieniu interfejsu API.

Wyobraź sobie, że użytkownik odwiedza witrynę z wiadomościami (publisher.example), na której znajdują się reklamy z zewnętrznej sieci reklamowej (foo.example). Wcześniej korzystał z witryny w mediach społecznościowych, która wydaje tokeny zaufania (issuer.example).

Poniższa sekwencja pokazuje, jak działają tokeny zaufania.

1.Użytkownik otwiera stronę issuer.example i wykonuje działania, które sprawiają, że strona uważa, że jest człowiekiem. Może to być aktywność na koncie lub przejście testu CAPTCHA.

2.issuer.example weryfikuje, czy użytkownik jest człowiekiem, i uruchamia następujący kod JavaScript, aby wysłać token zaufania w przeglądarce użytkownika:

fetch('https://issuer.example/trust-token', {
  trustToken: {
    type: 'token-request',
    issuer: 'https://issuer.example'
  }
}).then(...)

3.Przeglądarka użytkownika przechowuje token zaufania, który wiąże go z elementem issuer.example.

4.Jakiś czas później użytkownik odwiedza stronę publisher.example.

5.publisher.example chce wiedzieć, czy użytkownik jest człowiekiem. Domena publisher.example ufa usłudze issuer.example, więc sprawdza, czy przeglądarka użytkownika ma prawidłowe tokeny z tego źródła:

document.hasTrustToken('https://issuer.example');

6.Jeśli to polecenie zwraca obietnicę o wartości true, oznacza to, że użytkownik ma tokeny z domeny issuer.example, więc publisher.example może próbować wykorzystać token:

fetch('https://issuer.example/trust-token', {
trustToken: {
  type: 'token-redemption',
  issuer: 'https://issuer.example',
  refreshPolicy: {none, refresh}
}
}).then(...)

Następującym kodem:

  1. Użytkownik publisher.example prosi o wykorzystanie oferty.
  2. Jeśli skorzystanie z oferty się powiedzie, wydawca issuer.example zwraca rekord wykorzystania, który wskazuje, że w którymś momencie wystawił prawidłowy token dla tej przeglądarki.

    7.Gdy obietnica zwrócona przez fetch() zostanie zrealizowana, rekordu wykorzystania można używać w kolejnych żądaniach dotyczących zasobów:

fetch('https://foo.example/get-content', {
  trustToken: {
    type: 'send-redemption-record',
    issuers: ['https://issuer.example', ...]
  }
});

Następującym kodem:

  1. Rekordy wykorzystania są uwzględniane jako nagłówek żądania Sec-Redemption-Record.
  2. foo.example otrzymuje rekord wykorzystania i może go przeanalizować, aby określić, czy issuer.example uważa, że użytkownik to człowiek.
  3. foo.example odpowiada odpowiednio.
Co może zrobić strona internetowa, aby Ci zaufać?

Możesz mieć historię zakupów w witrynie e-commerce, meldowania się na platformie lokalizacyjnej lub historii konta w banku. Wystawcy mogą też brać pod uwagę inne czynniki, takie jak czas korzystania z konta lub inne interakcje (takie jak CAPTCHA czy przesłanie formularza), które zwiększają zaufanie wydawcy do prawdopodobieństwa, że jesteś człowiekiem.

Wydawanie tokenów zaufania

Jeśli wydawca tokena zaufania (np. issuer.example) uzna użytkownika za godnego zaufania, może on pobrać dla niego tokeny zaufania, wysyłając żądanie fetch() z parametrem trustToken:

fetch('issuer.example/trust-token', {
  trustToken: {
    type: 'token-request'
  }
}).then(...)

Powoduje to wywołanie rozszerzenia protokołu wystawiania dokumentu Privacy Pass z wykorzystaniem nowego prymitywu kryptograficznego:

  1. Wygeneruj zestaw pseudolosowych liczb nazywanych liczbą jednorazową.

  2. Zakoduj liczby jednorazowe (zakoduj je tak, aby wydawca nie mógł zobaczyć ich zawartości) i dołącz je do żądania w nagłówku Sec-Trust-Token.

  3. Wyślij żądanie POST do podanego punktu końcowego.

Punkt końcowy odpowiada zaciemnionym tokenem (sygnatury na ślepych jednorazowych), po czym tokeny są niezaciemniane i przechowywane wewnętrznie razem z powiązanymi z nimi tokenami zaufania przez przeglądarkę jako tokeny zaufania.

Wykorzystanie tokena zaufania

Witryna wydawcy (np. publisher.example w przykładzie powyżej) może sprawdzić, czy dla użytkownika dostępne są tokeny zaufania:

const userHasTokens = await document.hasTrustToken('issuer.example/trust-token');

Jeśli są dostępne tokeny, witryna wydawcy może je wykorzystać, aby otrzymać rekord wykorzystania:

fetch('issuer.example/trust-token', {
  ...
  trustToken: {
    type: 'token-redemption',
    refreshPolicy: 'none'
  }
  ...
}).then(...)

Wydawca może dołączać rekordy wykorzystania w żądaniach wymagających tokena zaufania – na przykład zamieścić komentarz, polubić stronę lub zagłosować w ankiecie – używając wywołania fetch() w ten sposób:

fetch('https://foo.example/post-comment', {
  ...
  trustToken: {
    type: 'send-redemption-record',
    issuers: ['issuer.example/trust-token', ...]
  }
  ...
}).then(...);

Rekordy wykorzystania są uwzględniane jako nagłówek żądania Sec-Redemption-Record.

Kwestie dotyczące prywatności

Tokeny są zaprojektowane tak, aby nie można było ich połączyć. Wydawca może poznać zbiorcze informacje o witrynach odwiedzanych przez jego użytkowników, ale nie może powiązać procesu wystawiania z wykorzystaniem tokena: gdy użytkownik wykorzysta token, wydawca nie może odróżnić go od innych utworzonych przez siebie tokenów. Obecnie jednak tokeny zaufania nie istnieją w próżni: istnieją inne sposoby – teoretycznie – wydawca może obecnie połączyć tożsamość użytkownika w różnych witrynach, np. za pomocą plików cookie innych firm i tajnych technik śledzenia. Właściciele witryn powinni zrozumieć tę zmianę w ekosystemie, planując wsparcie. To ogólny aspekt przechodzenia wielu interfejsów API Piaskownicy prywatności, więc nie omawiamy go tutaj bardziej.

Bezpieczeństwo

Wyczerpanie tokena zaufania: szkodliwa witryna mogła celowo wyczerpać zasoby tokenów od określonego wydawcy. Istnieje kilka sposobów na złagodzenie tego typu ataków, np. umożliwienie wydawcom udostępnienia wielu tokenów jednocześnie, tak aby użytkownicy mieli pewność, że przeglądarki wykorzystują tylko 1 token na wyświetlenie strony najwyższego poziomu.

Zapobieganie podwójnemu wydatkom: złośliwe oprogramowanie może próbować uzyskać dostęp do wszystkich tokenów zaufania użytkownika. Jednak tokeny będą się jednak stopniowo wyczerpywać, ponieważ każde wykorzystanie kodu jest wysyłane do tego samego wydawcy tokena, który może sprawdzić, czy każdy z nich został użyty tylko raz. Aby ograniczyć ryzyko, wydawcy mogą też podpisywać mniej tokenów.

Mechanizmy żądań

Można zezwolić na wysyłanie rekordów wykorzystania kodu poza regionem fetch(), na przykład w przypadku żądań nawigacji. Witryny mogą też uwzględniać dane wydawcy w nagłówkach odpowiedzi HTTP, aby umożliwić wykorzystywanie tokenów równolegle z wczytywaniem stron.

Dla przypomnienia: ta propozycja wymaga Twojej opinii. Jeśli masz jakieś komentarze, utwórz zgłoszenie w repozytorium objaśniającym token zaufania.

Więcej informacji


Dziękujemy wszystkim, którzy pomogli napisać i zrecenzować ten post.

Zdjęcie: ZSun Fu, Unsplash.