Stanowość niekoniecznie jest złą rzeczą, ale musisz zrozumieć różnicę między aplikacjami stanowymi a bezpaństwowymi. Krótko mówiąc, aplikacje stanowe przechowują informacje o bieżącej sesji, a aplikacje bezstanowe nie. Informacje przechowywane na stałe jako część konta użytkownika mogą, ale nie muszą być przechowywane w sesji, ale przechowywanie informacji związanych z kontem użytkownika samo w sobie nie powoduje stanu aplikacji. Stan wymaga, aby serwer przechowywał informacje o sesji bieżącego użytkownika poza tym, co utrzymuje przeglądarka klienta. Na przykład klient może się uwierzytelnić i otrzymać plik cookie JSESSIONID, który następnie wysyła do serwera przy każdym żądaniu. Jeśli serwer zacznie przechowywać rzeczy w zakresie sesji aplikacji na podstawie tego JSESSIONID, staje się stanowy.
Bezpaństwowość
Przez „bezstanowy” rozumiemy, że serwer i klient nie przechowują bieżących informacji o sesji użytkownika. Klient i serwer mogą używać jakiejś formy tokena, aby zapewnić uwierzytelnianie między żądaniami, ale nie są przechowywane żadne inne bieżące informacje. Typowym przykładem użycia takiego rozwiązania może być serwis informacyjny, w którym większość użytkowników (nowych konsumentów) konsumuje informacje, ale nie generuje informacji, które wracają do witryny. W takich przypadkach witryna nie musi utrzymywać żadnych informacji o bieżącej sesji użytkownika. Należy pamiętać, że witryna może nadal używać plików cookie do identyfikowania użytkownika i przechowywania informacji o korzystaniu z niego przez tego użytkownika, ale może to nadal być uważane za bezpaństwowe, ponieważ wszystko zarejestrowane może być transakcyjne, np. Jaki link kliknął użytkownik, który może zostać zarejestrowany przez serwer, ale nie utrzymywany w sesji użytkownika.
Stan na serwerze
Na serwerze aplikacja stanowa zapisuje informacje o stanie o bieżących użytkownikach. Podejście to ogólnie polega na wykorzystaniu plików cookie do identyfikacji systemu użytkownika, dzięki czemu można zachować stan na serwerze między żądaniami. Sesje mogą być uwierzytelniane lub nie, w zależności od kontekstu aplikacji. Zaletą stanowych aplikacji serwerowych jest buforowanie informacji o stanie użytkownika na serwerze, przyspieszenie wyszukiwania i czas odpowiedzi strony. Z drugiej strony przechowywanie informacji w zakresie sesji jest kosztowne, a na dużą skalę staje się bardzo zasobochłonne. Tworzy również potencjalny wektor ataku dla hakerów, którzy próbują przejąć identyfikatory sesji i ukraść sesje użytkownika. Wyzwaniem dla stanowych aplikacji serwerowych jest ochrona sesji użytkowników przed nieoczekiwanymi przerwami w świadczeniu usług, np. Awarią serwera.
Stan klienta
Korzystając z JavaScript i nowoczesnych technologii przeglądarki, takich jak sessionStorage, aplikacja może teraz łatwo przechowywać informacje o stanie sesji użytkownika na urządzeniu tego użytkownika. Ogólnie aplikacja może być nadal uważana za stanową, ale zadanie utrzymania stanu zostało przeniesione do klienta. Takie podejście ma dużą zaletę (dla osoby zarządzającej aplikacją internetową) nad utrzymywaniem stanu na serwerze, ponieważ w rzeczywistości każdy użytkownik utrzymuje własny stan i nie ma obciążenia infrastruktury serwera. W skali sieci tego rodzaju wybór architektury ma ogromny wpływ na koszty sprzętu i energii elektrycznej. Utrzymanie stanu na serwerze może dosłownie kosztować miliony dolarów rocznie. Przejście do systemu utrzymującego stan na kliencie może wówczas zaoszczędzić miliony dolarów rocznie.
Tokeny v. Ciasteczka
Pliki cookie działają jako identyfikatory urządzeń / przeglądarek klienta. Mogą być używane do przechowywania wszelkiego rodzaju rzeczy, ale ogólnie przechowują jakąś formę identyfikatora, np. CFID / CFTOKEN w aplikacjach CFML. Pliki cookie można ustawić tak, aby długo działały w przeglądarce użytkownika, umożliwiając między innymi utrzymanie uwierzytelnienia w aplikacji między sesjami przeglądarki. Pliki cookie można również ustawić tylko na pamięć, więc wygasają, gdy użytkownik zamknie przeglądarkę.
Tokeny to generalnie pewne informacje identyfikujące użytkownika, które są generowane na serwerze (za pomocą szyfrowania w celu szyfrowania informacji), przekazywane do klienta i zwracane na serwer z kolejnym żądaniem. Mogą być one przekazywane w nagłówku żądania i odpowiedzi, co jest częstym wzorcem w aplikacjach jednostronicowych. Idealnie byłoby, gdyby każde żądanie / odpowiedź generowało nowy token, więc token nie może zostać przechwycony i wykorzystany później przez atakującego.
Aplikacje pojedynczej strony i stan klienta
W przypadku SPA informacje o stanie są ładowane do przeglądarki klienta i tam przechowywane. Kiedy stan się zmienia, np. Gdy opublikujesz aktualizację na swoim koncie w mediach społecznościowych, klient przekazuje tę nową transakcję do serwera. W takim przypadku serwer zapisuje tę aktualizację w trwałym magazynie danych, takim jak baza danych, i przekazuje klientowi wszelkie informacje potrzebne do synchronizacji z serwerem na podstawie aktualizacji (np. Identyfikator aktualizacji).
Zauważ, że ten wzorzec przechowywania stanu na kliencie oferuje korzyści dla doświadczeń online / offline, ponieważ możesz być odłączony od serwera, wciąż mając nieco użyteczną aplikację. Twitter jest dobrym przykładem tego przypadku, w którym możesz przejrzeć wszystko załadowane po stronie klienta w swoim kanale Twitter, nawet jeśli nie masz połączenia z aplikacją serwera Twitter. Ten wzorzec powoduje również złożoność synchronizacji między serwerem a klientem, co stanowi całość. Złożoność rozwiązania jest kompromisem za możliwość utrzymania stanu na kliencie.
Stan na kliencie sprawia, że aplikacje internetowe są bardziej podobne do tradycyjnych aplikacji komputerowych. W przeciwieństwie do aplikacji komputerowych, zazwyczaj nie wszystkie informacje o koncie są ładowane do sesji klienta w przeglądarce. Takie postępowanie w wielu przypadkach byłoby niepraktyczne i powodowałoby złe doświadczenia. Czy możesz sobie wyobrazić próbę załadowania całego pola Gmaila do przeglądarki? Zamiast tego klient przechowuje informacje, takie jak etykieta / folder, na który patrzysz i gdzie na liście wiadomości e-mail w tym folderze, którego szukasz. Równoważenie informacji o stanie, które należy zachować, i tego, o co należy poprosić w razie potrzeby, jest kolejnym wyzwaniem inżynieryjnym tego rodzaju, i znowu stanowi kompromis między praktycznością a zapewnieniem dobrych wrażeń użytkownika.
Wózki sklepowe i tym podobne
Jeśli chodzi o szczegóły, takie jak koszyki, to naprawdę zależy od rozwiązania. Koszyk na zakupy może być przechowywany w bazie danych na serwerze, może być przechowywany tylko w zakresie sesji na serwerze, a nawet może być przechowywany na kliencie. Amazon ma trwałe koszyki na zakupy dla zalogowanych użytkowników i „tymczasowe” wózki dla anonimowych użytkowników, chociaż koszyki te są do pewnego stopnia trwałe.
Gdy mówisz o czymś takim jak Google, który jest naprawdę zbiorem różnych aplikacji pod tą samą marką, prawdopodobnie nie mają one wspólnej architektury, a każda z nich jest zbudowana w sposób, który najlepiej odpowiada potrzebom jej użytkowników. Jeśli chcesz dowiedzieć się, jak zbudowana jest witryna, otwórz narzędzia programistyczne w przeglądarce i spójrz na nią. Sprawdź pliki cookie, obserwuj ruch sieciowy i zobacz, jak działa.
Przepraszam, jeśli ta odpowiedź trochę się wtrąca, ale stanowość jest złożonym tematem.