在 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 太大