使用 REST 进行适当的会话管理 API

Proper Session Management with REST API

我已经完成了 RESTful API 的设计,其中我使用作为参数发送的 API 令牌对每个请求进行身份验证。
现在我想创建一个客户端界面,我想知道管理与每个 浏览器 客户端的会话的正确安全方法是什么。

我想过一个流程来保持 服务器端无状态:

但是我觉得有些地方不对...这不是太脆弱了吗?
假设我使用的是 SSL,但
API 令牌不能那样轻易被盗吗?
这甚至是一种正确的工作方式吗?

Store your tokens in cookies for web applications, because of the additional security they provide, and the simplicity of protecting against CSRF with modern web frameworks. HTML5 Web Storage is vulnerable to XSS, has a larger attack surface area, and can impact all application users on a successful attack.

参考下面这个link:

https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage

在适当的 REST 中,您不能进行会话。因为它们往往存储在服务器上。

因此,您需要为每个请求重新识别用户。

您目前拥有的是 OAuth 方法。您发出一个令牌,如果提供,将被视为身份证明。如果有人设法窃取了该令牌,则没有简单的方法可以检测到它。至于 "how it can be stolen",主要的向量是 XSS、浏览器扩展和物理访问。你可以缓解 XSS,但你真的对后两者无能为力。

正如 @Saikrishna Radarapu 提到的那样,还有作为向量的 CSRF,但是,如果您将令牌存储在某处,那不是 cookie,这不是真正的问题。

所以...可能的选择。

最简单的方法就是为您的身份验证令牌添加到期时间。当令牌过期时,您要求用户重新登录。这样,成功的攻击将导致... emm .. window-机会,您可以通过要求用户在执行破坏性操作时重新输入密码来进一步限制。

另一种选择是基于this approach for remember-me cookies令牌建模,但这种方法有一个严重的缺点——它在异步环境中表现不佳。您可以通过为每个令牌应用 "fuse" 来缓解它 - 在首次使用时将其标记为 "volatile" 并为其分配 X 秒 "burn time"。在这 X 秒内,不断返回相同的 "new" 标记,然后将原始标记标记为 "expired"。

我想到的第三个选项是只使用 HTTP Basic Auth or Digest Auth,但我从未实际尝试过。

所以...这是我对这个话题的两分钱。

请注意,RESTfull API 不需要接口并且是无状态的。 你的问题可以分两种情况考虑:
1:在第一种情况下,你有一个服务器,它只是一个 REST_API 服务器,没有接口,对有效请求有 json 响应,其他服务器(来自不同 IP)发送他们的请求,所以你无法使用会话管理客户端,因为它是服务器到服务器的通信,每台服务器只有一个 IP.so 令牌是您的最佳选择。
2:在第二种情况下,您提供了相同的功能,但您希望在同一台服务器中的 REST_API 旁边有一个接口,现在您可以只为您的接口使用会话,而对于其他(其他服务器)使用令牌。
在这两种情况下,最好的方法是使用令牌。您可以使用可签名且更安全的 JWT 令牌。
另请注意,当一切都在同一台服务器上时,您可以为该服务器的自己的界面使用会话。