坚持我的REST枪或打破无国籍?建议需要

Mar*_*ton 5 cookies ajax rest session stateless

我编写了一个RESTful servlet,UI开发人员想要在服务器上保存登录状态.

他提出了这个奇怪的说法:"我没有遇到过纯REST的生产REST实现.我见过的所有实现都让服务器维持会话."

我发现这很难接受.首先是技术性,那里有很多普通的HTTP页面,都是纯粹的RESTful.其次,是的,有非RESTful实现标记为RESTful,就像黄铜标记为"黄金"一样.第三,仅仅因为其他人从桥上跳下来并不意味着我应该.

背景:这是一个使用HTTPS和基本身份验证的JavaScript Ajax Web应用程序.为避免通常(不可自定义的)浏览器登录弹出框,应用程序会显示一个登录屏幕,其中包含产品徽标和名称和密码的文本框.名称和密码存储在文档中,并在每个请求的Authorization标头中发送.如果刷新页面,则名称和密码将丢失,用户必须再次输入.这被认为是一个错误; UI开发人员希望能够再次按下刷新按钮而不再提供密码.

因此开发人员想要使用cookie或JSP会话.Abby,最终每个REST实现都在服务器上维护应用程序状态吗?或者有没有办法解决这个问题,仍然保持我的RESTful纯度?

Bru*_*uno 3

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

真正重要的是它与应用程序的分离程度。例如,HTTP 摘要在服务器上保留某种形式的状态,但这显然是作为正常WWW-AuthenticateAuthorization标头协商的一部分进行抽象的。由于大多数浏览器本身就支持它,因此这与应用程序是正交的,因此不会违反 REST 的无状态原则。

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

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

您可以阅读Roy Fielding 关于该主题的一些评论:

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

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

我意识到 Roy Fielding 在我引用的消息中的评论出于安全原因反对 cookie。他当然是对的。然而,在我看来,通过 Basic/Digest/Cert 来防范 CSRF(这在 2003 年,即该消息的日期)并没有真正受到关注,比防止 cookie 盗窃更难。当然这取决于实施。没有完美的解决方案,但如果您使用 cookie,请通过 HTTPS 使用安全 cookie。