A sessão da web é “Design ruim”? Por quê?

13

outro dia, eu estava discutindo com um colega e ele saiu dizendo que usar a sessão do usuário em um aplicativo da web está errado. Eu respondi que isso poderia estar errado, dependendo das informações que você está armazenando, caso contrário, por que um serviço de sessão na Web deveria ser fornecido pela Microsoft (estávamos falando sobre o ASP.NET).

Ele me respondeu, novamente, que mesmo em MS eles poderiam facilmente me responder que era um design ruim. E que ele poderia me mostrar alguns documentos técnicos demonstrando isso.

Infelizmente, não tenho mais oportunidade de entrar em contato com esse cara, mas gostaria muito de entender mais sobre o ponto de vista dele. Alguém tem informações / pontos de vista sobre isso aqui?

abx78
fonte
2
O protocolo HTTP foi originalmente projetado para ser "sem estado" - para que todas as transações fossem singulares e baseadas nas informações fornecidas. As sessões são uma maneira de contornar isso em alguns usos. Praticamente, porém, para muitos sites modernos, não consigo pensar em uma maneira simples de evitar sessões; talvez eu não seja criativo o suficiente.
Katana314
@ Katana314 Armazenamento de banco de dados com cookies. Você pode usar sessões para obter informações muito básicas, como identificar o usuário, mas muitas implementações de sessão (principalmente no Django, que atingimos várias vezes) têm falhas que podem criar condições de corrida com dados mais transitórios sempre que várias solicitações do mesmo usuário são enviados de uma só vez (como com chamadas AJAX)
Izkata
2
O armazenamento do banco de dados com cookies é apenas uma questão de hospedar sua sessão em um banco de dados.
Alan Shutko

Respostas:

11

Não acho que ele quis dizer "mau design", mas "má prática". De um modo geral, um aplicativo Web deve ser o mais sem estado possível. Mesmo que, por exemplo, você precise conhecer as informações do usuário para autorizar a exibição da página, essas informações podem ser salvas na máquina cliente na forma de um cookie e o servidor simplesmente valida as informações do usuário todas as vezes.

Isso seria ideal, mas nem sempre você pode contar com o cliente para salvar cookies. Além disso, envolve a validação do usuário de um estado sem estado, o que potencialmente envolve consultar informações do banco de dados para uma simples solicitação de página. Muitas vezes, é mais simples salvar essas informações na sessão.

No entanto, depois de atravessar o Rubicon, muitos programadores são tentados a salvar não apenas informações de autenticação na sessão, mas também muitas outras coisas. Esse é um antipadrão e tende a tornar seu aplicativo Web fortemente dependente do estado, que é precisamente o que deveria ser evitado em primeiro lugar.

Alguns programadores se baseariam em tecnologias como a Spring (se você estiver usando Java) para desvendar o que seria uma bagunça de dependências, mas eu argumentaria que isso apenas facilita a criação de dependências, em vez de eliminá-las. Tais tecnologias devem ajudar seu desenvolvimento, não tornar seu antipadrão menos um problema.

Portanto, uma boa regra geral é que, se você pode escrevê-lo sem estado, provavelmente é uma idéia melhor fazê-lo ou corre o risco de cair nessa armadilha. Obviamente, você vai se deparar com situações nas quais isso é necessário, mas de um modo geral, você deve salvar apenas informações que, de outra forma, seriam difíceis de obter.

Neil
fonte
1
but you can't always count on the client being able to save cookiesentão AFAIK, você também não pode contar com sessões. Os cookies não são usados ​​para identificar qual sessão pertence a qual usuário ou existem outros métodos e isso é simplesmente o mais comum?
Izkata
As informações da sessão são normalmente salvas no servidor para cada conexão servidor / cliente, e isso se tornou uma tendência popular para grandes sites que não podiam contar com usuários com cookies ativados. Existem opções (e / ou bibliotecas js) que forçam o salvamento dessas informações no PC cliente (que vem se tornando muito popular ultimamente), mas sem o HTML 5, os cookies são a única maneira de conseguir isso. Que eu saiba, não há outras maneiras de fazer isso.
Neil
8

Eu acho que você está confundindo dois tópicos diferentes: 1) sessões e 2) o modelo de página dos formulários da web asp.net

Uma sessão da web é necessária para autenticar um usuário. Idealmente, uma sessão deve ser usada apenas para esse fim. Você não deve armazenar dados do usuário em uma sessão (seja no servidor, em um cookie ou como o asp.net/webforms faz: dentro da própria página). Ninguém deve dizer que uma sessão da Web é ruim, mas armazenar dados do usuárioem uma sessão é uma má prática. Os motivos para não armazenar dados do usuário no servidor incluem os mesmos motivos para evitar variáveis ​​globais. Armazenar dados do usuário em cookies ou na página pode apresentar problemas de segurança. O uso do modelo de página do asp.net também não adere à natureza apátrida da web. Você pode fazer uma pesquisa para descobrir mais sobre por que os webforms são um design ruim. As sessões, por outro lado, são uma parte necessária dos aplicativos da web.

codificador
fonte
"As sessões, por outro lado, são uma parte necessária dos aplicativos da web". Não
Masterxilo 10/05/19
6

Controles e armazenamento do estado da sessão em uma página são essencialmente um hack. É o caso do MS - necessário, pois eles queriam fornecer um ambiente de desenvolvimento em que você pudesse criar páginas como em ambientes winform.

Os próprios MS se mudaram para a arquitetura MVC (versão mais recente - MVC 4), que é mais um retorno ao que o protocolo realmente deveria ser - sem estado.

Há situações em que o estado de armazenamento ainda é útil, mas deve-se entender que essa é a exceção e não a regra.

Robbie Dee
fonte