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 jakoSameSite=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.
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.
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>
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:
- Zgłoś problem w repozytorium przykładów
SameSite
w GitHubie. - Zadaj pytanie w tagu „samesite” na StackOverflow.
- W przypadku problemów z działaniem Chromium zgłaszaj błędy w śledziku błędów Chromium.
- Śledź postęp aktualizacji Chrome na stronie
SameSite
Aktualizacje.