La condizione di stato non è necessariamente una cosa negativa, ma è necessario comprendere la differenza tra app con stato e senza stato. In breve, le app con stato mantengono le informazioni sulla sessione corrente e le app senza stato no. Le informazioni memorizzate in modo permanente come parte di un account utente possono o meno essere archiviate in una sessione, ma la memorizzazione di informazioni relative a un account utente non rende di per sé l'applicazione stateful. La condizione di stato richiede che il server mantenga le informazioni sulla sessione dell'utente corrente oltre a ciò che sta gestendo il browser client. Ad esempio, un client potrebbe autenticare e ricevere un cookie JSESSIONID, che quindi invia al server con ogni richiesta. Se il server inizia a memorizzare elementi nell'ambito della sessione dell'applicazione in base a questo JSESSIONID, diventa stateful.
apolidia
Per apolide, intendiamo che il server e il client non mantengono le informazioni correnti sulla sessione dell'utente. Il client e il server possono utilizzare una qualche forma di token per fornire l'autenticazione tra le richieste, ma non vengono memorizzate altre informazioni correnti. Un tipico caso d'uso di tale soluzione potrebbe essere un sito di notizie in cui la maggior parte degli utenti (nuovi consumatori) consuma informazioni ma non produce informazioni che risalgono al sito. In tali casi, il sito non deve conservare alcuna informazione sulla sessione dell'utente corrente. Si noti che il sito può ancora utilizzare i cookie per identificare l'utente e archiviare informazioni sull'uso del sito da parte di tale utente, ma ciò può comunque essere considerato apolide poiché tutto ciò che è stato registrato potrebbe essere transazionale, ad esempio il collegamento su cui l'utente ha fatto clic, che potrebbe essere registrato da il server, ma non gestito in una sessione utente.
Statefulness sul server
Sul server, un'app stateful salva le informazioni sullo stato degli utenti attuali. Questo approccio prevede generalmente l'uso di cookie per identificare il sistema dell'utente in modo che lo stato possa essere mantenuto sul server tra le richieste. Le sessioni possono essere autenticate o meno, a seconda del contesto dell'applicazione. Le app server con stato offrono il vantaggio di memorizzare nella cache le informazioni sullo stato degli utenti sul server, accelerando le ricerche e i tempi di risposta della pagina. Sul lato negativo, la memorizzazione delle informazioni nell'ambito della sessione è costosa e su vasta scala diventa molto dispendiosa in termini di risorse. Inoltre, crea un potenziale vettore di attacco per gli hacker per provare a dirottare identificatori di sessione e rubare sessioni utente. Le app server con stato hanno anche la sfida di proteggere le sessioni utente da interruzioni impreviste del servizio, ad esempio un errore del server.
Statefulness sul client
Utilizzando JavaScript e le moderne tecnologie del browser come sessionStorage, l'applicazione ora può facilmente memorizzare informazioni sullo stato di una sessione utente sul dispositivo dell'utente. Nel complesso, l'applicazione può ancora essere considerata con stato, ma il compito di mantenere lo stato è stato spostato sul client. Questo approccio ha un grande vantaggio (per il manutentore dell'app Web) rispetto al mantenimento dello stato sul server in quanto ciascun utente, in effetti, mantiene il proprio stato e non vi sono oneri per l'infrastruttura del server. Su scala web, questo tipo di scelta architettonica ha enormi ripercussioni sui costi di hardware ed elettricità. Potrebbe letteralmente costare milioni di dollari all'anno per mantenere lo stato sul server. Passare a un sistema che mantiene lo stato sul client potrebbe quindi risparmiare milioni di dollari all'anno.
Token v. Cookies
I cookie fungono da identificatori per dispositivi / browser client. Possono essere utilizzati per archiviare ogni genere di cose, ma generalmente memorizzano una qualche forma di identificatore, come CFID / CFTOKEN nelle app CFML. I cookie possono essere impostati per vivere a lungo nel browser dell'utente, rendendo possibile fare cose come mantenere l'autenticazione su un'app tra le sessioni del browser. I cookie possono anche essere impostati solo in memoria in modo che scadano quando un utente chiude il browser.
I token sono generalmente un tipo di informazioni identificative sull'utente che vengono generate sul server (usando la crittografia per mescolare le informazioni), passate al client e restituite al server con la richiesta successiva. Possono essere passati nell'intestazione della richiesta e della risposta, che è un modello comune nelle applicazioni a pagina singola. Idealmente, ogni richiesta / risposta comporta la generazione di un nuovo token, quindi i token non possono essere intercettati e utilizzati in seguito da un attaccante.
App a pagina singola e stato del client
Con le SPA, le informazioni sullo stato vengono caricate nel browser client e mantenute lì. Quando lo stato cambia, ad esempio quando pubblichi un aggiornamento sul tuo account di social media, il client inoltra la nuova transazione al server. In questo caso, il server salva quell'aggiornamento in un archivio dati persistente come un database e inoltra al client qualsiasi informazione che deve sincronizzare con il server in base all'aggiornamento (ad esempio un ID per l'aggiornamento).
Si noti che questo modello di memorizzazione dello stato sul client offre vantaggi per le esperienze online / offline in quanto è possibile disconnettersi dal server pur avendo ancora un'applicazione utilizzabile. Twitter è un buon esempio di questo caso, in cui è possibile rivedere qualsiasi lato client caricato nel proprio feed Twitter anche se si è disconnessi dall'app del server Twitter. Questo modello crea anche complessità nella sincronizzazione tra server e client, che è un argomento a sé stante. Le complessità della soluzione sono un compromesso per poter mantenere lo stato sul client.
La dignità sul client rende le app Web più simili alle app desktop tradizionali. A differenza delle app desktop, in genere non tutte le informazioni dell'account verranno caricate nella sessione client in un browser. In tal caso, in molti casi sarebbe impraticabile e produrrebbe brutte esperienze. Riesci a immaginare di provare a caricare un'intera casella di Gmail nel browser? Al contrario, il client mantiene informazioni come l'etichetta / cartella che stai visualizzando e dove nell'elenco di e-mail in quella cartella che stai visualizzando. Equilibrare quali informazioni sullo stato mantenere e cosa richiedere in base alle esigenze è un'altra sfida ingegneristica di questo modello e, di nuovo, rappresenta un compromesso tra praticità e fornire buone esperienze utente.
Carrelli della spesa e simili
Per quanto riguarda i dettagli come i carrelli della spesa, dipende davvero dalla soluzione. Un carrello della spesa può essere archiviato in un database sul server, può essere archiviato solo nell'ambito della sessione sul server o può anche essere archiviato nel client. Amazon ha carrelli acquisti persistenti per gli utenti che hanno effettuato l'accesso e carrelli "temporanei" per utenti anonimi, sebbene questi carrelli siano persistenti in una certa misura.
Quando parli di qualcosa come Google, che in realtà è un gruppo di applicazioni diverse che vivono con lo stesso marchio, probabilmente non condividono un'architettura comune e ognuna è costruita nel modo che soddisfa meglio le esigenze dei suoi utenti. Se vuoi sapere come viene costruito un sito, apri gli strumenti di sviluppo nel tuo browser e guardalo. Verifica la presenza di cookie, controlla il traffico di rete e guarda come funziona.
Scusate se questa risposta è un po 'sconnessa, ma lo stato è un argomento complesso.