Statefulness ist nicht unbedingt eine schlechte Sache, aber Sie müssen den Unterschied zwischen stateful und zustandslosen Apps verstehen. Kurz gesagt, in statusbehafteten Apps werden Informationen zur aktuellen Sitzung gespeichert, in statusbehafteten Apps jedoch nicht. Informationen, die permanent als Teil eines Benutzerkontos gespeichert werden, können in einer Sitzung gespeichert werden oder auch nicht, aber das Speichern von Informationen in Bezug auf ein Benutzerkonto macht die Anwendung nicht automatisch statusbehaftet. Statefulness erfordert, dass der Server Informationen über die Sitzung des aktuellen Benutzers verwaltet, die über die des Client-Browsers hinausgehen. Ein Client könnte sich beispielsweise authentifizieren und ein JSESSIONID-Cookie erhalten, das er dann bei jeder Anforderung an den Server sendet. Wenn der Server mit dem Speichern von Inhalten im Sitzungsbereich der Anwendung beginnt, die auf dieser JSESSIONID basieren, wird der Zustand wiederhergestellt.
Staatenlosigkeit
Mit zustandslos ist gemeint, dass Server und Client keine aktuellen Informationen über die Benutzersitzung verwalten. Der Client und der Server können eine Form von Token verwenden, um die Authentifizierung zwischen Anforderungen bereitzustellen, es werden jedoch keine anderen aktuellen Informationen gespeichert. Ein typischer Anwendungsfall für eine solche Lösung könnte eine Nachrichten-Site sein, auf der die meisten Benutzer (neue Verbraucher) Informationen konsumieren, aber keine Informationen produzieren, die auf die Site zurückgehen. In solchen Fällen muss die Site keine Informationen über die aktuelle Benutzersitzung verwalten. Beachten Sie, dass die Website möglicherweise immer noch Cookies verwendet, um den Benutzer zu identifizieren und Informationen über die Verwendung der Website durch den Benutzer zu speichern. Dies kann jedoch weiterhin als zustandslos angesehen werden, da alles, was aufgezeichnet wurde, eine Transaktion sein kann, z der Server, aber nicht in einer Benutzersitzung verwaltet.
Statefulness auf dem Server
Auf dem Server speichert eine Stateful-App Statusinformationen zu aktuellen Benutzern. Bei diesem Ansatz werden in der Regel Cookies verwendet, um das System des Benutzers zu identifizieren, sodass der Status zwischen Anforderungen auf dem Server beibehalten werden kann. Sitzungen können je nach Anwendungskontext authentifiziert werden oder nicht. Stateful-Server-Apps bieten den Vorteil, dass Benutzerzustandsinformationen auf dem Server zwischengespeichert werden und Lookups und Seitenantwortzeiten beschleunigt werden. Andererseits ist das Speichern von Informationen im Sitzungsbereich teuer und wird im Maßstab sehr ressourcenintensiv. Es schafft auch einen potenziellen Angriffsvektor für Hacker, mit dem sie versuchen können, Sitzungskennungen zu hijacken und Benutzersitzungen zu stehlen. Stateful Server-Apps haben auch die Herausforderung, Benutzersitzungen vor unerwarteten Dienstunterbrechungen, z. B. einem Serverausfall, zu schützen.
Statefulness auf dem Klienten
Mithilfe von JavaScript und modernen Browsertechnologien wie sessionStorage kann die Anwendung jetzt problemlos Statusinformationen zu einer Benutzersitzung auf dem Gerät des Benutzers speichern. Insgesamt kann die Anwendung immer noch als statusbehaftet angesehen werden, die Aufgabe der Statusverwaltung wurde jedoch auf den Client verlagert. Dieser Ansatz hat einen großen Vorteil (für den Betreuer der Webanwendung) gegenüber der Aufrechterhaltung des Status auf dem Server, da jeder Benutzer seinen eigenen Status aufrechterhält und die Serverinfrastruktur nicht belastet wird. Im Internet hat diese Art der Architekturauswahl enorme Auswirkungen auf die Hardware- und Stromkosten. Es könnte buchstäblich Millionen von Dollar pro Jahr kosten, den Status auf dem Server aufrechtzuerhalten. Durch den Wechsel zu einem System, das den Status des Clients beibehält, können dann jährlich Millionen von Dollar eingespart werden.
Tokens v. Cookies
Cookies dienen als Bezeichner für Clientgeräte / Browser. Sie können verwendet werden, um alle möglichen Dinge zu speichern, aber im Allgemeinen speichern sie eine Art von Bezeichner, wie z. B. CFID / CFTOKEN in CFML-Apps. Cookies können so eingestellt werden, dass sie für längere Zeit im Browser des Benutzers gespeichert bleiben. Dies ermöglicht es beispielsweise, die Authentifizierung in einer App zwischen Browsersitzungen aufrechtzuerhalten. Cookies können auch auf Nur-Speicher gesetzt werden, sodass sie verfallen, wenn ein Benutzer den Browser schließt.
Bei Tokens handelt es sich im Allgemeinen um eine Art identifizierender Informationen über den Benutzer, die auf dem Server generiert (mithilfe von Verschlüsselung zum Verwürfeln der Informationen), an den Client übergeben und mit der nachfolgenden Anforderung an den Server zurückgegeben werden. Sie können im Header der Anforderung und der Antwort übergeben werden, was in Anwendungen mit nur einer Seite ein gängiges Muster ist. Im Idealfall wird bei jeder Anforderung / Antwort ein neues Token generiert, sodass Token nicht abgefangen und später von einem Angreifer verwendet werden können.
Single Page Apps und Clientstatus
Bei SPAs werden Statusinformationen in den Client-Browser geladen und dort verwaltet. Wenn sich der Status ändert, z. B. wenn Sie eine Aktualisierung auf Ihrem Social Media-Konto veröffentlichen, leitet der Client diese neue Transaktion an den Server weiter. In diesem Fall speichert der Server das Update in einem dauerhaften Datenspeicher wie einer Datenbank und leitet alle Informationen an den Client zurück, die er für die Synchronisierung mit dem Server basierend auf dem Update benötigt (z. B. eine ID für das Update).
Beachten Sie, dass dieses Muster des Speicherns des Status auf dem Client Vorteile für Online- / Offline-Erlebnisse bietet, da Sie vom Server getrennt werden können, während Sie noch eine einigermaßen verwendbare Anwendung haben. Twitter ist ein gutes Beispiel für diesen Fall, in dem Sie alle geladenen Clientseiten in Ihrem Twitter-Feed überprüfen können, auch wenn Sie nicht mit der Twitter-Server-App verbunden sind. Dieses Muster schafft auch Komplexität bei der Synchronisation zwischen Server und Client, was ein ganz eigenes Thema ist. Die Komplexität der Lösung ist ein Kompromiss für die Aufrechterhaltung des Status auf dem Client.
Durch die Statefulness auf dem Client fühlen und verhalten sich Web-Apps eher wie herkömmliche Desktop-Apps. Im Gegensatz zu Desktop-Apps werden in der Regel nicht alle Kontoinformationen in einem Browser in Ihre Clientsitzung geladen. Dies wäre in vielen Fällen unpraktisch und würde zu schlechten Erfahrungen führen. Können Sie sich vorstellen, ein ganzes Google Mail-Postfach in den Browser zu laden? Stattdessen verwaltet der Client Informationen wie das Label / den Ordner, den Sie suchen, und wo in der Liste der E-Mails in dem Ordner, den Sie suchen. Das Abwägen der zu pflegenden Statusinformationen und der erforderlichen Anforderungen ist eine weitere technische Herausforderung dieses Musters. Auch hier besteht ein Kompromiss zwischen Praktikabilität und der Bereitstellung einer guten Benutzererfahrung.
Einkaufswagen und dergleichen
Was Besonderheiten wie Einkaufswagen betrifft, kommt es wirklich auf die Lösung an. Ein Einkaufswagen kann in einer Datenbank auf dem Server gespeichert sein, er kann nur im Sitzungsbereich auf dem Server gespeichert sein oder er kann sogar auf dem Client gespeichert sein. Amazon bietet beständige Warenkörbe für angemeldete Benutzer und "temporäre" Warenkörbe für anonyme Benutzer an, obwohl diese Warenkörbe zu einem gewissen Grad beständig sind.
Wenn Sie über etwas wie Google sprechen, bei dem es sich in Wirklichkeit um eine Reihe verschiedener Anwendungen handelt, die unter derselben Marke laufen, haben sie wahrscheinlich keine gemeinsame Architektur und sind so aufgebaut, dass sie den Bedürfnissen ihrer Benutzer am besten entsprechen. Wenn Sie erfahren möchten, wie eine Website erstellt wird, öffnen Sie die Entwicklertools in Ihrem Browser und schauen Sie sich diese an. Suchen Sie nach Cookies, beobachten Sie den Netzwerkverkehr und sehen Sie, wie er ausgeführt wird.
Tut mir leid, wenn diese Antwort ein wenig verwirrt, aber Staatlichkeit ist ein komplexes Thema.