Różnica pomiędzy sesją, a ciasteczkami

0

Cześć, chciałbym się dowiedzieć jaka jest różnica pomiędzy sesją a ciasteczkami, a właściwie co w nich przechowywać. Wiadomo że hasło czy login użytkownika lepiej przechowywać sesji ale tak poza tym to jakie dane lepiej przechowywać w sesji a jakie w ciasteczkach.

4

Tak na prawdę to to są dwa zupełnie różne mechanizmy które nie mają ze sobą nic wspólnego, poza tym że w obu możesz przechowywać dane, ale to równie dobrze mógłbyś zadać pytanie "sesja vs pliki" albo "sesja vs baza".

  1. Ciasteczka, czyli po prostu nagłówek o nazwie Set-Cookie jest wysyłany przez serwer do klienta, podczas requestu HTTP (np z przeglądarki). Możesz np dostać nagłówek Set-Cookie: abcdef. Następnie istnieje konwencja, że klient HTTP odsyła inny nagłówek, tym razem Cookie: abcdef do serwera. Polegając na takiej konwencji można użyć takiego nagłówka żeby zachować jakąś formę stanu pomiędzy odświeżeniem strony. Jednak należy pamiętać że to klient (np przeglądarka) ma pełną kontrolę nad tym co znajduje się w Cookie, bo wcale nie musi go odesłać albo może wysłać całkiem inny. Można ewentualnie próbować zabezpieczyć dane w cookies, np poprzez JWT, jeśli nie chcemy korzystać z innych mechanizmów.
  2. Sesja, to sposób persystencji danych na serwerze i działa to w taki sposób, że serwer zapisuje sobie w pamięci jakieś dane, i generuje dla nich identyfikator, np 123jjdnsaj334. Następnie taki identyfikator jest odsyłany w odpowiedzi żądania do klienta. Jeśli podczas następnego requestu klient HTTP (czyli np przeglądarka) odeśle taki indetyfikator sesji, to wtedy będziemy mieli dostęp do danych zapisanych w sesji na serwerze pod tym identyfikatorem. Jeśli nie, to nie. Tutaj przeglądarka nie może modyfikować tych danych, jedyne co może zrobić to odesłać identyfikator, odesłać inny (i jedyne co może zrobić to próbować go zgadnąć), albo nie odesłać nic - czyli zniszczyć sesję.
1

Uzupełniając powyższe zobacz jeszcze to:
https://www.javatpoint.com/session-vs-cookies

3
TomRiddle napisał(a):

Tak na prawdę to to są dwa zupełnie różne mechanizmy które nie mają ze sobą nic wspólnego, poza tym że w obu możesz przechowywać dane, ale to równie dobrze mógłbyś zadać pytanie "sesja vs pliki" albo "sesja vs baza"

Taki opis może być mylący, bo de facto oba mechanizmy oparte są o plik cookie na komputerze użytkownika.
W obu przypadkach tworzony jest plik cookie tylko jego zawartość jest inna i do czego innego służy. W skrócie ciasteczko przechowuje co chcesz i na stałe znajduje się to na komputerze użytkownika. Dzięki temu przeglądarka ma możliwość odczytania go i jakiejś interakcji. Np. ustawiasz tam rodzaj tła w serwisie jaki sobie wybrał użytkownik. Język interfejsu dla stron wielojęzycznych. Jednakże nie trzymasz tam niczego odpowiadającego za bezpieczeństwo lub danych, które nie powinny być modyfikowane.
Sesja z kolei to mechanizm gdzie specjalne cookies jest stworzone, w którym przechowywany jest tylko identyfikator. Ten identyfikator służy do znalezienia pliku z danymi po stronie serwera, do którego zawartości nie ma dostępu użytkownik.
Przykładowo mamy koszyk w sklepie. Kupujemy następny produkt i musimy przejść między stronami. W koszyku trzymamy ilość i cenę produktu. Po pierwsze musimy jakoś trzymać te dane przy przechodzeniu między stronami. Po drugie te dane nie mogą być modyfikowane od strony użytkownika. Zostaje nam więc użycie sesji.

No i teraz jesteś w stanie np. wziąć jeden plik cookie z sesją, skopiować go na inny komputer. Nie wylogowujac się z jakiegoś serwisu np. strony banku pozostawiamy aktywną sesję. Mając taki plik skopiowany na inny komputer przeglądarka może otworzyć Ci stronę bez konieczności zalogowania.
Resztę dobrze opisali koledzy.

0

Nie jest jeszcze tak, że sesja "zmieści" więcej danych niż cookie? Mam na myśli zmienne sesyjne.

3

@kosmonauta80: cookie jest po stronie przeglądarki z tego co kojarzę jeśli nic się nie zmieniło dla super nowoczesnych to ciągle jest limit 4KB na plik ciasteczka.
No ale sesja - jej dane, są trzymane po stronie serwera a nie klienta. Nie ma więc typowego limitu. Pewnie maksimum przydziału pamięci na wątek serwera czyli dla podstawowych ustawień PHP.ini 128MB.

0
jurek1980 napisał(a):

No i teraz jesteś w stanie np. wziąć jeden plik cookie z sesją, skopiować go na inny komputer. Nie wylogowujac się z jakiegoś serwisu (...) Mając taki plik skopiowany na inny komputer przeglądarka może otworzyć Ci stronę bez konieczności zalogowania.

jak się przed tym zabezpieczyć, ale nie rezygnując z takiego mechanizmu sesji?

0

Nie ma potrzeby się przed tym zabezpieczać (jeśli korzystasz z frameworków, które sesje ogarniają za Ciebie) z tego względu, że jedna możliwość, żeby takie cookie wyciekło to użytkownik, który tę sesje po prostu sobie weźmie. Równie dobrze mógłby dać komuś hasło. A jeśli ktoś nieautoryzowany ma dostęp do komputera to i tak może namieszać. Sesja jest w ciasteczku, do którego Javascript nie ma dostępu wiec przez JS nic nie wycieknie.

Można też również daną sesję przypisać do danego komputera i niektóre frameworki tak pewnie robią

1 użytkowników online, w tym zalogowanych: 0, gości: 1