Estou trabalhando em um aplicativo Rails que usa ActiveRecord::SessionStore para gerenciamento de sessão. Durante a depuração, notei um comportamento interessante em relação ao session_id. Aqui está o que encontrei:
O session_id no cookie do usuário se parece com isto:
a5ef128d435c9c14f86450b0860d424
Entretanto, no banco de dados (tabela de sessões), o session_id é armazenado em um formato hash com um prefixo:
2::3d05cf25eccf392f19e0049fa0f302a7bd4575a3b3daea9a2cde3173f723f7a0
Entendo que a parte depois de 2:: é um hash SHA-256 do valor do cookie (session_id), mas estou curioso sobre o prefixo (2::):
- O 2:: significa uma versão específica do mecanismo de criptografia ou hash da sessão?
- Esse comportamento está documentado em algum lugar no Rails ou na gem ActiveRecord::SessionStore?
Veja como estou tentando recuperar a sessão no meu código:
current_user_id = lambda { |request|
session_id = request.cookie_jar["_session_id"]
return unless session_id.present?
encrypted_session_id = "2::#{Digest::SHA256.hexdigest(session_id)}"
session = ActiveRecord::SessionStore::Session.find_by(session_id: encrypted_session_id)
session&.data&.fetch('user_id', nil)
}
Isso funciona como esperado, mas tenho uma preocupação: se o prefixo 2:: mudar, meu código quebrará.
Quaisquer informações ou indicações sobre documentação seriam muito apreciadas!
O prefixo na frente do session_id vem exatamente de Rack::Session (cf. https://github.com/rack/rack-session/blob/498bfdf0757e288aa2cf949044892882628c0a67/lib/rack/session/abstract/id.rb#L31 ) Eles adicionam um ID de versão na frente dele, provavelmente para gerenciar a compatibilidade com versões anteriores do mecanismo de hash, como você deve ter adivinhado.
Então o prefixo pode mudar e ele é definido com
Rack::Session::SessionId::ID_VERSION
para que você possa substituir o código por:Mas se a versão do id mudar, as sessões antigas não poderão ser recuperadas, o que não é viável.
Acho que é melhor usar o método 'session' no contexto de um controlador e, caso contrário, usar uma recuperação de banco de dados que ignore esse identificador, mas com possíveis problemas.