在 JWT 的上下文中,Stormpath 写了一篇很有帮助的文章,概述了存储它们的可能方法,以及与每种方法相关的(缺点)优点。
它还简要概述了 XSS 和 CSRF 攻击,以及如何对抗它们。
我附上了下面文章的一些简短的sn-ps,以防他们的文章被下线/他们的网站出现故障。
本地存储
问题:
Web 存储 (localStorage/sessionStorage) 可通过同一域上的 JavaScript 访问。这意味着在您的站点上运行的任何 JavaScript 都可以访问 Web 存储,因此很容易受到跨站点脚本 (XSS) 攻击。简而言之,XSS 是一种漏洞,攻击者可以在其中注入将在您的页面上运行的 JavaScript。基本的 XSS 攻击尝试通过表单输入注入 JavaScript,攻击者会在其中发出警报('You are Hacked');放入一个表单中,看看它是否由浏览器运行,是否可以被其他用户查看。
预防:
为了防止 XSS,常见的反应是对所有不受信任的数据进行转义和编码。但这远非故事的全部。 2015 年,现代 Web 应用程序使用托管在 CDN 或外部基础设施上的 JavaScript。现代网络应用程序包括用于 A/B 测试、漏斗/市场分析和广告的第三方 JavaScript 库。我们使用 Bower 等包管理器将其他人的代码导入我们的应用程序。
如果您使用的只有一个脚本遭到入侵怎么办?恶意的
页面可以嵌入 JavaScript,Web Storage 是
妥协。这些类型的 XSS 攻击可以获取每个人的 Web Storage
在他们不知情的情况下访问您的网站。这大概就是为什么一个
一堆组织建议不要存储任何有价值或信任的东西
网络存储中的任何信息。这包括会话标识符和
令牌。
作为一种存储机制,Web Storage 不强制执行任何安全
传输过程中的标准。阅读和使用 Web Storage 的人必须
尽职调查以确保他们始终通过 HTTPS 发送 JWT
并且从不使用 HTTP。
Cookies
问题:
Cookie 与 HttpOnly cookie 标志一起使用时,无法通过 JavaScript 访问,并且不受 XSS 影响。您还可以设置 Secure cookie 标志以保证 cookie 仅通过 HTTPS 发送。这是过去利用 cookie 存储令牌或会话数据的主要原因之一。现代开发人员对使用 cookie 犹豫不决,因为他们传统上要求将状态存储在服务器上,从而破坏了 RESTful 最佳实践。如果您在 cookie 中存储 JWT,则作为存储机制的 cookie 不需要将状态存储在服务器上。这是因为 JWT 封装了服务器为请求提供服务所需的所有内容。
但是,cookie 容易受到不同类型的攻击:
跨站点请求伪造(CSRF)。 CSRF 攻击是一种攻击
当恶意网站、电子邮件或博客导致用户
Web 浏览器在受信任的站点上执行不需要的操作
用户当前已通过身份验证。这是一个利用
浏览器处理 cookie。 cookie 只能发送到
这是允许的。默认情况下,这是最初的域
设置cookie。 cookie 将被发送请求而不管
无论您是在 galaxies.com 还是 hahagonnahackyou.com。
预防:
除了HttpOnly 和Secure 之外,现代浏览器还支持SameSite flag。该标志的作用是防止cookie在跨站请求中传输,防止多种CSRF攻击。
对于不支持SameSite的浏览器,可以通过使用同步令牌模式来防止CSRF。这
听起来很复杂,但所有现代 Web 框架都支持
这个。
例如,AngularJS 有一个解决方案来验证 cookie 是
只能由您的域访问。直接来自 AngularJS 文档:
在执行 XHR 请求时,$http 服务从
cookie(默认为 XSRF-TOKEN)并将其设置为 HTTP 标头
(X-XSRF-令牌)。因为只有在您的域上运行的 JavaScript 才能
读取 cookie,您的服务器可以确定 XHR 来自
在您的域上运行的 JavaScript。你可以做这个 CSRF 保护
通过包含xsrfToken JWT 声明来实现无状态:
{
"iss": "http://galaxies.com",
"exp": 1300819380,
"scopes": ["explorer", "solar-harvester", "seller"],
"sub": "tom@andromeda.com",
"xsrfToken": "d9b9714c-7ac0-42e0-8696-2dae95dbc33e"
}
利用您的 Web 应用程序框架的 CSRF 保护使 cookie 变得强大
用于存储 JWT 的实体。 CSRF 也可以通过以下方式部分预防
检查您的 API 中的 HTTP Referer 和 Origin 标头。 CSRF
攻击将具有与不相关的 Referer 和 Origin 标头
你的申请。
完整的文章可以在这里找到:
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage/
关于令牌本身的结构,他们还有一篇关于如何最好地设计和实施 JWT 的有用文章:
https://stormpath.com/blog/jwt-the-right-way/