用户如何保持登录基于REST的网站?

时间:2010-12-23 19:48:51

标签: web-applications session rest security

大约一年前,我问过这个问题:Can you help me understand this? “Common REST Mistakes: Sessions are irrelevant”。我的问题基本上是这样的:

  

好的,我得到HTTP身份验证是在每条消息上自动完成的 - 但是如何?是否每次请求都会发送用户名/密码?那不就是增加攻击面积吗?我觉得我错过了这个难题的一部分。

我收到的答案在移动(iPhone,Android,WP7)应用程序环境中非常有意义 - 在与REST服务交谈时,应用程序只会发送用户凭据以及每个请求。这对我很有用。

但是现在,我想更好地理解如何保护类似REST的网站,比如StackOverflow本身或像Reddit这样的东西。如果是用户通过网络浏览器登录而不是通过iPhone应用程序登录,情况会怎样?

  • 用户登录时会发生什么?凭证是否以某种方式保存在浏览器中?
  • 浏览器如何知道随后的REST请求要发送哪些凭据?
  • 如果是对Web服务的JavaScript调用怎么办? JavaScript调用如何包含用户凭据?

我会坦率地说:我对网站安全性的理解非常有限,我不是网络开发人员(Damnit Jim,我是桌面开发人员!)。我喜欢从应用程序角度使用REST服务,但现在我想尝试构建一个基于REST原则的网站,我发现自己很丢失。

如果上述问题中有任何内容不清楚您是否希望我澄清,请发表评论我会解决。

3 个答案:

答案 0 :(得分:6)

如果您使用像Fiddler这样的代理,您可以确切地看到stackoverflow的作用。

它连接到/ users / authenticate /?s = ....上的资源,它在标题(gauth和usr)中使用两个“Set-Cookie”命令进行响应。

这些cookie在后续堆栈溢出请求的头文件中传递。

我假设stackoverflow从这些cookie中查找密钥以确保您之前已获得授权。当cookie过期时,您被视为已注销。

答案 1 :(得分:2)

经过身份验证后,用户通常会获得一个“cookie”(包含唯一的会话标识符),该cookie会在每次后续请求时从客户端发送回服务器。

http://en.wikipedia.org/wiki/HTTP_cookie

答案 2 :(得分:2)

真正的问题是网络浏览器很糟糕。好吧,也许我只是苦涩; - )。

如果您创建的网站使用标准HTTP身份验证机制(如Basic或Digest)之一,则浏览器将弹出一个登录屏幕,然后在将来的每个请求中使用这些凭据。

但是,大多数人都想控制他们的登录页面看起来的方式,但据我所知,如果以这种方式捕获登录信息,就无法告诉浏览器,嘿,在以后的请求中使用Authentication头中的这些凭据

如果有办法告诉浏览器,嘿,你正在使用的那些凭据,那也很好,请忘记它们。这将允许您有效地注销。

已经建议的解决方法是使用cookie作为Authorization标头的替代品。它并不理想,但只要cookie仅用于提供身份验证信息而不是服务器端会话标识符,那么一切都很好。