【问题标题】:When to use cookie store vs redis store for session cookie何时将 cookie 存储与 redis 存储用于会话 cookie
【发布时间】:2018-10-06 17:11:01
【问题描述】:

在 Rails 中,默认存储 session 是使用 cookie_store

Application.config.session_store :cookie_store, key: '_myapp_session'

但有时,session 存储在数据库中,例如 Redis。

Application.config.session_store(
  :redis_store,
  servers: config.redis_server,
  key: '_myapp_sessions',
)

什么时候应该使用 cookie 存储,什么时候应该使用数据库?

【问题讨论】:

    标签: ruby-on-rails session-cookies


    【解决方案1】:
    • 当您需要在会话中存储超过 4KB 的数据时。

    • 当您需要对过期会话进行更多控制时。以下是您可能需要这种控制的两个示例:

      1. 如果您对应用程序进行了更改,需要在会话中加入新信息,或者存在安全漏洞,并且您需要使所有会话过期,以便所有用户都需要重新登录,如果会话更容易存在于数据库中与需要更改 secret_key_base 以使 cookie_store 会话无效。
      2. 维护的会话是攻击者无限期地保持会话活动的地方。这里提到了这个问题https://guides.rubyonrails.org/security.html#session-expiry 如果你想防止维护的会话,这很容易通过在会话上设置created_at 属性而不是cookie_store 会话使用数据库来完成,因为每次请求都会重新创建它。

    【讨论】:

      【解决方案2】:

      如果您的 rails 应用程序在集群(多台服务器)环境中运行或会话数据超过 4KB(cookie 存储有 4KB 内存的限制),请使用 Redis 或任何其他数据库。

      【讨论】:

      • 感谢回答,4KB的限制我明白了,但是为什么在集群上运行意味着使用redis来获取会话数据?
      • 如果您的应用程序在负载均衡器后面的多个服务器上运行,一旦您登录到应用程序会话将被创建,但下一个请求可能不会发送到同一台服务器(请求以循环方式或任何其他算法),因此用户必须再次登录。为避免这种情况,您需要在服务器之间使用某些数据库共享会话
      • 但是Rails中存在会话,不管登录如何。其实可以使用会话来实现一个基本的登录机制。此外,对于多个服务器,会话 cookie 仍然随每个请求一起发送,并且其中已经包含所有信息。所以不知道为什么我们需要在服务器之间共享它。
      • 答案大部分是正确的,但我希望我可以否决回复第一条评论的第二条评论。我可以确认cookie_store 在与服务器集群一起使用时可以正常工作。只要他们都有相同的secret_key_base 并且会话没有超时,他们都会认为它有效。
      猜你喜欢
      • 2020-12-26
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2010-12-29
      • 2019-08-19
      • 2014-11-05
      • 2017-01-09
      相关资源
      最近更新 更多