在 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 访问值和保护<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 太大