Przepisy na ciastka SameSite

Chrome, Firefox, Edge i inne przeglądarki zmieniają swoje domyślne działanie zgodnie z propozycją IETF dotyczącą stopniowego ulepszania plików cookie, aby:

  • Pliki cookie bez atrybutu SameSite są traktowane jako SameSite=Lax, co oznacza, że domyślnym działaniem jest ograniczenie plików cookie do tylko kontekstów własnych.
  • Aby umożliwić uwzględnianie plików cookie w kontekście zewnętrznym, musisz określić dla nich atrybut SameSite=None; Secure.

Jeśli jeszcze tego nie zrobisz, zaktualizuj atrybuty plików cookie innych firm, aby nie zostały zablokowane w przyszłości.

Obsługa przeglądarek

  • Chrome: 51.
  • Edge: 16.
  • Firefox: 60.
  • Safari: 13.

Źródło

Przypadki użycia plików cookie z innych witryn lub plików cookie innych firm

Istnieje wiele typowych przypadków użycia i wzorców, w których pliki cookie muszą być wysyłane w kontekście innych firm. Jeśli korzystasz z jednego z tych zastosowań lub zależy Ci na jego prawidłowym działaniu, upewnij się, że Ty lub dostawca aktualizujecie pliki cookie.

Treści w ramach <iframe>

Treści z innej witryny wyświetlane w <iframe> są w kontekście zewnętrznym. Standardowe przypadki użycia obejmują:

  • treści umieszczone z innych witryn, takie jak filmy, mapy, przykłady kodu i posty w mediach społecznościowych;
  • widżety z usług zewnętrznych, takie jak płatności, kalendarze, rezerwacje i funkcje rezerwacji;
  • widżety, takie jak przyciski mediów społecznościowych lub usługi zapobiegające oszustwom, które są mniej widoczne.<iframes>

Pliki cookie mogą być używane m.in. do utrzymywania stanu sesji, przechowywania ogólnych preferencji, włączania statystyk lub personalizowania treści dla użytkowników z dotychczasowymi kontami.

Schemat okna przeglądarki, w którym adres URL osadzonej treści nie jest zgodny z adresem URL strony
Jeśli treści umieszczone w ramach witryny nie pochodzą z tej samej witryny co kontekst przeglądania na najwyższym poziomie, są to treści pochodzące od osoby trzeciej.

Sieć jest z natury kompozycyjna, więc funkcja <iframes> służy też do umieszczania treści wyświetlanych w kontekście najwyższego poziomu lub własnym. Wszystkie pliki cookie używane przez witrynę wyświetlaną w ramce iframe są uważane za pliki cookie innych firm. Jeśli tworzysz witryny, które mają być umieszczane w innych witrynach, i potrzebujesz plików cookie, aby działały, musisz też zadbać o to, aby były one oznaczone jako pliki przeznaczone do użycia w wielu witrynach lub aby można było je zastąpić.

„Niebezpieczne” żądania w różnych witrynach

„Niebezpieczne” może brzmieć niepokojąco, ale odnosi się do dowolnego żądania, które może mieć na celu zmianę stanu. W przypadku witryn są to głównie żądania POST. Pliki cookie oznaczone jako SameSite=Lax są wysyłane w bezpiecznej nawigacji najwyższego poziomu, np. po kliknięciu linku na innej stronie. Jednak przesłanie danych za pomocą metody POST do innej witryny nie powoduje wysłania plików cookie.

Schemat pokazujący żądanie przechodzące z jednej strony na drugą.
Jeśli żądanie przychodzące używa metody „bezpiecznej”, strona wysyła pliki cookie.

Ten wzór jest używany w przypadku witryn, które mogą przekierowywać użytkownika do zdalnej usługi w celu wykonania jakiejś operacji, a potem wrócić, np. do zewnętrznego dostawcy tożsamości. Zanim użytkownik opuści witrynę, zostanie utworzony plik cookie zawierający token z pojedynczym użyciem, który oczekuje, że w zwracanym żądaniu można sprawdzić ten token, aby ograniczyć ataki z fałszywym żądaniem z innej witryny (CSRF). Jeśli żądanie zwrotne jest wysyłane za pomocą metody POST, musisz oznaczyć pliki cookie jako SameSite=None; Secure.

Zasoby zdalne

Każdy zasób zdalny na stronie, np. z tagów <img> lub <script>, może wymagać wysłania plików cookie z żądaniem. Są to na przykład piksele śledzące i personalizowanie treści.

Dotyczy to też żądań wysyłanych z JavaScriptu za pomocą funkcji fetch lub XMLHttpRequest. Jeśli funkcja fetch() jest wywoływana z opcją credentials: 'include', żądania te prawdopodobnie zawierają pliki cookie. W przypadku XMLHttpRequest oczekiwane pliki cookie są zwykle wskazywane przez wartość withCredentials w pliku true. Pliki te muszą być odpowiednio oznaczone, aby można było uwzględnić je w żądaniach przesyłanych między witrynami.

Treści w komponencie WebView

Komponent WebView w aplikacji platformowej korzysta z przeglądarki. Deweloperzy muszą przetestować, czy ograniczenia lub problemy, które wpływają na ich aplikacje, dotyczą również WebViewów aplikacji.

Aplikacje na Androida mogą też ustawiać pliki cookie bezpośrednio za pomocą interfejsu CookieManager API. Podobnie jak w przypadku plików cookie ustawianych za pomocą nagłówków lub JavaScriptu, rozważ dodanie tagu SameSite=None; Secure, jeśli pliki cookie mają być używane w wielu witrynach.

Jak zaimplementować SameSite już dziś

W zależności od potrzeb opatrz pliki cookie, które są potrzebne tylko w kontekście tej samej strony, tagiem SameSite=Lax lub SameSite=Strict. Jeśli nie oznaczysz tych plików cookie i zamiast tego polegasz na domyślnym zachowaniu przeglądarki, mogą one działać niejednoznacznie w różnych przeglądarkach i potencjalnie wywoływać ostrzeżenia konsoli dla każdego pliku cookie.

Set-Cookie: first_party_var=value; SameSite=Lax

Pamiętaj, aby oznaczyć wszystkie pliki cookie wymagane w kontekście zewnętrznym jako SameSite=None; Secure. Oba atrybuty są wymagane. Jeśli określisz tylko None bez Secure, plik cookie zostanie odrzucony. Ze względu na różnice w implementacjach przeglądarek może być konieczne zastosowanie niektórych strategii opisanych w artykule Zarządzanie nieobsługiwanymi klientami.

Set-Cookie: third_party_var=value; SameSite=None; Secure

Obsługa klientów niezgodnych

Te zmiany dotyczące None i aktualizacji domyślnego zachowania są stosunkowo nowe, dlatego różne przeglądarki obsługują je na różne sposoby. Listę znanych problemów znajdziesz na stronie aktualizacji na chromium.org. Może ona nie być wyczerpująca.

Jednym z możliwych rozwiązań jest ustawienie każdego pliku cookie w nowym i starym stylu:

Set-cookie: 3pcookie=value; SameSite=None; Secure
Set-cookie: 3pcookie-legacy=value; Secure

Przeglądarki obsługujące nowsze zachowanie ustawiają plik cookie z wartością SameSite. Przeglądarki, które nie obsługują nowego zachowania, ignorują tę wartość i ustawiają plik cookie 3pcookie-legacy. Podczas przetwarzania plików cookie dołączonych witryna powinna najpierw sprawdzić, czy istnieje plik cookie nowego typu, a jeśli nie może go znaleźć, powinna użyć starszego pliku cookie.

Poniższy przykład pokazuje, jak to zrobić w środowisku Node.js przy użyciu platformy Express i jego oprogramowania pośredniczącego cookie-parser:

const express = require('express');
const cp = require('cookie-parser');
const app = express();
app.use(cp());

app.get('/set', (req, res) => {
  // Set the new style cookie
  res.cookie('3pcookie', 'value', { sameSite: 'none', secure: true });
  // And set the same value in the legacy cookie
  res.cookie('3pcookie-legacy', 'value', { secure: true });
  res.end();
});

app.get('/', (req, res) => {
  let cookieVal = null;

  if (req.cookies['3pcookie']) {
    // check the new style cookie first
    cookieVal = req.cookies['3pcookie'];
  } else if (req.cookies['3pcookie-legacy']) {
    // otherwise fall back to the legacy cookie
    cookieVal = req.cookies['3pcookie-legacy'];
  }

  res.end();
});

app.listen(process.env.PORT);

Takie podejście wymaga dodatkowego wysiłku związanego z ustawianiem zbędnych plików cookie i wprowadzaniem zmian zarówno w miejscu ustawiania, jak i odczytywania pliku cookie. Powinna jednak obejmować wszystkie przeglądarki niezależnie od ich zachowania i zapewniać działanie plików cookie innych firm.

Możesz też wykryć klienta za pomocą ciągu znaków klienta użytkownika, gdy wysyłany jest nagłówek Set-Cookie. Zapoznaj się z listą niezgodnych klientów i użyj odpowiedniej biblioteki wykrywania klientów użytkownika dla swojej platformy, np. biblioteki ua-parser-js w Node.js. To podejście wymaga wprowadzenia tylko 1 zmiany, ale wykrywanie typu użytkownika może nie obejmować wszystkich dotkniętych użytkowników.

Obsługa SameSite=None w językach, bibliotekach i platformach

Większość języków i bibliotek obsługuje atrybut SameSite w przypadku plików cookie. Ponieważ jednak SameSite=None to stosunkowo nowa funkcja, na razie może być konieczne obejście niektórych standardowych zachowań. Te zachowania są opisane w repozytorium przykładów SameSite na GitHubie.

Uzyskiwanie pomocy

Pliki cookie są używane w całej sieci, a zespoły programistów rzadko mają pełną wiedzę o tym, gdzie są tworzone i wykorzystywane w danej witrynie, zwłaszcza w przypadku korzystania z innych witryn. Jeśli napotkasz problem, być może jest to pierwszy raz, gdy ktoś się z nim zetknął. Nie wahaj się skontaktować z nami: