在这种情况下,“状态”是啥意思? (关于在 cookie 中存储 JWT 的讨论)
Posted
技术标签:
【中文标题】在这种情况下,“状态”是啥意思? (关于在 cookie 中存储 JWT 的讨论)【英文标题】:What does 'state' mean in this context? (Discussion about storing JWTs in cookies)在这种情况下,“状态”是什么意思? (关于在 cookie 中存储 JWT 的讨论) 【发布时间】:2016-06-03 01:32:51 【问题描述】:来自Stormpath:
Cookie 与 HttpOnly cookie 标志一起使用时,无法通过 javascript 访问,并且不受 XSS 影响。您还可以设置 Secure cookie 标志以保证 cookie 仅通过 HTTPS 发送。这是过去利用 cookie 存储令牌或会话数据的主要原因之一。 现代开发人员对使用 cookie 犹豫不决,因为他们传统上要求将状态存储在服务器上,从而破坏了 RESTful 最佳实践。如果您在 cookie 中存储 JWT,则作为存储机制的 cookie 不需要将状态存储在服务器上。这是因为 JWT 封装了服务器为请求提供服务所需的所有内容。
当我阅读本文时,我理解带有“状态”的 cookie 是一个包含有关应用程序/会话的数据的 cookie……因此,包含 JWT 的 cookie 将具有状态,不是吗?
另外,为什么将 JWT 存储在 cookie 中以对 API 调用进行身份验证会破坏 RESTful 最佳实践?
谢谢:)
【问题讨论】:
【参考方案1】:关于:
我理解带有“状态”的 cookie 是一个包含有关应用程序/会话的数据的 cookie...因此包含 JWT 的 cookie 将具有状态,不是吗?
cookie 的“传统用法”和具有状态的服务器(通常)是 cookie 包含会话 ID,并且服务器在内存中保存该会话的详细信息(状态,保存在服务器上)。这意味着发送到带有会话 ID cookie 的服务器的请求需要使用服务器的状态(会话中的内容)来确定要执行哪个操作或如何执行它。在此示例中,cookie 本身通常不包含任何状态,因为它只是一个不会在请求之间更改的会话 ID。
我相信您的困惑源于这样一个事实,即 JWT 会根据用户操作而改变——其中存储了一些状态——但这没关系。 RESTful 实践的中断来自于服务器存储了状态,而不是客户端发送了对请求进行操作所需的信息。
正如 Stormpath 的引述所描述的,将 JWT 存储在 cookie 中不会破坏 REST 的无状态范式,因为服务器必须在每个请求上解码 JWT 并使用其中包含的数据——几乎作为请求的另一个标头,尽管有些安全。
诚然,您可以在 JWT 中存储另一个会话 ID 或类似的东西,服务器可以有状态地使用它们,尽管通常 JWT 倾向于包含客户端标识符或类似的东西,由于JWT,并基于此执行任何操作 - 服务器对请求采取行动所需的所有信息都是请求的一部分,而不是其中一些状态存储在服务器中。
【讨论】:
明白了,在这种情况下,重新阅读这篇文章会更有意义!谢谢以上是关于在这种情况下,“状态”是啥意思? (关于在 cookie 中存储 JWT 的讨论)的主要内容,如果未能解决你的问题,请参考以下文章