Przepisy na ciastka SameSite

Chrome, Firefox, Edge i inne przeglądarki zmieniają 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ślnie pliki cookie są ograniczone tylko do 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 w wielu witrynach lub 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 przypadków użycia lub zależy Ci na jego obsłudze, upewnij się, że Ty lub dostawca aktualizujecie pliki cookie, aby usługa działała prawidłowo.

Treści w elementach <iframe>

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

  • 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.

Internet jest z zasady kompozytywny, dlatego <iframes> służą też do umieszczania treści wyświetlanych w kontekście najwyższego poziomu lub własnego. 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 internecie są to głównie żądania POST. Pliki cookie oznaczone jako SameSite=Lax są wysyłane podczas bezpiecznej nawigacji najwyższego poziomu, np. gdy klikniesz link, aby przejść do innej witryny. Jednak przesłanie danych za pomocą metody POST do innej witryny nie powoduje wysłania plików cookie.<form>

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ę, ustawiany jest plik cookie zawierający token jednorazowego użytku, który można sprawdzić w przywracanym żądaniu, aby ograniczyć ataki CSRF (Cross-Site Request Forgery). 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. Przykłady typowych zastosowań to śledzenie pikseli i personalizacja 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. Aby pliki cookie mogły być uwzględniane w żądaniach między witrynami, muszą być odpowiednio oznaczone.

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.

Android umożliwia też aplikacjom na konkretne platformy ustawianie plików 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ć jako SameSite=None; Secure wszystkie pliki cookie wymagane w kontekście innych firm. 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 obejść 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 stosują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 Node.js, korzystając z platformy Express i jej elementu 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 do wykrywania klienta na swojej platformie, np. biblioteki ua-parser-js w Node.js. W ramach tego podejścia musisz wprowadzić tylko jedną zmianę, ale wykrywanie typu użytkownika może nie objąć 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 wszędzie w internecie i rzadko zdarza się, aby jakikolwiek zespół programistów miał pełną wiedzę o tym, gdzie i jak są one używane w witrynie, zwłaszcza w przypadku przypadków użycia w wielu witrynach. Jeśli napotkasz problem, być może jest to pierwszy raz, gdy ktoś się z nim zetknął. Nie wahaj się skontaktować z nami: