Każdy plik cookie zawiera parę klucz-wartość oraz kilka atrybutów, które określają, kiedy i gdzie plik cookie jest używany.
Dzięki wprowadzeniu atrybutu SameSite
(zdefiniowanym w dokumencie RFC6265bis) możesz zadeklarować, czy plik cookie jest ograniczony do kontekstu własnego czy tej samej witryny. Warto zrozumieć, co dokładnie oznacza słowo „witryna”.
Witryna składa się z przyrostka domeny i części domeny tuż przed nim. Na przykład domena www.web.dev
jest częścią witryny web.dev
.
Termin kluczowy: jeśli użytkownik jest na stronie www.web.dev
i prosi o obraz z witryny static.web.dev
, to jest to żądanie na tej samej stronie.
Lista domen publicznych określa, które strony są uznawane za znajdujące się w tej samej witrynie. Nie zależy tylko od domen najwyższego poziomu, takich jak .com
, ale może obejmować też usługi takie jak github.io
. Dzięki temu atrybuty your-project.github.io
i my-project.github.io
będą zliczane jako osobne witryny.
Termin kluczowy: jeśli użytkownik jest w witrynie your-project.github.io
i wysyła żądanie obrazu z witryny my-project.github.io
, jest to żądanie międzywitrynowe.
Użyj atrybutu SameSite
, aby zadeklarować użycie plików cookie
Atrybut SameSite
w ciasteczkach umożliwia kontrolowanie tego zachowania na 3 sposoby. Możesz nie podawać atrybutu lub użyć wartości Strict
lub Lax
, aby ograniczyć plik cookie do żądań w ramach tej samej witryny.
Jeśli ustawisz SameSite
jako Strict
, plik cookie będzie wysyłany tylko we własnym kontekście, czyli tylko wtedy, gdy witryna, do której prowadzi plik cookie, odpowiada witrynie wyświetlanej na pasku adresu przeglądarki. Jeśli plik cookie promo_shown
ma takie ustawienia:
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 pierwszego żądania.
Jest to dobre rozwiązanie w przypadku plików cookie związanych z funkcjami, które zawsze wymagają początkowej nawigacji, np. zmiany hasła lub dokonania zakupu, ale jest zbyt restrykcyjne w przypadku plików cookie takich jak promo_shown
. Jeśli czytelnik kliknie link do witryny, będzie chciał wysłać plik cookie, aby można było zastosować jego preferencje.
SameSite=Lax
umożliwia przeglądarce wysyłanie plików cookie przy użyciu tych nawigacji najwyższego poziomu. Jeśli na przykład inna witryna odwołuje się do zawartości Twojej witryny, w tym przypadku użyj swojego zdjęcia kota i podaj link do artykułu w następujący 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>
Gdy plik cookie jest ustawiony na Lax
:
Set-Cookie: promo_shown=1; SameSite=Lax
Gdy przeglądarka wysyła żądanie amazing-cat.png
do bloga innej osoby, Twoja witryna nie wysyła pliku cookie. Jeśli jednak czytelnik kliknie w Twojej witrynie link do cat.html
, żądanie znajdzie plik cookie.
Zalecamy użycie w tym celu atrybutu SameSite
, 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ć wartość 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 osadzone, programy partnerskie, reklamy lub logowanie w wielu witrynach, użyj tagu None
, aby jasno określić swój cel.
Zmiany w domyślnym zachowaniu bez SameSite
Obsługa przeglądarek
Atrybut SameSite
jest powszechnie obsługiwany, ale nie został powszechnie przyjęty.
W przeszłości ustawienie plików cookie bez parametru SameSite
powodowało ich wysyłanie we wszystkich kontekstach, co narażało użytkowników na ataki CSRF i nieumyślne wycieki informacji. Aby zachęcić deweloperów do określenia swoich zamiarów i zapewnić użytkownikom większe bezpieczeństwo, w ramach propozycji IETF, czyli wzrostu liczby lepszych plików cookie, wprowadzamy 2 kluczowe zmiany:
- Pliki cookie bez atrybutu
SameSite
są traktowane jakoSameSite=Lax
. - Pliki cookie z atrybutem
SameSite=None
muszą też określaćSecure
, co oznacza, że wymagają bezpiecznego kontekstu.
Obie te zmiany są zgodne ze starszymi wersjami w przeglądarkach, które poprawnie zaimplementowały poprzednią wersję atrybutu SameSite
, a także w przeglądarkach, które nie obsługują starszych wersji atrybutu SameSite
. Mają one zmniejszyć zależność programistów od domyślnego zachowania przeglądarek przez informowanie o działaniu plików cookie i jego zamierzonym zastosowaniu. Klienci, którzy nie rozpoznają tagu SameSite=None
, powinni go zignorować.
SameSite=Lax
domyślnie
Jeśli wyślesz plik cookie bez atrybutu SameSite
, przeglądarka będzie traktować go tak, jakby miał wartość SameSite=Lax
. Nadal zalecamy jawne ustawienie wartości SameSite=Lax
, aby zapewnić użytkownikom spójne wrażenia w różnych przeglądarkach.
SameSite=None
musi być zabezpieczony
Gdy tworzysz pliki cookie między witrynami za pomocą atrybutu SameSite=None
, musisz je też ustawić na Secure
, aby przeglądarka je zaakceptowała:
Set-Cookie: widget_session=abc123; SameSite=None; Secure
Możesz przetestować to zachowanie od Chrome 76, włączając about://flags/#cookies-without-same-site-must-be-secure
, a od Firefoksa 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 w swojej witrynie z usług, które dostarczają treści innych firm, dopilnuj, by dostawca usług zaktualizował ich pliki cookie oraz zaktualizuj wszystkie fragmenty kodu i zależności w witrynie, aby obsługiwały nowe funkcje.
SameSite
przepisów na ciasteczka
Więcej informacji o aktualizowaniu plików cookie w celu prawidłowego obsługiwania zmian w SameSite=None
i różnic w zachowaniu przeglądarki znajdziesz w artykule SameSite cookie recipes (w języku angielskim).
Dziękujemy za opinie i opinie Lily Chen, Malte Ubl, Mike'a Westa, Roba Dodson, Toma Steinera i Viveka Sekhara.
Baner powitalny z ciasteczkiem autorstwa Pille-Riin Priske na Unsplash