ajax – 坚持我的REST枪或打破无国籍?建议需要
我编写了一个RESTful servlet,UI开发人员想要在服务器上保存登录状态.
他提出了这个奇怪的说法:“我没有遇到过纯REST的生产REST实现.我见过的所有实现都让服务器维持会话.” 我发现这很难接受.首先是技术性,那里有很多普通的HTTP页面,都是纯粹的RESTful.其次,是的,有非RESTful实现标记为RESTful,就像黄铜标记为“黄金”一样.第三,仅仅因为其他人从桥上跳下来并不意味着我应该. 背景:这是一个使用HTTPS和基本身份验证的JavaScript Ajax Web应用程序.为避免通常(不可自定义的)浏览器登录弹出框,应用程序会显示一个登录屏幕,其中包含产品徽标和名称和密码的文本框.名称和密码存储在文档中,并在每个请求的Authorization标头中发送.如果刷新页面,则名称和密码将丢失,用户必须再次输入.这被认为是一个错误; UI开发人员希望能够再次按下刷新按钮而不再提供密码. 因此开发人员想要使用cookie或JSP会话. Abby,最终每个REST实现都在服务器上维护应用程序状态吗?或者有没有办法解决这个问题,仍然保持我的RESTful纯度? 解决方法
我认为出于实际原因(主要是可浏览的能力),您需要区分应用程序状态和身份验证状态.我想不出任何在服务器端没有保留某种形式状态的认证机制.
真正重要的是它与应用程序的脱钩程度.例如,HTTP Digest在服务器上保留某种形式的状态,但这显然是作为正常的WWW-Authenticate和Authorization报头协商的一部分抽象出来的.因为大多数浏览器本身都支持它,所以这与应用程序正交,因此不会破坏REST的无状态原则. 如今,由于用户对浏览器中不满足HTTP Basic / Digest身份验证的美学期望,网站倾向于使用基于表单的身份验证和随后的cookie.公平地说,它不仅仅是它的外观,它还是一个可用性问题(例如“忘记了你的密码”信息,尽管这可能是401响应的主体)和安全性.浏览器不允许您轻松地从基本/摘要/证书身份验证注销,除非它在一个页面内完全在Ajax中完成,正如您所提到的那样,这可以帮助CSRF. 我认为cookie可用于身份验证,但请确保您不在会话中存储与应用程序相关的变量. 你可以阅读一些Roy Fielding’s comments on the topic:
编辑(关于安全方面的进一步评论): 我发现Roy Fielding在我引用的消息中的评论是出于安全原因而反对cookie.他是对的.但是,在我看来,通过基本/摘要/证书(在2003年,该消息的日期并不是真的在雷达上),而不是针对cookie盗窃来保护CSRF更加困难.这取决于当然的实施.没有完美的解决方案,但如果您使用cookie,请通过HTTPS使用安全cookie. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |