Każdy plik cookie zawiera parę klucz-wartość oraz szereg atrybutów, które kontrolują miejsce i czas używania tego pliku.
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 tu słowo „witryna”.
Witryna to połączenie sufiksu domeny i części domeny tuż przed nim. Na przykład domena www.web.dev
jest częścią witryny web.dev
.
Kluczowe hasło: jeśli użytkownik korzysta z www.web.dev
i prosi o zdjęcie z static.web.dev
, jest to żądanie dotyczące tej samej witryny.
Lista domen publicznych określa, które strony są uznawane za znajdujące się w tej samej witrynie. Zależy ona nie tylko od domen najwyższego poziomu, takich jak .com
, ale może również obejmować usługi takie jak github.io
. Dzięki temu your-project.github.io
i my-project.github.io
będą liczone jako oddzielne witryny.
Kluczowe hasło: jeśli użytkownik korzysta z your-project.github.io
i prosi o zdjęcie z my-project.github.io
, jest to żądanie z innej witryny.
Aby zadeklarować użycie plików cookie, użyj atrybutu SameSite
Atrybut SameSite
w pliku cookie udostępnia 3 różne sposoby kontrolowania tego zachowania. Możesz nie określać atrybutu albo użyć właściwości Strict
lub Lax
, aby ograniczyć plik cookie do żądań pochodzących z tej samej witryny.
Jeśli ustawisz SameSite
na Strict
, plik cookie będzie wysyłany tylko w kontekście własnym, czyli gdy witryna powiązana z plikiem cookie jest zgodna z witryną widoczną na pasku adresu przeglądarki. Jeśli więc plik cookie promo_shown
jest skonfigurowany w ten sposób:
Set-Cookie: promo_shown=1; SameSite=Strict
Gdy użytkownik odwiedza witrynę, plik cookie jest wysyłany z żądaniem zgodnie z oczekiwaniami.
Jeśli jednak użytkownik kliknie link do Twojej witryny z innego źródła, plik cookie nie zostanie wysłany w ramach tego pierwotnego żądania.
Jest to przydatne w przypadku plików cookie związanych z funkcjami, od których zawsze można nawigować (np. zmiana hasła czy dokonanie zakupu), ale jest zbyt restrykcyjne dla plików cookie takich jak promo_shown
. Jeśli czytelnik kliknie link do witryny, chce wysłać plik cookie, aby zastosować wybrane ustawienia.
SameSite=Lax
umożliwia przeglądarce wysyłanie pliku cookie z nawigacją najwyższego poziomu. Jeśli na przykład inna witryna odwołuje się do treści Twojej witryny, w tym przypadku użyj zdjęcia kota i podaj link do 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>
Z plikiem cookie ustawionym na Lax
w następujący sposób:
Set-Cookie: promo_shown=1; SameSite=Lax
Gdy przeglądarka wysyła żądanie amazing-cat.png
dotyczące bloga innej osoby, witryna nie wysyła pliku cookie. Jeśli jednak czytelnik kliknie w Twojej witrynie link do strony cat.html
, żądanie nie obejmie pliku cookie.
Zalecamy korzystanie z SameSite
w ten sposób, ustawienie plików cookie, które wpływają na wyświetlanie witryny na Lax
, a plików cookie związanych z działaniami użytkownika – na Strict
.
Możesz też ustawić SameSite
na None
, aby wskazać, że plik cookie ma być wysyłany we wszystkich kontekstach. Jeśli oferujesz usługę używaną przez inne witryny, np. widżety, umieszczone treści, programy partnerskie, reklamy lub logowanie się w wielu witrynach, użyj None
, aby mieć pewność, że masz jasne intencje.
Zmiany w domyślnym działaniu bez wartości SameSite
Obsługa przeglądarek
- 80
- 86
- x
Atrybut SameSite
jest powszechnie obsługiwany, ale nie jest jeszcze powszechnie używany.
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 ryzyko CSRF i niezamierzonego wycieku informacji. Aby zachęcić deweloperów do wyrażenia zamiaru i zapewnienia użytkownikom większego bezpieczeństwa, propozycja IETF Coraz lepsze pliki cookie zawiera 2 kluczowe zmiany:
- Pliki cookie bez atrybutu
SameSite
są traktowane jakoSameSite=Lax
. - Pliki cookie z atrybutem
SameSite=None
muszą też zawierać parametrSecure
, co oznacza, że wymagają bezpiecznego kontekstu.
Obie te zmiany są zgodne wstecznie z przeglądarkami, które poprawnie wdrożyły poprzednią wersję atrybutu SameSite
, a także z przeglądarkami, które nie obsługują wcześniejszych wersji atrybutu SameSite
. Mają one zmniejszyć zależność programistów od domyślnego zachowania przeglądarek, ponieważ określają sposób działania plików cookie i jawnie określają ich przeznaczenie. Klienci, którzy nie rozpoznają SameSite=None
, powinni go ignorować.
SameSite=Lax
domyślnie
Jeśli wyślesz plik cookie bez określania atrybutu SameSite
, przeglądarka potraktuje go tak, jakby miał wartość SameSite=Lax
. Nadal zalecamy ustawienie SameSite=Lax
, aby zapewnić spójne wrażenia użytkowników w różnych przeglądarkach.
SameSite=None
musi być bezpieczny
Gdy tworzysz pliki cookie pochodzące z różnych stron za pomocą SameSite=None
, musisz też ustawić ich wartość Secure
, aby przeglądarka akceptowała je:
Set-Cookie: widget_session=abc123; SameSite=None; Secure
Możesz przetestować to działanie od Chrome 76, włączając about://flags/#cookies-without-same-site-must-be-secure
, a w przeglądarce Firefox w wersji 69, ustawiając opcję 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 dostarczają w Twojej witrynie treści osób trzecich, dopilnuj, by dostawca tych usług zaktualizował ich pliki cookie oraz że wszelkie fragmenty i zależności w Twojej witrynie korzystały z nowego sposobu działania.
Przepisy na ciastka: SameSite
Więcej informacji o aktualizowaniu plików cookie w celu obsługi tych zmian w SameSite=None
oraz o różnicach w działaniu przeglądarki znajdziesz w kolejnym artykule: Przepisy na pliki cookie SameSite.
Dziękujemy za wkład i opinie od Lily Chen, Malte Ubl, Mike'a Westa, Roba Dodsona, Toma Steinera i Viveka Sekhara.
Baner powitalny z plikiem cookie autorstwa: Pille-Riin Priske w serwisie Unsplash