我之前一直在使用 Devise 来处理 Rails 应用程序的身份验证,但是从未真正理解它的工作原理。因为 Devise 也使用了 Rails 上设置的会话存储配置,所以我认为这是一个关于使用 Rails 处理会话的问题。
基本上,我是一个身份验证新手。我阅读过一些关于身份验证的文章,但大多数都涉及到抽象的库(他们谈论引擎、中间件等),而对我来说并不太有意义。我真的想了解更低级别的细节。
以下是我目前了解的内容。
我知道关于 cookies 和 sessions。Cookies 是存储在客户端的字符串,用于在多个 HTTP 请求之间保持会话。
以下是我的基本身份验证理解(如果我理解有误,请纠正我):
用户登录时,我们向服务器发送 SSL 加密请求。如果凭据有效,我们将保存一个称为会话 ID 的随机字符串作为与用户 ID 相关联的有效会话 ID 在数据库(或任何其他数据存储)上。此会话 ID 在每次用户登录/注销时更改。
在将该会话 ID 保存到我们的数据存储后,我们返回一个响应,要求浏览器设置一个带有会话 ID 的 cookie。该会话 ID 以及用户 ID 将随后被发送到域名的连续请求中,直到到期为止。对于每个请求,我们的服务器将检查标头上的会话 ID,并验证该会话 ID 是否对该用户 ID 有效。如果是,则将其视为已通过身份验证的用户。
以下是我的问题:
我读到的内容称,从 Rails 2 开始,默认使用 CookieStore(而不是 SessionStore),它使用 SHA512 生成会话哈希值(而不是会话 ID),并且所有这些都存储在一个 cookie 中,这意味着多个用户 ID 可以使用相同的会话哈希值,而只需同样有效。对我来说,这似乎是一件非常危险的事情,因为它公开了大量使用单个密钥存储的哈希值,并且基于此密钥构建了整个身份验证系统。是否有真实世界的大型应用程序使用哈希而不是存储在服务器端的会话 ID?
关于在服务器端存储活动会话ID的主题,我还看到过可以切换为使用不同种类的Rails会话存储的信息。基于此,我听说有些系统将身份验证系统移出作为服务并使用身份验证令牌。什么是身份验证令牌,它与会话ID有何不同?
似乎我只需猜测一个随机字符串(用于哈希和服务器端会话)即可获取现有会话。有没有办法防止这种情况发生?使用更多存储在cookie中的值是否正常?(例如用户名、真实姓名或甚至另一个用于身份验证的哈希值)
我知道我要求很多,但我相信这对像我一样不理解身份验证的人会很有用,并且对于了解这个主题打下坚实的基础。