在我开始在线阅读之前,Sessions对我有意义

我从阅读Sessions vs Cookies中收集的主要内容是,Cookie存储在客户端,会话存储在服务器端。 如果会话存储在服务器端,那么服务器如何知道哪个客户端是他们的? 显然,必须在客户端进行某些操作。

每当我使用自动滚动用户身份validation时,我的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 。 最后,如果我认为会话是在客户端,那么它是如何保持安全的?

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

非常感谢。

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

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

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

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

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

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