O estado não é necessariamente uma coisa ruim, mas é preciso entender a diferença entre aplicativos com estado e sem estado. Em resumo, os aplicativos com estado mantêm informações sobre a sessão atual, e os sem estado não. As informações armazenadas permanentemente como parte de uma conta de usuário podem ou não ser armazenadas em uma sessão, mas o armazenamento de informações relacionadas a uma conta de usuário não torna o aplicativo por si só. A condição de estado exige que o servidor mantenha informações sobre a sessão do usuário atual além do que o navegador do cliente está mantendo. Por exemplo, um cliente pode autenticar e receber um cookie JSESSIONID, que é enviado ao servidor a cada solicitação. Se o servidor começar a armazenar itens no escopo da sessão do aplicativo com base neste JSESSIONID, ele se tornará com estado.
Apatridia
Por apátrida, queremos dizer que o servidor e o cliente não estão mantendo informações atuais sobre a sessão do usuário. O cliente e o servidor podem usar alguma forma de token para fornecer autenticação entre solicitações, mas nenhuma outra informação atual é armazenada. Um caso de uso típico para essa solução pode ser um site de notícias em que a maioria dos usuários (novos consumidores) consome informações, mas não produz informações que retornam ao site. Nesses casos, o site não precisa manter nenhuma informação sobre a sessão atual do usuário. Observe que o site ainda pode usar cookies para identificar o usuário e armazenar informações sobre o uso desse site pelo usuário, mas isso ainda pode ser considerado sem estado, pois tudo o que foi gravado pode ser transacional, por exemplo, em qual link o usuário clicou e que pode ser gravado por o servidor, mas não mantido em uma sessão do usuário.
Statefulness no servidor
No servidor, um aplicativo com estado salva as informações de estado sobre os usuários atuais. Essa abordagem geralmente envolve o uso de cookies para identificar o sistema do usuário, para que o estado possa ser mantido no servidor entre solicitações. As sessões podem ou não ser autenticadas, dependendo do contexto do aplicativo. Os aplicativos de servidor com estado oferecem a vantagem de armazenar em cache as informações de estado do usuário no servidor, acelerando as pesquisas e o tempo de resposta da página. No lado negativo, armazenar informações no escopo da sessão é caro e, em escala, torna-se muito intensivo em recursos. Ele também cria um vetor de ataque em potencial para os hackers tentarem seqüestrar identificadores de sessão e roubar sessões do usuário. Aplicativos de servidor com estado também têm o desafio de proteger as sessões do usuário contra interrupções inesperadas de serviço, por exemplo, uma falha no servidor.
Statefulness no cliente
Usando JavaScript e tecnologias modernas de navegador como o sessionStorage, o aplicativo agora pode armazenar facilmente informações de estado sobre uma sessão do usuário no dispositivo desse usuário. No geral, o aplicativo ainda pode ser considerado com estado, mas o trabalho de manter o estado foi movido para o cliente. Essa abordagem tem uma grande vantagem (para o mantenedor do aplicativo Web) sobre a manutenção do estado no servidor, pois cada usuário mantém, de fato, seu próprio estado e não há ônus na infraestrutura do servidor. Em escala web, esse tipo de escolha arquitetônica tem enormes repercussões nos custos de hardware e eletricidade. Poderia literalmente custar milhões de dólares por ano para manter o estado no servidor. Mudar para um sistema que mantém o estado no cliente pode economizar milhões de dólares por ano.
Tokens v. Cookies
Os cookies atuam como identificadores para dispositivos / navegadores clientes. Eles podem ser usados para armazenar todo tipo de coisas, mas geralmente armazenam algum tipo de identificador, como CFID / CFTOKEN em aplicativos CFML. Os cookies podem ser configurados para permanecer no navegador do usuário por um longo período de tempo, possibilitando ações como manter a autenticação em um aplicativo entre as sessões do navegador. Os cookies também podem ser configurados para somente memória, para que expirem quando um usuário fecha o navegador.
Os tokens geralmente são algum tipo de informação de identificação sobre o usuário que é gerada no servidor (usando criptografia para embaralhar as informações), transmitida ao cliente e retornada ao servidor com a solicitação subsequente. Eles podem ser passados no cabeçalho da solicitação e resposta, que é um padrão comum em aplicativos de página única. Idealmente, cada solicitação / resposta resulta na geração de um novo token, para que os tokens não possam ser interceptados e usados posteriormente por um invasor.
Aplicativos de página única e estado do cliente
Com os SPAs, as informações de estado são carregadas no navegador do cliente e mantidas lá. Quando o estado muda, por exemplo, você publica uma atualização em sua conta de mídia social, o cliente retransmite essa nova transação para o servidor. Nesse caso, o servidor salva essa atualização em um armazenamento de dados persistente, como um banco de dados, e retransmite para o cliente todas as informações necessárias para sincronizar com o servidor com base na atualização (por exemplo, um ID para a atualização).
Observe que esse padrão de estado de armazenamento no cliente oferece vantagens para experiências online / offline, pois você pode ser desconectado do servidor enquanto ainda possui um aplicativo que pode ser utilizado. O Twitter é um bom exemplo desse caso, no qual você pode revisar qualquer coisa carregada do lado do cliente em seu feed do Twitter, mesmo se estiver desconectado do aplicativo do servidor do Twitter. Esse padrão também cria complexidade na sincronização entre servidor e cliente, que é todo um assunto próprio. As complexidades da solução são uma desvantagem por poder manter o estado no cliente.
O estado do cliente faz com que os aplicativos da Web se sintam e se comportem mais como os aplicativos de desktop tradicionais. Ao contrário dos aplicativos de desktop, você normalmente não terá todas as informações da sua conta carregadas na sessão do cliente em um navegador. Fazer isso seria, em muitos casos, impraticável e produziria más experiências. Você pode imaginar tentar carregar uma caixa inteira do Gmail no navegador? Em vez disso, o cliente mantém informações como o rótulo / pasta que você está visualizando e onde está na lista de e-mails dessa pasta. O equilíbrio de quais informações de estado manter e o que solicitar, conforme necessário, é outro desafio de engenharia desse padrão e, novamente, representa uma troca entre praticidade e fornecimento de boas experiências para o usuário.
Carrinhos de compras e similares
Quanto a detalhes como carrinhos de compras, isso realmente depende da solução. Um carrinho de compras pode ser armazenado em um banco de dados no servidor, pode ser armazenado apenas no escopo da sessão no servidor ou pode até ser armazenado no cliente. A Amazon possui carrinhos de compras persistentes para usuários conectados e carrinhos "temporários" para usuários anônimos, embora esses carrinhos sejam persistentes até certo ponto.
Quando você fala sobre algo como o Google, que é realmente um monte de aplicativos diferentes que vivem sob a mesma marca, eles provavelmente não compartilham uma arquitetura comum, e cada um é construído da maneira que melhor atenda às necessidades de seus usuários. Se você quiser saber como um site é criado, abra as ferramentas do desenvolvedor no seu navegador e veja-o. Verifique se há cookies, observe o tráfego de rede e veja como ele funciona.
Desculpe se essa resposta divaga um pouco, mas o estado é um assunto complexo.