来自Stormpath:
Cookie与HttpOnly cookie标志一起使用时,无法通过JavaScript访问,并且不受XSS的影响。您还可以设置安全cookie标记以保证cookie仅通过HTTPS发送。这是过去利用cookie来存储令牌或会话数据的主要原因之一。 现代开发人员对使用cookie犹豫不决,因为他们传统上要求将状态存储在服务器上,从而破坏RESTful最佳实践。如果要在cookie中存储JWT,作为存储机制的Cookie不需要将状态存储在服务器上。这是因为JWT封装了服务器为请求提供服务所需的一切。
当我读到这篇文章时,我理解一个带有“状态”的cookie。成为一个cookie,其中包含有关应用程序/会话的数据...因此,包含JWT的cookie将具有状态,不是吗?
另外,为什么在cookie中存储JWT以验证API调用会破坏RESTful最佳实践?
谢谢:)
答案 0 :(得分:1)
关于:
我理解一个带有'state'的cookie是一个cookie,其中包含有关应用程序/会话的数据...因此,包含JWT的cookie会有状态,不是吗?
Cookie的“传统用法”和具有状态的服务器(通常)其中cookie包含会话ID,并且服务器在内存中保存此会话的详细信息(状态,保存在服务器上)。这意味着发送到附加了会话ID cookie的服务器的请求将需要使用服务器的状态(会话中的内容)来确定要执行的操作或如何执行它。在这个例子中,cookie本身通常不包含任何状态,因为它只是一个会话ID,它不会在请求之间发生变化。
我相信你的困惑源于JWT会根据用户操作而改变 - 存在一些状态 - 但这没关系。 RESTful实践的中断来自存储在其中的状态的服务器,而不是客户端发送处理请求所需的信息。
正如Stormpath所引述的那样,将JWT存储在cookie中并不会破坏REST的无状态范例,因为服务器必须在每个请求上解码JWT并使用其中包含的数据 - 几乎作为请求中的另一个头虽然有点担保。
不可否认,您可以在JWT中存储另一个会话ID或类似内容,服务器可以有状态地使用它,尽管通常JWT往往包含客户端标识符或类似的东西,由于签名而受信任JWT,并基于此执行任何操作 - 服务器对请求执行操作所需的所有信息都是请求的一部分,而不是某些状态存储在服务器中。