Browser Support
Każdy plik cookie zawiera parę klucz-wartość oraz szereg atrybutów, które określają, kiedy i gdzie jest on używany.
Wprowadzenie atrybutu SameSite (zdefiniowanego w RFC6265bis) pozwala zadeklarować, czy plik cookie jest ograniczony do kontekstu własnego czy tej samej witryny. Warto dokładnie zrozumieć, co oznacza tutaj „witryna”.
Witryna to połączenie sufiksu domeny i części domeny, która znajduje się bezpośrednio przed nim. Na przykład domena www.web.dev jest częścią witryny web.dev.
Kluczowe pojęcie: jeśli użytkownik jest na stronie www.web.dev i prosi o obraz ze strony static.web.dev, jest to żądanie w tej samej witrynie.
Lista domen publicznych określa, które strony są uznawane za należące do tej samej witryny. Nie zależy tylko od domen najwyższego poziomu, takich jak .com, ale może też obejmować usługi takie jak github.io. Dzięki temu adresy your-project.github.io i my-project.github.io są liczone jako osobne witryny.
Kluczowe pojęcie: jeśli użytkownik jest na stronie your-project.github.io i prosi o obraz ze strony my-project.github.io, jest to żądanie z innej witryny.
Używanie atrybutu SameSite do deklarowania użycia plików cookie
Atrybut SameSite pliku cookie umożliwia kontrolowanie tego zachowania na 3 sposoby. Możesz nie określać atrybutu lub użyć wartości Strict lub Lax, aby ograniczyć plik cookie do żądań z tej samej witryny.
Jeśli ustawisz SameSite na Strict, plik cookie może być wysyłany tylko w kontekście własnym, czyli wtedy, gdy witryna, do której należy plik cookie, jest zgodna z witryną wyświetlaną na pasku adresu przeglądarki. Jeśli plik cookie promo_shown jest ustawiony w ten sposób:
Set-Cookie: promo_shown=1; SameSite=Strict
Gdy użytkownik jest w Twojej witrynie, plik cookie jest wysyłany z żądaniem zgodnie z oczekiwaniami.
Jeśli jednak użytkownik kliknie link do Twojej witryny z innej witryny, plik cookie nie zostanie wysłany w ramach tego początkowego żądania.
To dobre rozwiązanie w przypadku plików cookie związanych z funkcjami, które zawsze wymagają początkowej nawigacji, takimi jak zmiana hasła lub dokonanie zakupu, ale jest zbyt restrykcyjne w przypadku plików cookie takich jak promo_shown. Jeśli czytelnik kliknie link do witryny, chce, aby plik cookie został wysłany, dzięki czemu będzie można zastosować jego preferencje.
SameSite=Lax umożliwia przeglądarce wysyłanie pliku cookie z tymi nawigacjami najwyższego poziomu. Jeśli na przykład inna witryna odwołuje się do treści Twojej witryny, w tym przypadku używając zdjęcia kota i podając link do Twojego artykułu w ten sposób:
<p>Look at this amazing cat!</p>
<img src="https://blog.example/blog/img/amazing-cat.png" />
<p>Read the <a href="https://blog.example/blog/cat.html">article</a>.</p>
Plik cookie jest ustawiony na Lax w ten sposób:
Set-Cookie: promo_shown=1; SameSite=Lax
Gdy przeglądarka żąda amazing-cat.png dla bloga innej osoby, Twoja witryna nie wysyła pliku cookie. Jednak gdy czytelnik kliknie link do cat.html w Twojej witrynie, żądanie będzie zawierać plik cookie.
Zalecamy używanie SameSite w ten sposób, ustawiając pliki cookie, które wpływają na wyświetlanie witryny, na Lax, a pliki cookie związane z działaniami użytkownika na Strict.
Możesz też ustawić parametr SameSite na None, aby wskazać, że plik cookie ma być wysyłany we wszystkich kontekstach. Jeśli udostępniasz usługę, z której korzystają inne witryny, np. widżety, treści umieszczone, programy partnerskie, reklamy lub logowanie w wielu witrynach, użyj None, aby jasno określić swoje intencje.
None, Lax lub Strict.
Zmiany działania domyślnego bez atrybutu SameSite
Browser Support
Atrybut SameSite jest powszechnie obsługiwany, ale nie jest powszechnie stosowany.
W przeszłości ustawienie plików cookie bez atrybutu SameSite domyślnie powodowało wysyłanie ich we wszystkich kontekstach, co narażało użytkowników na ataki CSRF i niezamierzone wycieki informacji. Aby zachęcić deweloperów do określania swoich zamiarów i zapewnić użytkownikom większe bezpieczeństwo, propozycja IETF, Incrementally Better Cookies, wprowadza 2 kluczowe zmiany:
- Pliki cookie bez atrybutu
SameSitesą traktowane jakoSameSite=Lax. - Pliki cookie z atrybutem
SameSite=Nonemuszą też mieć określony atrybutSecure, co oznacza, że wymagają bezpiecznego kontekstu.
Obie te zmiany są zgodne wstecznie z przeglądarkami, które prawidłowo implementują poprzednią wersję atrybutu SameSite, oraz z przeglądarkami, które nie obsługują wcześniejszych wersji atrybutu SameSite. Ich celem jest zmniejszenie zależności deweloperów od domyślnego działania przeglądarek przez wyraźne określenie działania i zamierzonego zastosowania plików cookie. Klienty, które nie rozpoznają tagu SameSite=None, powinny go ignorować.
SameSite=Lax domyślnie
Jeśli wyślesz plik cookie bez określenia atrybutu SameSite, przeglądarka potraktuje go tak, jakby miał ustawioną wartość SameSite=Lax. Nadal zalecamy jawne ustawienie SameSite=Lax, aby zapewnić użytkownikom bardziej spójne wrażenia w różnych przeglądarkach.
SameSite=None musi być bezpieczny
Gdy tworzysz pliki cookie z innej witryny za pomocą atrybutu SameSite=None, musisz też ustawić je na Secure, aby przeglądarka je akceptowała:
Set-Cookie: widget_session=abc123; SameSite=None; Secure
Możesz przetestować to działanie w Chrome 76, włączając about://flags/#cookies-without-same-site-must-be-secure, a w Firefoksie 69, ustawiając network.cookie.sameSite.noneRequiresSecure w about:config.
Zalecamy też jak najszybsze zaktualizowanie istniejących plików cookie do wersji Secure.
Jeśli korzystasz z usług, które udostępniają treści osób trzecich w Twojej witrynie, upewnij się, że dostawca usługi aktualizuje pliki cookie, i zaktualizuj wszystkie fragmenty kodu lub zależności w witrynie, aby mieć pewność, że korzysta ona z nowego zachowania.
Przepisy na ciasteczka: SameSite
Więcej informacji o aktualizowaniu plików cookie w celu prawidłowej obsługi tych
zmian w SameSite=None oraz o różnicach w zachowaniu przeglądarek znajdziesz w
artykule SameSite cookie recipes (Przepisy na pliki cookie z atrybutem SameSite).
Dziękujemy za wkład i opinie Lily Chen, Malte Ubla, Mike'a Westa, Roba Dodsona, Toma Steinera i Viveka Sekhara.