Właśnie zaczynam się uczyć programowania aplikacji internetowych, używając Pythona. Spotykam terminy „ciasteczka” i „sesje”. Rozumiem, że pliki cookie przechowują niektóre informacje w parze klucz-wartość w przeglądarce. Ale mam trochę zamieszania co do sesji, również w sesji przechowujemy dane w pliku cookie w przeglądarce użytkownika.
Na przykład - loguję się przy użyciu username='rasmus'
i password='default'
. W takim przypadku dane zostaną opublikowane na serwerze, który ma mnie sprawdzić i zalogować, jeśli zostanie uwierzytelniony. Jednak podczas całego procesu serwer generuje również identyfikator sesji, który będzie przechowywany w pliku cookie w mojej przeglądarce. Teraz serwer przechowuje również ten identyfikator sesji w swoim systemie plików lub magazynie danych.
Ale na podstawie samego identyfikatora sesji, w jaki sposób mógłby poznać moją nazwę użytkownika podczas mojego kolejnego przejścia przez stronę? Czy przechowywanie danych na serwerze jako dict gdzie kluczem byłaby identyfikator sesji i szczegółów jak username
, email
itd być wartości?
Czuję się tutaj dość zmieszany. Potrzebuję pomocy.
źródło
Odpowiedzi:
Ponieważ HTTP jest bezstanowy, w celu powiązania żądania z dowolnym innym żądaniem potrzebny jest sposób przechowywania danych użytkownika między żądaniami HTTP.
Pliki cookie lub parametry adresu URL (np. Http://example.com/myPage?asd=lol&boo=no ) są odpowiednimi sposobami przesyłania danych między 2 lub więcej żądaniami. Nie są one jednak dobre, jeśli nie chcesz, aby te dane były czytelne / edytowalne po stronie klienta.
Rozwiązaniem jest przechowywanie tej strony serwera danych, nadawanie jej „id” i informowanie klienta (i przekazywanie z powrotem przy każdym żądaniu http) tego identyfikatora. Proszę bardzo, sesje wdrożone. Możesz też użyć klienta jako wygodnego zdalnego magazynu, ale szyfrowałbyś dane i utrzymywałeś tajny serwer.
Oczywiście należy wziąć pod uwagę inne aspekty, na przykład nie chcesz, aby ludzie przejmowali sesje innych, chcesz, aby sesje nie trwały wiecznie, ale wygasały i tak dalej.
W konkretnym przykładzie identyfikator użytkownika (może to być nazwa użytkownika lub inny unikalny identyfikator w bazie danych użytkownika) jest przechowywany w danych sesji po stronie serwera po udanej identyfikacji. Następnie dla każdego żądania HTTP otrzymanego od klienta identyfikator sesji (podany przez klienta) wskaże Ci prawidłowe dane sesji (przechowywane przez serwer), które zawierają uwierzytelniony identyfikator użytkownika - w ten sposób Twój kod będzie wiedział, jakiego użytkownika to rozmawia z.
źródło
Proste objaśnienie przez analogię
Wyobraź sobie, że jesteś w banku i próbujesz uzyskać pieniądze ze swojego konta. Ale jest ciemno; brzeg jest zupełnie czarny: nie ma światła i nie widać dłoni przed twarzą. Jesteś otoczony przez kolejne 20 osób. Wszystkie wyglądają tak samo. I każdy ma ten sam głos. I każdy jest potencjalnym złym facetem. Innymi słowy, HTTP jest bezstanowy.
Ten bank jest zabawnym rodzajem banku - dla argumentu oto, jak działają rzeczy:
Ale w jaki sposób narrator odróżni cię od wszystkich innych?
Pamiętaj, że bankomat nie może cię zobaczyć ani rozpoznać, ponieważ wszystkie światła są zgaszone. Co się stanie, jeśli kasjer wyda 10 000 USD na wypłatę innej osobie - niewłaściwej osobie ?! Jest absolutnie niezbędne, aby kasjer mógł rozpoznać cię jako osobę, która dokonała wypłaty, abyś mógł otrzymać pieniądze (lub zasoby), o które prosiłeś.
Rozwiązanie:
Kiedy po raz pierwszy pojawiasz się w kasjerze, on lub ona mówi ci coś w tajemnicy:
Nikt inny nie zna tajnego hasła.
Przykład sposobu, w jaki wypłaciłem gotówkę:
Postanawiam więc iść i odpocząć przez 20 minut, a potem idę do kasjera i mówię: „Chciałbym odebrać moją wypłatę”
Kasjer pyta mnie: „kim jesteś?”
„To ja, panie George Banks!”
"Udowodnij to!"
A potem podaję moje hasło: GNASHEU329
„Na pewno panie Banks!”
Zasadniczo tak działa sesja. Umożliwia jednoznaczną identyfikację na morzu milionów ludzi. Musisz identyfikować się za każdym razem, gdy masz do czynienia z kasjerem.
Jeśli masz jakieś pytania lub są niejasne - napisz komentarz, a ja postaram się wyjaśnić.
Objaśnienie za pomocą zdjęć:
źródło
GNASHEU329
jest hasło użytkownika, które generuje token uwierzytelnienia, który wygasa do określonego czasu; Pan Banks może następnie użyć tokena uwierzytelnienia, aby dokonać kilku kolejnych wypłat bez konieczności wielokrotnego podawania kasjera swojego hasła?„Sesja” to termin odnoszący się do czasu przeglądania strony przez użytkownika. Ma reprezentować czas od pierwszego przybycia do strony w witrynie do czasu, kiedy przestaną korzystać z witryny. W praktyce nie wiadomo, kiedy użytkownik skończy z witryną. Na większości serwerów występuje limit czasu, który automatycznie kończy sesję, chyba że ten sam użytkownik zażąda innej strony.
Gdy użytkownik po raz pierwszy połączy jakiś identyfikator sesji, zostanie utworzony (sposób wykonania zależy od oprogramowania serwera WWW i rodzaju uwierzytelnienia / logowania, którego używasz na stronie). Podobnie jak pliki cookie, zwykle nie jest to już wysyłane w adresie URL, ponieważ jest to problem bezpieczeństwa. Zamiast tego jest przechowywany wraz z wieloma innymi rzeczami, które łącznie są również nazywane sesjami. Zmienne sesji są jak pliki cookie - są to pary nazwa-wartość wysyłane wraz z żądaniem strony i zwracane wraz ze stroną z serwera - ale ich nazwy są zdefiniowane w standardzie internetowym.
Niektóre zmienne sesji są przekazywane jako nagłówki HTTP . Są one przekazywane tam iz powrotem za kulisy przeglądania każdej strony, więc nie pojawiają się w przeglądarce i nie mówią wszystkim, co może być prywatne. Wśród nich są: USER_AGENT lub typ przeglądarki żądającej strony, REFERRER lub strona, która łączy się z żądaną stroną itp. Niektóre oprogramowanie serwera WWW dodaje własne nagłówki lub przenosi dodatkowe dane sesji specyficzne dla oprogramowania serwera. Ale standardowe są dość dobrze udokumentowane.
Mam nadzieję, że to pomaga.
źródło
Like cookies, this usually doesn't get sent in the URL anymore
a potemSession variables are like cookies - they're name-value pairs sent along with a request for a page
. Co się dokładnie dzieje? Czy jest wysyłany przy następnym żądaniu?HTTP jest bezstanowym protokołem połączeń, co oznacza, że serwer nie może rozróżniać różnych połączeń różnych użytkowników.
Stąd przychodzi ciasteczko, gdy klient po raz pierwszy łączy się z serwerem, serwer generuje nowy identyfikator sesji, który później zostanie wysłany do klienta jako wartość ciasteczka. I od tej pory ten identyfikator sesji identyfikuje to połączenie klienta, ponieważ w ramach każdego żądania HTTP zobaczy odpowiedni identyfikator sesji w plikach cookie.
Teraz dla każdego identyfikatora sesji serwer zachowuje pewną strukturę danych, która umożliwia mu przechowywanie danych specyficznych dla użytkownika. Tę strukturę danych możesz abstrakcyjnie wywołać sesją.
źródło
Pomyśl o HTTP jako o osobie (A), która ma UTRATĘ PAMIĘCI KRÓTKOTERMINOWEJ i zapomina o każdej osobie, gdy tylko zniknie ona z pola widzenia.
Teraz, aby zapamiętać różne osoby, A robi zdjęcie tej osobie i zachowuje ją. Zdjęcie każdej osoby ma numer identyfikacyjny. Gdy ta osoba ponownie pojawi się w polu widzenia, ta osoba podaje A swój numer identyfikacyjny, a A znajduje swoje zdjęcie według numeru identyfikacyjnego. I voila !!, A wie, kto jest tą osobą.
To samo dotyczy HTTP. Cierpi na UTRATĘ PAMIĘCI KRÓTKOTERMINOWEJ. Wykorzystuje Sesje do rejestrowania wszystkiego, co zrobiłeś podczas korzystania ze strony internetowej, a następnie, kiedy wrócisz, identyfikuje cię za pomocą plików cookie (Cookie jest jak token). Zdjęcie to Sesja tutaj, a ID to Cookie tutaj.
źródło