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 jakoSameSite=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.
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.
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.
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:
- Zgłoś problem w repozytorium przykładów
SameSite
w GitHubie. - Zadaj pytanie w sekcji „samesite” na StackOverflow.
- W przypadku problemów z działaniem Chromium zgłoś błąd w narzędziu do śledzenia błędów Chromium.
- Aby śledzić postępy w przygotowywaniu Chrome, otwórz stronę
SameSite
Aktualizacje.