Ruby Rails:在数据库中存储会话的优势?

Ruby Rails:在数据库中存储会话的优势?,ruby,session,ruby-on-rails-3,Ruby,Session,Ruby On Rails 3,我只是想知道为什么要在数据库中存储会话?将会话存储在数据库中有什么好处吗?我能想到的两个原因是: 1) 如果重新启动web服务,会话数据不会丢失 2) 在负载平衡环境中,会话数据存储在中心位置,这意味着任何服务器都可以为请求提供服务并访问会话数据。数据库或memcached的优点是,会话数据在客户端不能被篡改,并且可以存储比cookie(4kB)更大的数据量 如果会话存储在cookie或数据库中,并且web服务重新启动,则会话数据不会丢失。只有当它存储在memcached中时,它才可能丢失 如果

我只是想知道为什么要在数据库中存储会话?将会话存储在数据库中有什么好处吗?

我能想到的两个原因是:

1) 如果重新启动web服务,会话数据不会丢失


2) 在负载平衡环境中,会话数据存储在中心位置,这意味着任何服务器都可以为请求提供服务并访问会话数据。

数据库或memcached的优点是,会话数据在客户端不能被篡改,并且可以存储比cookie(4kB)更大的数据量

如果会话存储在cookie或数据库中,并且web服务重新启动,则会话数据不会丢失。只有当它存储在memcached中时,它才可能丢失

如果服务器是负载平衡的,那么会话数据将传递给为请求提供服务的web服务器,因此这不是cookie、数据库或memcached会话的问题

与memcached或数据库相比,cookies的优势在于客户端存储会话数据,因此服务器不负责


请记住,由于会话引用仍然需要维护,因此Cookie将以任何方式传递给客户端或从客户端传递出去。

我至少可以想到三个原因。如果将会话保存在数据库中,则可以:

  • 在您执行的任何Rails实例上轻松访问它。因此,如果您有多台机器,就不必担心会话数据的分发
  • 您没有只有在使用cookie会话存储时才使用的4kb会话限制会话。虽然您不应该使用会话来存储对象,但有一天您可能会使用该功能
  • 在使用和RDBM(而不是Memcached或任何其他非持久化存储)时,您不必担心丢失会话数据
在数据库中拥有会话的一个不太明显的小优势是,如果您需要计算当前会话并查看其他登录用户的名称,则与仅使用cookie存储会话数据或memcached相比,实现起来更容易。

另一个优势是在服务器端处理会话到期如第2.9节所述:

“但是,客户端可以编辑存储在web浏览器中的Cookie,因此在服务器上过期会话更安全。”

类会话
也许吧。它是否保护了某种黑客行为?部分是的,将会话数据存储在cookie中会带来安全隐患:。至于#2,默认的基于cookie的存储也有这一好处。并不是说它本身没有问题,但这一好处并不是DB/Memcache存储所独有的。您所说的一切都是正确的,只是“数据不能被篡改”。会话劫持?会话劫持中,用户没有篡改客户端的会话数据。他们正在复制会话id cookie以获得对系统的访问权限,就像他们是经过身份验证的用户一样。存储在memcached中的会话将在web服务器重新启动后丢失?存储在memcached中的任何数据将在memcached重新启动后丢失。web服务器是一个不同的进程。由于web应用是无状态的,因此没有可靠的方法来确定到底有多少用户登录。计算会话数对这一点没有帮助。如果每次加载页面时触摸更新的_at参数,您可以看到在过去几天中加载了多少会话。如果会话cookie设置为在24小时后过期,则会告诉您谁仍在登录。您还可以通过删除用户的会话将其注销。
class Session < ActiveRecord::Base
  def self.sweep(time = 1.hour)
    if time.is_a?(String)
      time = time.split.inject { |count, unit| count.to_i.send(unit) }
    end

    delete_all "updated_at < '#{time.ago.to_s(:db)}' OR
     created_at < '#{2.days.ago.to_s(:db)}'"
  end
end