RESTful身份验证 - 在高负载下导致性能不佳?

PhD*_*PhD 15 java performance web-services restful-authentication restlet

对于RESTful Web服务,我们说服务器不应该存储任何状态.现在,对于每个请求,"用户"必须经过身份验证,并且必须拥有他/她希望执行的操作的授权.

现在,每个请求都将包含该用户的授权数据.这是我的困惑:

假设主页上有登录名和密码字段.用户输入用户名/密码,该用户名/密码被发送回服务器,用户验证然后返回"某个令牌".现在,每个请求都会将此令牌发送到服务器.问题(S):

  • 后端数据库是否需要有一个单独的表来存储由用户名索引的这些令牌?
  • 假设令牌存储在DB中,则每个请求都需要进行DB调用.这是否会导致DB服务器在高负载时成为瓶颈?
  • 如果令牌没有真正存储在DB中,那么存储它的最佳"安静"位置是什么?
  • 会议可能不安宁,但后来我没有看到如何扩展身份验证/授权(如上所述)?
  • 如果它不是令牌,那么用户名/密码是否需要回传?(听起来像个坏主意:)

我可能误解了RESTful身份验证/授权的概念.但实际情况是,对于每个http请求,"服务"需要访问数据库以验证凭据吗?有没有什么东西可以简化这个过程,仍然坚持宁静的原则?我可以想到有一个存储细节的缓存,并且在服务器重启的情况下,它只是访问数据库.这只是一个可能使系统复杂化的性能优势(可能值得,不知道).这是唯一的解决方案吗?

因此,从REST的理论/概念角度(不是必要的实现)如何处理这个问题(如果它是一个问题)?您的专业经验如何处理这个问题以及Restful是如何处理的?

我们正在研究Restlet + J2EE + MySQL Restful Web服务,我弹出这个问题,但没有令人满意的答案(谷歌,Stackoverflow等)我知道HTTP的基本和摘要授权,但我不熟悉根据上述说明,存储/检索的内部结构.

kvi*_*sta 8

REST的精神是无国籍.这并不意味着客户端状态不能由服务持久化,但实际上它确实意味着服务器在内存中保存的客户端状态通常是一件坏事.

您可以做的就是将一个函数保存在用于加密/解密用户信息的内存(即代码)中,而不是将身份验证数据保存在内存中,或者每次都进入数据库进行验证.这是一种技术,也可以通过以下方式建议:

我应该在cookie中存储什么以在用户登录时实现"记住我"

那么,例如,您将要做的是以下内容:

  1. 当客户端首次联系服务时,它没有cookie.
  2. 您发出一个包含用户信息的cookie并使用您的函数"对其进行"签名(运行您的代码的所有服务器都可以)
  3. 当客户端再次联系服务时,您检查它是否有cookie; 如果没有,重复(2).
  4. 但是,如果它确实有cookie,则会尝试解密(再次使用在您的基础架构中复制的单个函数)并验证您是否可以解包和摘要该用户ID信息.
  5. 这将验证用户并为您提供身份信息,所有这些都无需多次访问DB.它是RESTful的.

请记住,我描述的这个"功能"并不是一个新奇的东西 - 它是一个标准的安全哈希,但它是基于一个唯一的私钥,只有你的集体服务器知道.您可以根据需要旋转这样的键等.