Secure, HttpOnly, SameSite: ochrona ciasteczek i ograniczenia

Management Summary
Cookies to małe wartości zapisywane w przeglądarce, często podtrzymujące logowanie na stronie. Ustawienia ochrony określają, dokąd mogą być wysyłane i jaki kod strony może je odczytać. Secure wymaga chronionego połączenia, HttpOnly blokuje bezpośredni dostęp skryptów, a SameSite ogranicza użycie między witrynami. Artykuł wyjaśnia współpracę tych zabezpieczeń i znaczenie celu danego ciasteczka. Są częścią bezpieczeństwa aplikacji, a nie jego pełnym zastępstwem.
Spis treści
Secure, HttpOnly i SameSite chronią różne elementy wykorzystania ciasteczek. Właściwa kombinacja zależy od celu: identyfikator sesji, po którym serwer rozpoznaje istniejące logowanie, potrzebuje innych właściwości niż nieszkodliwe ustawienie wyglądu odczytywane przez JavaScript. Samo liczenie atrybutów nie daje więc rankingu bezpieczeństwa.
Secure: przesyłanie przez HTTPS
Secure ogranicza przesyłanie do bezpiecznych połączeń, w zwykłych witrynach do HTTPS. Przeglądarki przewidują wyjątki dla localhost. Atrybut nie dodaje osobnego szyfrowania wartości ciasteczka ani nie blokuje dostępu JavaScript.
Bez Secure pasujące ciasteczko może zostać przesłane otwartym tekstem w żądaniu HTTP. Późniejsze przekierowanie na HTTPS jest dla tego żądania spóźnione. Już obowiązujące HSTS może zmienić połączenie przed wysłaniem; nowo odebrany nagłówek HSTS nie chroni jednak wstecz pierwszego żądania HTTP. Samo HTTPS nie dodaje automatycznie Secure do ciasteczek.
HttpOnly: brak dostępu przez document.cookie
HttpOnly ukrywa ciasteczko przed zwykłymi interfejsami JavaScript do obsługi ciasteczek. Utrudnia to bezpośrednią kradzież wartości sesji przez wstrzyknięty skrypt. Przeglądarka nadal może dołączać ciasteczko do odpowiednich żądań, także zainicjowanych przez JavaScript. HttpOnly nie usuwa zatem podatności XSS (wykonywania wstrzykniętych skryptów) ani nie blokuje wszystkich działań w przejętej sesji.
HttpOnly jest zazwyczaj właściwe dla serwerowych identyfikatorów sesji. Ustawienie wyglądu celowo odczytywane przez JavaScript nie może natomiast korzystać z tego atrybutu. JavaScript nie ustawi HttpOnly przez document.cookie. Brak atrybutu wymaga więc oceny według celu ciasteczka, a nie samej częstości występowania.
SameSite: kontekst zamiast szyfrowania
Same-site nie oznacza same-origin. W przypadku zwykłych domen liczy się schemat oraz domena rejestrowalna. Na przykład https://shop.example.com i https://login.example.com są same-site, ale mają różne origins. Zmiana HTTPS na HTTP oznacza cross-site.
Strict: ogranicza konteksty cross-site; nawet wejście z zewnętrznego odnośnika może początkowo nastąpić bez ciasteczka.Lax: dodatkowo dopuszcza wybrane nawigacje cross-site w głównym oknie przeglądarki, używające bezpiecznych metod, na przykład zwykły odnośnik GET. Osadzony zasób lub zwykły cross-site POST nie spełnia tych warunków.None: usuwa ograniczenie SameSite i wymaga Secure. Pozostałe reguły ciasteczek i prywatności nadal obowiązują; dostępność ciasteczek podmiotów trzecich nie jest gwarantowana.
Niektóre przeglądarki stosują domyślne Lax przy braku atrybutu. Takie ustawienie może obejmować krótkotrwały wyjątek dla POST przy niedawno ustawionych ciasteczkach. Brak SameSite nie oznacza zatem ani nieograniczonego przesyłania, ani pełnej ochrony przed CSRF (niechcianymi żądaniami wykorzystującymi istniejące logowanie). Jawne wartości SameSite ułatwiają ocenę zasad przesyłania. Żądania zmieniające dane, na przykład aktualizacja adresu, wymagają też zabezpieczeń takich jak weryfikowane tokeny CSRF.

Przykład identyfikatora sesji obsługiwanego przez serwer
Set-Cookie: __Host-session=SERVER_GENERATED_RANDOM_VALUE; Path=/; Secure; HttpOnly; SameSite=Lax
SERVER_GENERATED_RANDOM_VALUE to symbol zastępczy bezpiecznej wartości losowej generowanej przez serwer. W obsługujących przeglądarkach prefiks __Host- wymaga Secure, Path=/ i braku atrybutu Domain. Ciasteczko pozostaje dzięki temu ograniczone do ustawiającego hosta. Lax to możliwa konfiguracja początkowa; przekierowania logowania i aplikacje osadzone wymagają osobnych testów działania.

Co rzeczywiście wykazuje kontrola nagłówków
Wiersz Set-Cookie jest początkowo instrukcją, a nie dowodem zapisania ciasteczka. Przeglądarka może odrzucić instrukcję; wiersz może również zastępować lub usuwać ciasteczko. Odpowiedzi z kolejnych przekierowań wymagają osobnego zapisu.
Zwykłe pobranie strony głównej pomija również ciasteczka utworzone przez JavaScript oraz odpowiedzi na późniejsze żądania skryptów, obrazów i API. Brak Set-Cookie w głównym dokumencie nie oznacza więc, że witryna nie ustawia żadnych ciasteczek. Nawet wizyta bez kliknięć może uruchomić skrypty i kolejne żądania.
Rzetelna kontrola dokumentuje świeży profil przeglądarki, wersję, adres początkowy, czas i kolejność interakcji. Odpowiedzi sieciowe oraz faktycznie zapisane ciasteczka porównuje się osobno. Każde ciasteczko wymaga opisu celu, hosta, ścieżki, czasu życia i potrzeby dostępu przez skrypt. Sam licznik atrybutów nie odpowiada na te pytania.
Pytania i odpowiedzi
Czy HttpOnly jest ważniejsze niż Secure?
Ogólna hierarchia nie jest użyteczna. Identyfikator sesji wymaga ochrony transportu oraz przed bezpośrednim odczytem przez skrypt. SameSite dodaje ograniczenia kontekstu. Żaden z tych atrybutów nie zastępuje kontroli uprawnień na serwerze ani usunięcia XSS.
Czy Path bezpiecznie oddziela aplikacje?
Path steruje wyborem ciasteczek do wysłania, ale nie jest niezawodną granicą bezpieczeństwa wobec skryptów na tym samym hoście. Osobne obszary zaufania wymagają odpowiedniego podziału hostów i aplikacji.
Czy wysoki udział atrybutów dowodzi bezpieczeństwa witryny?
Nie. Brak HttpOnly może być celowy dla nieszkodliwego ustawienia JavaScript; ciasteczko sesji ze wszystkimi atrybutami może nadal należeć do podatnej aplikacji. O ocenie decydują cel, rzeczywiste zachowanie przeglądarki i przetwarzanie na serwerze.