Chrome, Firefox, Edge i inne przeglądarki zmieniają swoje domyślne działanie zgodnie z propozycją IETF, Incrementally Better Cookies, tak aby:
- Pliki cookie bez atrybutu
SameSitesą traktowane jakoSameSite=Lax, co oznacza, że domyślnie są one ograniczone do kontekstów tylko własnych. - Pliki cookie do użytku w wielu witrynach muszą określać atrybut
SameSite=None; Secure, aby można było je uwzględniać w kontekście zewnętrznym.
Jeśli jeszcze tego nie zrobiono, należy zaktualizować atrybuty plików cookie innych firm, aby w przyszłości nie były one blokowane.
Browser Support
Przypadki użycia plików cookie innych firm lub plików cookie w wielu witrynach
Istnieje wiele typowych przypadków użycia i wzorców, w których pliki cookie muszą być wysyłane w kontekście innej firmy. Jeśli korzystasz z jednego z tych przypadków użycia lub od niego zależy, upewnij się, że Ty lub dostawca aktualizujecie pliki cookie, aby usługa działała prawidłowo.
Treści w ramach <iframe>
Treści z innej witryny wyświetlane w <iframe> znajdują się w kontekście osoby trzeciej. Typowe przypadki użycia to:
- umieszczone treści udostępnione z innych witryn, takie jak filmy, mapy, przykłady kodu i posty w mediach społecznościowych;
- widżety usług zewnętrznych, takich jak płatności, kalendarze, rezerwacje i funkcje rezerwacji;
- Widżety, takie jak przyciski społecznościowe lub usługi przeciwdziałania oszustwom, które tworzą mniej oczywiste
<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 istniejącymi kontami.
Ze względu na to, że internet jest z natury kompozycyjny, <iframes> są też używane do osadzania treści wyświetlanych w kontekście najwyższego poziomu lub w kontekście pochodzącym z własnych danych. Wszystkie pliki cookie używane przez witrynę wyświetlaną w elemencie iframe są uważane za pliki cookie innych firm. Jeśli tworzysz witryny, które mają być osadzane w innych witrynach, i potrzebujesz plików cookie, aby działały, musisz też zadbać o to, aby były one oznaczone jako przeznaczone do użytku na różnych stronach lub aby można było bez nich płynnie przejść do innej opcji.
„Niebezpieczne” żądania w różnych witrynach
„Niebezpieczne” może brzmieć niepokojąco, ale odnosi się do każdej prośby, która 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. po kliknięciu linku do innej witryny. Jednak np. <form>przesłanie do innej witryny za pomocą metody POST nie obejmuje plików cookie.
Ten wzorzec jest używany w przypadku witryn, które mogą przekierowywać użytkownika do zdalnej usługi w celu wykonania określonej operacji przed powrotem, np. przekierowywać do zewnętrznego dostawcy tożsamości. Zanim użytkownik opuści witrynę, ustawiany jest plik cookie zawierający token jednorazowy. Zakłada się, że token ten można sprawdzić w przypadku żądania powrotnego, aby ograniczyć ataki typu Cross Site Request Forgery (CSRF). Jeśli żądanie zwrotne jest wysyłane za pomocą metody POST, musisz oznaczyć pliki cookie jako SameSite=None; Secure.
Zasoby zdalne
Każde zdalne źródło na stronie, np. tagi <img> lub <script>, może wymagać wysyłania plików cookie wraz z żądaniem. Częste przypadki użycia to piksele śledzące i personalizacja treści.
Dotyczy to też żądań wysyłanych z kodu JavaScript za pomocą funkcji fetch lub XMLHttpRequest. Jeśli funkcja fetch() jest wywoływana z opcją credentials: 'include', te żądania prawdopodobnie będą zawierać pliki cookie.
W przypadku parametru XMLHttpRequest oczekiwane pliki cookie są zwykle oznaczane wartością withCredentials w przypadku parametru true. Te pliki cookie muszą być odpowiednio oznaczone, aby można było je uwzględniać w żądaniach z innych witryn.
Treści w widoku WebView
Komponent WebView w aplikacji na konkretną platformę jest obsługiwany przez przeglądarkę. Deweloperzy muszą sprawdzić, czy ograniczenia lub problemy, które wpływają na ich aplikacje, dotyczą też widoków WebView w tych aplikacjach.
Android umożliwia też aplikacjom przeznaczonym na tę platformę bezpośrednie ustawianie plików cookie za pomocą interfejsu CookieManager API. Podobnie jak w przypadku plików cookie ustawianych za pomocą nagłówków lub JavaScriptu, rozważ dodanie atrybutu SameSite=None; Secure, jeśli mają być używane w wielu witrynach.
Jak wdrożyć SameSite już dziś
Oznacz wszystkie pliki cookie, które są potrzebne tylko w kontekście tej samej strony, jako SameSite=Lax lub SameSite=Strict w zależności od potrzeb. Jeśli nie oznaczysz tych plików cookie i zamiast tego będziesz polegać na domyślnym zachowaniu przeglądarki, mogą one działać niespójnie w różnych przeglądarkach i potencjalnie wywoływać ostrzeżenia w konsoli dla każdego pliku cookie.
Set-Cookie: first_party_var=value; SameSite=Lax
Pamiętaj, aby oznaczyć wszystkie pliki cookie potrzebne w kontekście innych stron jako SameSite=None; Secure. Oba atrybuty są wymagane. Jeśli podasz tylko None bez Secure, plik cookie zostanie odrzucony. Aby uwzględnić różnice w implementacjach przeglądarek, może być konieczne zastosowanie niektórych strategii łagodzących opisanych w artykule Obsługa niekompatybilnych klientów.
Set-Cookie: third_party_var=value; SameSite=None; Secure
Obsługa niezgodnych klientów
Zmiany te, które obejmują None i aktualizację domyślnego zachowania, są stosunkowo nowe, więc różne przeglądarki obsługują je na różne sposoby. Listę znanych problemów znajdziesz na stronie aktualizacji na chromium.org, ale 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, które obsługują nowsze działanie, ustawiają plik cookie z wartością SameSite. Przeglądarki, które nie obsługują nowego działania, ignorują tę wartość i ustawiają plik cookie 3pcookie-legacy. Podczas przetwarzania uwzględnionych plików cookie witryna powinna najpierw sprawdzić, czy występuje plik cookie w nowym stylu, a potem, jeśli nie znajdzie nowego pliku cookie, użyć starszego pliku cookie.
Poniższy przykład pokazuje, jak to zrobić w Node.js przy użyciu 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);
To podejście wymaga dodatkowej pracy związanej z ustawianiem nadmiarowych plików cookie i wprowadzaniem zmian w momencie ustawiania i odczytywania pliku cookie. Powinien on 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ą niekompatybilnych klientów i użyj odpowiedniej biblioteki wykrywania klienta użytkownika na swojej platformie, np. biblioteki ua-parser-js w Node.js. To podejście wymaga tylko jednej zmiany, ale wykrywanie agenta użytkownika może nie obejmować wszystkich użytkowników, których dotyczy problem.
Obsługa ustawienia zabezpieczeń SameSite=None w językach, bibliotekach i platformach
Większość języków i bibliotek obsługuje atrybut SameSite w przypadku plików cookie. Dodanie SameSite=None jest jednak stosunkowo niedawną zmianą, więc na razie może być konieczne obejście niektórych standardowych zachowań.
Te zachowania są opisane w SameSiterepozytorium przykładów w usłudze GitHub.
Uzyskiwanie pomocy
Pliki cookie są używane w całym internecie i rzadko zdarza się, aby zespół programistów miał pełną wiedzę o tym, gdzie witryna ustawia i wykorzystuje te pliki, zwłaszcza w przypadku użycia w innych witrynach. Jeśli napotkasz problem, może to być pierwszy raz, kiedy ktoś go napotkał, więc nie wahaj się skontaktować z nami:
- Zgłoś problem w
SameSiterepozytorium z przykładami w usłudze GitHub. - Zadaj pytanie na StackOverflow w tagu „samesite”.
- Jeśli masz problemy z działaniem Chromium, zgłoś błąd w narzędziu do śledzenia problemów z Chromium.
- Śledź postępy Chrome na
SameSitestronie z aktualizacjami.