I client Web (browser) comunicano con i server Web utilizzando un protocollo chiamato HTTP . HTTP è stato deliberatamente progettato per essere un protocollo stateless. , ovvero ogni richiesta e risposta è indipendente, il server non lo fa t mantenere alcun record di risposte completate e non collega le serie di richieste di un singolo utente. Perché HTTP è stato progettato per essere apolidi? In primo luogo perché rende i server HTTP molto più facili da progettare e codificare, e li rende molto meno impegnativi per la memoria. HTTP è stato progettato principalmente come sistema di memorizzazione delle informazioni e non esisteva quasi nessuna idea di utilizzarlo come piattaforma di programmazione delle applicazioni. Ancora oggi la maggior parte del traffico HTTP consiste di semplici richieste e risposte senza necessità di stato.
Intorno al 1992-93 la gente ha iniziato a scrivere applicazioni web (a differenza delle semplici pagine web). Si sono immediatamente imbattuti nella necessità di memorizzare lo stato dell'applicazione su più pagine. Hanno iniziato a scrivere estensioni al server web che potevano memorizzare e gestire lo stato utilizzando i cookie e la riscrittura degli URL per associare le richieste HTTP a sessioni particolari. Per quanto sia imbarazzante, ha la virtù della flessibilità. Se la gente che progettava HTTP avesse tentato di specificare un meccanismo di stato di uso generale, probabilmente avrebbe sbagliato e sarebbe rimasto bloccato come parte dello standard. ASP, PHP, JSP e gli altri linguaggi di scripting lato server sono la prole di quelle vecchie estensioni del server web.
Molte altre applicazioni di rete usano la nozione di una sessione (SSH e SMTP per esempio), ma i contenuti della sessione sono cablati ai dettagli di tale applicazione.