Ao escrever um serviço web acessado por navegadores web, um co-mantenedor sugeriu que permitíssemos que os usuários escolhessem fazer login em uma sessão sem usar cookies. (Usar formulários HTML ocultos é outra coisa que consideramos, mas não estou muito interessado na ideia. JavaScript não é aceitável.)
Usando o servidor HTTP da biblioteca padrão Go ou talvez outros mecanismos, ao definir Connection: keep-alive
, é possível identificar de qual conexão de rede uma solicitação de entrada se originou?
- Armazenar um ponteiro para
http.Request.TLS
(atls.ConnectionState
) não funcionará porque sua memória pode ser liberada e o endereço pode ser reutilizado, possibilitando o sequestro de sessões. - Não vejo valores úteis em
http.Request
.
É definitivamente possível implementar isso aceitando solicitações como uma conexão TCP/TLS/etc simples, armazenar algumas informações e construir o http.Request
s eu mesmo; mas isso parece bem trabalhoso.
Não acho que a ideia por trás da pergunta sequer funcione, o que significa que também não funcionará com net/http, não importa quais recursos ele ofereça. A justificativa para minha dúvida:
Isso significa que você não pode realmente substituir uma sessão HTTP por "mesma conexão TCP" ou "mesma sessão TLS". Além disso, mesmo com HTTP keep-alive, uma conexão TCP ociosa é fechada após um tempo, perdendo a "sessão".
Tudo isso é independente da biblioteca ou linguagem de programação utilizada.
Portanto, use cookies HTTP para manter uma sessão no nível HTTP. Foi para isso que eles foram inventados em primeiro lugar. Toda a má reputação é apenas porque "manter uma sessão" também pode ser mal utilizado para rastrear usuários etc. Mas isso também é verdade com outros mecanismos de sessão.