在我开始在线阅读会议之前,会议对我来说很有意义



我从阅读有关会话与 Cookie 中收集到的主要内容是 Cookie 存储在客户端,会话存储在服务器端。如果会话存储在服务器端,那么服务器如何知道哪个客户端是他们的?显然,客户端必须有某些东西。

每当我使用自滚动用户身份验证时,我的users数据库表中都有一个session_token列。

然后,这个模块倾向于为我提供会话:

module SessionsHelper
def current_user
User.find_by_session_token(session[:session_token])
end
def current_user=(user)
@current_user = user
session[:session_token] = user.session_token
end
def logout_current_user!
current_user.reset_session_token!
session[:session_token] = nil
end
def require_current_user!
redirect_to new_session_url if current_user.nil?
end
def require_no_current_user!
redirect_to user_url(current_user) unless current_user.nil?
end
end

我相信会话存储在服务器端,它们意味着每个用户都有session_token。此外,会话哈希必须位于客户端。如果没有,它在哪里?请注意,我像这样存储用户的session_token:session[:session_token] = user.session_token。最后,如果我是正确的,会话在客户端,它和session_token如何保持安全?

最后,这是否与在其他框架(如 Django、php 框架等)上处理会话的方式相同?如果不是,有哪些关键区别?

非常感谢。

Rails 安全指南提供了一些关于会话的良好信息:

http://guides.rubyonrails.org/v3.2.16/security.html#sessions

基本上,会话数据都可以存储在cookie中(默认),但它使用摘要进行签名,以防止使用服务器端机密进行篡改(但cookie数据在Rails 3.2中未加密,仅使用base64编码,尽管我相信它在Rails 4中已加密)。

另一种方法是仅会话 ID 存储在 cookie 中,会话数据存储在服务器上的某个地方(例如ActiveRecord::SessionStore)。

我认为客户端/服务器端会话选项将得到广泛支持(尤其是服务器端)。 服务器端会话存储的其他选项可能是服务器之间共享的memcache,甚至是内存或文件存储,这对于集群中的每个Web服务器都是分开的,这意味着您的负载均衡器需要支持粘性会话(以确保用户的请求都路由到同一服务器,因为其他服务器不知道)。 如果我没记错的话,这就是Apache Tomcat在添加集群支持之前在服务器端会话的过去的样子。

会话通常通过将会话令牌设置为 cookie 来实现。它必须随机选择,以便用户无法猜测其他用户的令牌。 所有会话数据与关联的令牌一起存储在服务器上。

相关内容

最新更新