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 有啥区别?