Quantas vezes o senhor já voltou ao seu navegador da Web e foi recebido por essa pequena e desagradável notificação:
Sua sessão atingiu o tempo limite. Por favor, faça o login novamente.
Se o senhor for como eu, a resposta é muito. O pior é que geralmente o usuário é expulso do contexto da página em que estava trabalhando. É preciso fazer login manualmente de novo, lembrar o que estava fazendo, navegar de volta para onde estava e retomar o trabalho.
A maioria dos programadores olha para esses tipos de tempos limite de sessão do navegador como um mal necessário, às vezes até como um “recurso” de segurança. Sei que o site do meu banco zelosamente me desconecta de sua interface da Web se eu ficar inativo por mais de cinco minutos. Não sei se qualquer um desses motivos é particularmente justificável.
Como programador, entendo por que ocorre a expiração da sessão. O protocolo HTTP no qual a Web se baseia é o sem estado. Isso significa que cada solicitação individual que seu navegador envia a um servidor da Web é um bebê recém-nascido, cruelmente nascido em um mundo que é total e completamente alheio à sua existência. A maneira como os aplicativos da Web modernos contornam isso é dizendo ao navegador para enviar um valor pequeno e exclusivo de volta ao site com cada solicitação – isso é conhecido como um cookie HTTP. Parece muito mais saboroso do que parece:
Content-type: text/html
Cookie: SessionId=5451297120
Embora existam preocupações com a privacidade dos cookiesé uma prática geralmente aceita hoje em dia – pelo menos para os sabores de cookies primários. Embora seja possível manter o estado sem cookies, mas isso é doloroso e incômodo.
Cada solicitação da Web a esse servidor incluirá seu próprio cookie e o ID de sessão associado até que ele expire, geralmente daqui a muitos meses ou até anos. O navegador definitivamente não é a parte esquecida aqui.
Cabe ao servidor para correlacionar o identificador de sessão exclusivo enviado pelo navegador com sua identidade individual, contexto, configurações e preferências. Em geral, isso é armazenado em algum tipo de banco de dados, com a chave do seu identificador de sessão. Por motivos de desempenho, uma parte das informações da sessão também acaba na memória do servidor; não há necessidade de ir até o banco de dados nas próximas 26 vezes em que o senhor atualizar obsessivamente sua página de perfil do Facebook.
Ainda assim, isso não explica por que o servidor da Web se esquece misteriosamente de nós. Na verdade, o servidor tem todas as informações necessárias para se lembrar do usuário, mesmo que ele tenha ficado longe do computador por uma semana. Então, por que o o o servidor decide esquecer arbitrariamente do senhor em uma hora?
- Desempenho. Considere um site com muito tráfego. Se o site tentasse manter as sessões ativas durante um mês inteiro, isso poderia fazer com que a tabela de sessões aumentasse para milhões de registros. É ainda pior se o senhor pensar nisso em termos de informações do usuário armazenadas em cache na memória; alguns míseros kilobytes de estado de memória por usuário não parecem muito, mas multiplicados por alguns milhões, com certeza são. Se esses dados não expirassem e não fossem descartados em um cronograma, o servidor da Web seria rapidamente destruído.
- Segurança. O cookie mágico que armazena sua sessão pode ser potencialmente roubado. Se esse cookie nunca expira, o senhor tem uma janela de vulnerabilidade infinitamente longa para sequestro de sessão. Isso é coisa séria, e as estratégias de mitigação são limitadas. A melhor opção, a não ser criptografar toda a conexão de ponta a ponta via HTTPS, é manter uma janela de expiração apertada no cookie de sessão e regenerá-lo com frequência.
Esse é o motivo do tempo limite da sessão do navegador, do ponto de vista do programador. Mas isso não faz com que seja correto. Longe disso.
Como usuário, posso dizer de forma bastante inequívoca que a expiração da sessão não presta. É realmente tão irracional começar a fazer algo em seu navegador da Web, sair por uma hora – talvez até por algumas horas -, voltar e esperar que as coisas simplesmente funcionem?
Como programadores, acho que podemos fazer melhor. Isso é possível. Sou inundado com mensagens de timeout de sessão todos os dias de várias fontes, mas nunca uma vez viu uma mensagem de expiração de sessão do gmail, por exemplo. O que eu sugiro é o seguinte:
- Crie um processo JavaScript em segundo plano no navegador que envia batimentos cardíacos regulares para o servidor. Gerar novamente um novo cookie com expiração programada, por exemplo, a cada 5 ou 10 minutos.
- Se o senhor estiver preocupado com o sequestro de sessões – e o senhor realmente deveria ser — usar uma conexão protegida por HTTPS. Isso é absolutamente óbvio para instituições financeiras de qualquer tipo.
Gostaria que mais desenvolvedores testassem seus aplicativos da Web quanto a problemas de tempo limite de sessão. Apesar de todos os rumores em contrário, seus usuários não dedicarão a vida inteira a usar seu aplicativo Web de forma pontual e oportuna. Eles têm ligações telefônicas para atender, reuniões para ir, outros sites e aplicativos para atender.
É realmente justo expulsar os usuários do seu aplicativo Web ou, pior ainda, rejeitar cegamente os dados que eles enviaram, só porque eles foram imprudentes o suficiente para esperar algumas horas desde sua última súplica aos deuses do servidor Web? Na maioria dos aplicativos da Web, a penitência é muito severa para um pecado tão comum.