JWT和签名cookie有什么区别?

时间:2015-07-20 21:24:26

标签: session authentication cookies express jwt

我正在研究JWT作为传统Cookie会话的替代方案,但我没有看到它们与签名的Cookie有何不同,例如Express通过像cookie-parser这样的中间件提供的。

在它们两者中,最后一部分是有效载荷的签名,保证有效载荷没有被篡改。

签名cookie:

user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3 

等效JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiVG9iaSJ9.kCTlR_Igb4H5cqBEDedShM2ivSQijPQkWqN4pZAXb2g

除了以下事实:

(1)JWT没有原产地限制

(2)cookie内容立即是人类可读的,而JWT内容(标题+有效载荷)是base64编码的

有什么能让JWT明显优于签名的cookie吗?

3 个答案:

答案 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库,可以在这里找到:

https://github.com/jwtk

如果您使用的是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。