Ajax 坚持我的休息枪还是打破无国籍状态?需要的建议

Ajax 坚持我的休息枪还是打破无国籍状态?需要的建议,ajax,session,rest,cookies,stateless,Ajax,Session,Rest,Cookies,Stateless,我编写了一个RESTful servlet,UI开发人员希望将登录状态保存到服务器上 他提出了一个奇怪的说法:“我还没有遇到过一个纯REST的生产REST实现。我见过的所有实现都让服务器维护一个会话。” 我觉得这很难接受。首先是技术上的问题,有很多纯RESTful的纯HTTP页面。其次,是的,有标记为RESTful的非RESTful实现,就像有标记为“gold”的黄铜一样。第三,其他人从桥上跳下来并不意味着我应该跳 背景:它是一个使用HTTPS和基本身份验证的JavaScript Ajax we

我编写了一个RESTful servlet,UI开发人员希望将登录状态保存到服务器上

他提出了一个奇怪的说法:“我还没有遇到过一个纯REST的生产REST实现。我见过的所有实现都让服务器维护一个会话。”

我觉得这很难接受。首先是技术上的问题,有很多纯RESTful的纯HTTP页面。其次,是的,有标记为RESTful的非RESTful实现,就像有标记为“gold”的黄铜一样。第三,其他人从桥上跳下来并不意味着我应该跳

背景:它是一个使用HTTPS和基本身份验证的JavaScript Ajax web应用程序。为了避免出现通常的(不可编辑的)浏览器登录弹出框,应用程序会显示一个带有产品徽标的登录屏幕,并显示名称和密码的文本框。名称和密码存储在文档中,并在每个请求的授权标头中发送。如果刷新页面,名称和密码将丢失,用户必须重新键入。这被认为是一个bug;UI开发人员希望能够在不再次提供密码的情况下按下刷新按钮


因此,开发人员希望使用cookie或JSP会话。Abby,最终每个REST实现都会在服务器上维护应用程序状态,这是真的吗?或者有什么方法可以解决这个问题并保持我的RESTful纯度?

我认为使用cookie在客户端维护这些信息没有问题。Cookie仅在用作指向某些服务器端会话状态的指针时才成为问题

您必须关注的主要问题是cookie中信息的安全性。您可能不想将明文密码放入cookie:-)

  • 默认情况下,当您刷新页面时,浏览器不会再次请求凭据。你可能想调查一下,因为如果你解决了这个问题,你的问题就解决了
  • 除了用户可以使用HTTP或cookie进行身份验证之外,您可以在大多数情况下维护REST服务。也就是说,如果您没有cookie,该服务也可以工作
问候,


Abby.

如果在身份验证后返回某种会话ID,并在每次调用中传递它,这与在每次调用中传递身份验证凭据没有太大区别。就性能而言,后者仍然可以缓存凭据,因此不会影响性能。就安全性而言,不必保留凭据更好,因为会话会过期,但凭据(通常)不会过期。可以说,避免会话更可靠,因为服务器可以在调用之间忘记一切,但仍然可以工作


简言之,在这两个方向上都没有压倒性的强有力的论据,你可能不应该被你是否在休息方面足够“纯洁”的承诺所困扰。真正的问题是客户端的行为,正如Sjoerd所建议的,这是可以独立于此进行调整的。

我认为出于实际原因(主要是可浏览功能),您需要区分应用程序状态和身份验证状态。我想不出有哪种身份验证机制不在服务器端保留某种形式的状态

真正重要的是它与应用程序的解耦程度。例如,HTTP摘要在服务器上保留了某种形式的状态,但这显然被抽象为正常的
WWW认证
授权
头协商的一部分。因为大多数浏览器本机支持它,这与应用程序是正交的,因此不会打破REST的无状态原则

如今,由于用户对HTTP Basic/Digest身份验证的审美期望在浏览器中无法满足,网站倾向于使用基于表单的身份验证,随后使用cookie。公平地说,这不仅仅是它的外观,它还涉及可用性(例如,“忘记密码”信息,尽管这可能在401响应的正文中)和安全性。浏览器不允许您轻松地从Basic/Digest/Certificate身份验证注销,除非如您所述,它完全是在一个页面内用Ajax完成的,这有助于CSRFs

我认为Cookie对于身份验证是可以接受的,但请确保在会话中不存储与应用程序相关的变量

您可以阅读以下内容:

身份验证是正交的。曲奇饼 当它们是时也是正交的 仅用于内容协商或 认证。但是,Cookie REST中不允许身份验证 因为它缺乏可视性,这 导致安全问题,因为 其他组件不知道它是什么 敏感信息

编辑(关于安全方面的进一步评论):


我意识到罗伊·菲尔丁(Roy Fielding)在我引用的信息中的评论是出于安全原因而反对Cookie的。他当然是对的。然而,在我看来,通过Basic/Digest/Cert(2003年,该消息发布之日,它还没有真正出现在雷达上)来防范CSRF比防范cookie盗窃更难。这取决于课程的实施。没有一个完美的解决方案,但是如果您使用cookie,请使用HTTPS上的安全cookie。

+1对于“我发现这很难接受”之后的可靠论点。对您来说,什么更重要?保持您所谓的纯度,还是用所需的功能构建一个好的应用程序?你在网上来回传递证件?如果我遇到一个需要我在每次刷新页面时重新输入凭据的应用程序,我早就离开了。@DOK这不是关于纯度,而是关于做出明智的决定。选择构建具有无状态交互的系统具有一些非常理想的特性。当然,这会让一些事情变得更加困难,但这是一个需要考虑的权衡