JWT和签名cookie有什么区别?

13

我正在研究 JWT 作为传统基于cookies的session的替代方案,但我看不出它们与Express通过中间件例如cookie-parser提供的签名cookie有什么根本区别。

两者都将负载的最后一部分作为签名,以确保负载没有被篡改。

签名cookie:

user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3 

等效的JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiVG9iaSJ9.kCTlR_Igb4H5cqBEDedShM2ivSQijPQkWqN4pZAXb2g
除了以下事实之外:
(1)JWT没有来源限制;
(2)Cookie内容立即可读取,而JWT内容(标头+有效负载)是Base64编码的。
还有什么可以使JWT比签名Cookie具有明显优势的吗?
2个回答

12

注意不要混淆问题:cookie主要是用于在客户端存储数据的机制,它们本质上不是认证机制 - 但我们以这种方式使用它们 :)

JWT的主要优点是声明结构(JSON,具有公共字段)和签名机制的声明。 这只是规范,没有什么特别之处。 但是拥有一种常见的持久化身份声明方式很好。

您仍然需要以安全的方式存储JWT,并且带有HttpOnly; Secure的cookie是最佳选择。 这可以防止JavaScript环境读取cookie,从而防止XSS攻击。

我写了一些关于JWT的博客文章,其中包含更多信息,有助于回答您的问题:

使用JSON Web Tokens(JWT)构建安全的用户界面

面向单页面应用程序(SPA)的基于令牌的身份验证

免责声明:我在Stormpath工作。 我们为Node.js和Java赞助开源的JWT库,可以在此处找到:

https://github.com/jwtk

如果您正在使用AngularJS,则我们还可以通过我们的Stormpath Angular SDK 实现JWT最佳实践。


3

Cookie通常用于保护Web应用程序。浏览器会自动将它们添加到每个请求中,这使得请求容易受到CSRF攻击。

JWT令牌通常用于保护Web API。该令牌附加在JavaScript的AJAX请求中。由于该令牌不会自动附加到请求中,因此请求不容易受到CSRF攻击。JWT令牌还可以跨域使用,以防您要访问的API位于另一个域上。

JWT令牌还用于本机客户端与Web API通信。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接