Security 如何实现无状态(无会话)&;无cookie身份验证?

Security 如何实现无状态(无会话)&;无cookie身份验证?,security,authentication,session-cookies,stateless,cookieless,Security,Authentication,Session Cookies,Stateless,Cookieless,Bob使用web应用程序来实现某些功能。以及: 他的浏览器正在节食,因此它不支持cookies web应用程序是一种流行的应用程序,它在给定的时刻处理大量用户—它必须具有良好的扩展性。只要保持会话将对同时连接的数量施加限制,当然,还会带来不可忽略的性能损失,我们可能希望使用无会话系统:) 一些重要注意事项: 我们有传输安全(HTTPS和它最好的朋友) 在幕后,web应用程序代表当前的用户将大量操作委托给外部服务(这些系统确实将Bob识别为其用户之一)-这意味着我们必须向他们转发Bob的凭证

Bob使用web应用程序来实现某些功能。以及:

  • 他的浏览器正在节食,因此它不支持cookies
  • web应用程序是一种流行的应用程序,它在给定的时刻处理大量用户—它必须具有良好的扩展性。只要保持会话将对同时连接的数量施加限制,当然,还会带来不可忽略的性能损失,我们可能希望使用无会话系统:)
一些重要注意事项:

  • 我们有传输安全(HTTPS和它最好的朋友)
  • 在幕后,web应用程序代表当前的用户将大量操作委托给外部服务(这些系统确实将Bob识别为其用户之一)-这意味着我们必须向他们转发Bob的凭证
现在,我们如何(在每个请求上)验证Bob? 哪一种方式是实施这样一个目标的合理方式

  • 通过HTML表单隐藏字段使用凭证打网球。。。球包含凭证(用户名和密码),两个球拍分别是浏览器和web应用程序。换句话说,我们可以通过表单字段而不是通过cookie来回传输数据。在每次web请求时,浏览器都会发布凭据。但是,对于单页应用程序,这可能看起来像是在橡皮墙上打壁球,而不是打网球,因为包含凭据的web表单可能在整个web页面生命周期内保持活动状态(并且服务器将配置为不提供凭据)
  • 在页面上下文中存储用户名和密码-JavaScript变量等。此处需要单个页面,IMHO
  • 加密的基于令牌的身份验证。在这种情况下,登录操作将生成加密的安全令牌(用户名+密码+其他内容)。该令牌将被服务回客户端,并且即将到来的请求将伴随该令牌。这有意义吗?我们已经有了HTTPS
  • 其他
  • 最后手段:不要这样做,在会话中存储凭据!会议很好。有或没有饼干
对于前面描述的任何想法,您是否想到了任何web/安全问题?比如说,

  • 时间外出-我们可以在凭证中保留一个时间戳(时间戳=Bob输入凭证的时间)。例如,当现在-时间戳>阈值时,我们可能会拒绝请求
  • 跨站点脚本保护-不应该有任何不同,对吗

非常感谢您花时间阅读以下内容:)

关于登录选项-我认为您通常也希望为客人提供支持

因此,如果您想要强制登录,加密令牌选项可能会很好。不知何故,这对客座会议也有好处。 在另一个方向上,我会将令牌附加到URL和网球选项结合起来

请注意,仅在URL中发送凭据可能很危险。例如,您可能会通过HTTP referer头泄漏令牌,甚至可能是由只检查您的流量或监视您的计算机的人泄漏令牌


另一件事,即使你可以使用cookie,我也建议你添加随机令牌或随机验证,以保护自己免受跨站点请求伪造(CSRF)攻击。

啊,我喜欢这些问题-在没有会话的情况下维护会话

在我的应用程序评估期间,我看到了多种方法可以做到这一点。其中一种流行的方式是您提到的打网球的方式——在每个请求中发送用户名和密码以验证用户。在我看来,这是不安全的,尤其是当应用程序不是单页的时候。它也是不可扩展的,特别是如果你想在将来除了身份验证之外还向你的应用程序添加授权(尽管我想你也可以基于登录构建一些东西)

一种流行但并非完全无状态的机制(假设您有JavaScript执行)是将会话cookie嵌入JavaScript中。我身上的安全人员对此大喊大叫,但它实际上可以工作-每个请求都有一个
X-Authentication-Token
头或类似的东西,您可以将其映射到后端的数据库、内存中的文件存储等,以验证用户。此令牌可以有您指定的任何时间的超时,如果超时,用户必须再次登录。它是相当可伸缩的——如果您将其存储在数据库中,执行一条SQL语句,并且具有正确的索引,那么即使同时有多个用户,执行它也应该花费很少的时间。不过,这里的负载测试肯定会有所帮助。如果我读对了问题,这将是你的加密令牌机制——尽管我强烈建议你使用32个字符的加密随机令牌,而不是使用用户名+密码+其他任何形式的组合——这样,它保持不可预测,但您仍然可以将其与用户ID或类似的东西相关联

无论最终使用哪一种,请确保安全发送给您。HTTPS可以跨网络保护您,但如果您通过URL泄漏会话令牌(或者更糟的是,通过URL泄漏凭据),HTTPS将无法保护您。我建议使用头,或者如果不可行,每次都通过POST请求发送令牌(这意味着用户浏览器上有一个隐藏的表单字段)。后一种使用POST请求的方法应该使用CSRF防御,以防万一,尽管我怀疑使用令牌本身可能是某种CSRF防御

最后,但不是lea