在 HTTP 数据包(Cookie、标头或 JSON)中包含 JWT 令牌的正确方法

Posted

技术标签:

【中文标题】在 HTTP 数据包(Cookie、标头或 JSON)中包含 JWT 令牌的正确方法【英文标题】:Correct way to include JWT token on HTTP packet (Cookie, header or JSON) 【发布时间】:2016-11-21 23:27:42 【问题描述】:

在 HTTP 数据包中处理 JWT 令牌的标准和最安全的方法是什么?

JWT 不应该设置为 cookie 是否正确,因为 cookie 使会话劫持变得微不足道,因为浏览器会自动包含它,因此不会通过普通会话 id cookie 为 JWT 令牌提供任何附加值?

那么,JWT 令牌应该作为标头还是作为 JSON 属性包含,还是这是一个实践问题?

【问题讨论】:

【参考方案1】:

Cookie 和 Authorization 标头各有利弊。

Cookies 允许您阻止 javascript 访问这些值,但如果您只在 Authorization 标头中允许它,则不需要任何额外的 CSRF 保护。

Cookie 还允许您轻松保护非 JavaScript 请求,例如 <img 标记。

所以没有正确答案,也没有标准。你需要弄清楚什么对你来说很重要。

【讨论】:

cookie 阻止 javascript 访问值和保护 标签是什么意思?我认为 cookie 容易受到基于 javascript 和 CSRF 的攻击。授权标头是否歪曲了这个前提?另外,我不明白在 cookie 中存储令牌如何为 cookie 中的普通会话 id 提供任何额外的安全性,因为浏览器会自动将此 cookie 附加到请求中。对我来说更有意义的是,令牌位于服务器响应的 TLS 加密标头/正文中,需要以编程方式添加到每个请求中以避免会话占用。 @TuomasToivonen 我所说的“阻止 javascript 访问值的 cookie”的意思是“HttpOnly”cookie。查一下。至于<img> 标签。您基本上不能自动向它们添加授权标头。 Cookies 也会自动附加这些请求,但 Authorization 标头不会。是的,如果您没有额外的保护,Cookie确实允许 CSRF 请求。 所以整体 cookie + csrf 令牌方法似乎更安全,因为它可以防止 csrf 和 xss @TuomasToivonen。在这种情况下,我真的不喜欢说“a 比 b 更安全”,因为这实际上取决于很多因素(包括人、语言选择、​​框架等)。主要的一点是,两者都可以视情况而定。【参考方案2】:
    使用 HTTPS 将令牌的过期时间设置得越小越好(5 分钟、30 分钟、月或年)。 使用刷新令牌获取新令牌并在每次更新旧令牌时更新刷新令牌(毫无疑问,当用户登录时) 不要在令牌中存储密码、信用卡号和任何机密信息(我确定,你知道的 :)) 存储所有必要的信息以检查权限(或检查 ip,例如)。它适用于 REST API 和水平扩展。而且您不再需要 cookie )) 我通过标头发送令牌(例如 curl -X GET -H "X-Access-Token: ..." localhost:3000 )

【讨论】:

以上是关于在 HTTP 数据包(Cookie、标头或 JSON)中包含 JWT 令牌的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

Wininet 是不是处理 HTTP 标头值“Set-Cookie”?

400 Bad Request - 请求标头或 cookie 太大

Charles抓包工具操作指南

set-cookie 不与 http 请求标头一起发回

如何从 graphQL apollo 突变或查询上的 cookie 更新授权标头

使用 HTTParty 解析 HTTP 标头“set-cookie”