Cookie, localStorage czy sesja — gdzie trzymać dane
Trzy miejsca na dane użytkownika, trzy zupełnie różne zastosowania. Wybór złego to albo wyciek danych, albo koszyk, który znika po odświeżeniu strony.
Aplikacja webowa musi coś o użytkowniku pamiętać: że jest zalogowany, co ma w koszyku, jaki wybrał motyw. Miejsc do wyboru jest kilka i różnią się bardziej, niż mogłoby się wydawać.
Cookie
Mały kawałek tekstu zapisany w przeglądarce, który dołącza się automatycznie do każdego żądania do serwera. To jedyny z tych mechanizmów, o którym serwer wie bez dodatkowej pracy — i dlatego trzymamy w nim identyfikator sesji.
Ma limit około 4 kilobajtów i termin ważności. Przy ciasteczkach logowania zawsze ustawiaj trzy flagi:
HttpOnly— JavaScript nie ma do niego dostępu, więc nie ukradnie go wstrzyknięty skrypt,Secure— wysyłane wyłącznie po HTTPS,SameSite— nie doklei się do żądania z obcej strony, co blokuje część ataków.
localStorage
Około 5 megabajtów miejsca w przeglądarce, dane zostają po zamknięciu karty i nigdy same nie lecą na serwer. Idealne na drobne wygody: wybrana zakładka, zwinięty panel, tryb ciemny, niewysłany szkic formularza.
Nigdy nie trzymaj tu tokenów logowania ani danych osobowych. Każdy skrypt na stronie — także ten doklejony przez wtyczkę lub reklamę — czyta localStorage bez przeszkód.
sessionStorage
To samo co localStorage, tylko znika po zamknięciu karty i nie jest współdzielone między kartami. Pasuje do stanu jednego procesu: krok formularza wieloetapowego, filtry na liście produktów.
Sesja serwerowa
Dane leżą na serwerze, a przeglądarka trzyma jedynie identyfikator w ciasteczku. To najbezpieczniejsze miejsce na wszystko, co wrażliwe: kto jest zalogowany, jakie ma uprawnienia, co jest w koszyku przed złożeniem zamówienia.
Użytkownik nie może tych danych podejrzeć ani podmienić — widzi tylko losowy ciąg znaków.
Ściągawka
| Co chcesz zapamiętać | Gdzie |
|---|---|
| Kto jest zalogowany | sesja serwerowa + ciasteczko z HttpOnly |
| Koszyk w sklepie | sesja serwerowa (a po zalogowaniu — baza) |
| Tryb ciemny, wybrana zakładka | localStorage |
| Krok formularza wieloetapowego | sessionStorage |
| Zgoda na ciasteczka | cookie albo localStorage |
Prosta zasada na koniec: jeśli podmiana wartości przez użytkownika mogłaby mu coś dać, dane muszą siedzieć na serwerze. Cena produktu w localStorage to zaproszenie do zakupów za złotówkę.
Komentarze (4)
Przeczytaj też
Polskie znaki, krzaczki i UTF-8 w pigułce
żółw zamiast żółw to klasyk, który potrafi zepsuć całą stronę. Winne jest prawie zawsze jedno: dwa miejsca w systemie dogadują się w innym kodowaniu.
SQL czy NoSQL — kiedy co ma sens
Bazy relacyjne mają czterdzieści lat i nadal obsługują większość świata. NoSQL nie przyszedł ich zastąpić, tylko rozwiązać kilka konkretnych problemów, z którymi radzą sobie gorzej.
WebSocket w Node: kiedy strona ma odzywać się sama
Zwykły HTTP działa jak wysyłanie listów: klient pyta, serwer odpowiada. Przy czacie czy powiadomieniach to za mało — potrzebna jest linia telefoniczna, którą obie strony mogą się odezwać w dowolnym momencie. Od tego jest WebSocket.