JWT 和签名 cookie 有啥区别?

Posted

技术标签:

【中文标题】JWT 和签名 cookie 有啥区别?【英文标题】:What is the difference between JWT and signed cookies?JWT 和签名 cookie 有什么区别? 【发布时间】:2015-10-10 04:08:13 【问题描述】:

我正在研究 JWT 作为使用 cookie 的传统会话的替代方案,但我看不出它们与签名 cookie 有何根本区别,例如 Express 通过 cookie-parser 等中间件提供的签名 cookie。

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

签名cookie:

user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3 

等效的 JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiVG9iaSJ9.kCTlR_Igb4H5cqBEDedShM2ivSQijPQkWqN4pZAXb2g

除了以下事实:

(1) JWT 没有来源限制,而且

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

与签名 cookie 相比,JWT 有什么明显优势吗?

【问题讨论】:

【参考方案1】:

小心混淆这些问题:cookie 主要是一种在客户端存储数据的机制,它们本质上不是一种身份验证机制 - 但我们以这种方式使用它们 :)

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

您仍然需要以安全的方式存储您的 JWT,带有HttpOnly; Secure 的 cookie 是最佳选择。这可以防止 cookie 被 javascript 环境读取,从而防止 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 最佳实践

【讨论】:

【参考方案2】:

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

JWT 令牌通常用于保护 Web API。令牌附加到 JavaScript 中的 AJAX 请求。由于令牌不会自动附加到请求上,因此请求不易受到 CSRF 攻击。 JWT 令牌也可以跨域使用,以防您正在与之交谈的 API 位于另一个域中。

JWT 令牌也用于本机客户端与 Web API 对话。

【讨论】:

以上是关于JWT 和签名 cookie 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

签名证书和加密证书有啥区别?

当我想使 JWT 令牌无效时,JWT 和 session-cookie 有啥区别?

Android每日一题:v3签名key和v2还有v1有啥区别

JWT 签名算法 HS256 与 RS256

Jwt介绍

Jwt介绍