我正在研究JWT作为传统Cookie会话的替代方案,但我没有看到它们与签名的Cookie有何不同,例如Express通过像cookie-parser这样的中间件提供的。
在它们两者中,最后一部分是有效载荷的签名,保证有效载荷没有被篡改。
签名cookie:
user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3
等效JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiVG9iaSJ9.kCTlR_Igb4H5cqBEDedShM2ivSQijPQkWqN4pZAXb2g
除了以下事实:
(1)JWT没有原产地限制
(2)cookie内容立即是人类可读的,而JWT内容(标题+有效载荷)是base64编码的
有什么能让JWT明显优于签名的cookie吗?
答案 0 :(得分:4)
谨防混淆问题:Cookie主要是一种在客户端存储数据的机制,它们本身并不是一种身份验证机制 - 但我们以这种方式使用它们:)
JWT的主要好处是声明的结构(JSON,带有公共字段)和声明的签名机制。这只是规范,没有什么特别之处。但是有一种持久的身份断言的常用方法很好。
您仍然需要以安全的方式存储JWT,而HttpOnly; Secure
的Cookie是最佳选择。这可以防止JavaScript环境读取cookie,从而阻止XSS攻击。
我已经写了一些关于JWT的博客文章,它们包含更多有助于回答您问题的信息:
Build Secure User Interfaces Using JSON Web Tokens (JWTs)
Token Based Authentication for Single Page Apps (SPAs)
免责声明:我在Stormpath工作。我们赞助了Node.js和Java的开源JWT库,可以在这里找到:
如果您使用的是AngularJS,我们还会使用Stormpath Angular SDK
开箱即用JWT最佳实践答案 1 :(得分:2)
Cookie通常用于保护Web应用程序。浏览器会自动将它们添加到每个请求中。这使得请求容易受到CSRF攻击。
JWT令牌通常用于保护Web API。令牌附加到JavaScript中的AJAX请求。由于令牌未自动附加到请求,因此请求不易受CSRF攻击。如果你正在谈论的API在另一个域上,JWT令牌也可以用于跨域。
JWT令牌也在本机客户端中用于与Web API通信。
答案 2 :(得分:0)
我发现本文非常有帮助:https://wp-rocket.me/blog/difference-json-web-tokens-vs-session-cookies/。首先讨论了两者之间的相似性,然后是差异,这有助于使它们变得非常清楚。
对我而言,要理解服务器打算使用cookie来检查数据库中的活动会话。 JWT可以存储在cookie中,但通常使用Authorization标头发送。服务器使用算法而不是通过检查数据库中的活动会话来验证JWT。