在请求的标头中发送令牌是不是安全?

Posted

技术标签:

【中文标题】在请求的标头中发送令牌是不是安全?【英文标题】:Is it secure to send token in header of the request?在请求的标头中发送令牌是否安全? 【发布时间】:2020-11-23 06:16:59 【问题描述】:

我想使用 jwt 令牌向我的应用程序添加身份验证。

每次向服务器发送请求时,我都会附加服务器创建的令牌。

我受伤了,这是在标头中发送令牌的安全方式吗?如果有人访问我的计算机并在 devtools 选项卡中检查我的网络并查看我的令牌,他可以使用令牌模拟请求并控制用户数据。

这是常见的情况吗?以及窃取和破解 jwt 令牌的方法?

【问题讨论】:

使用 HTTPS 就可以了。是的,如果人们可以访问您的计算机,他们总是可以窃取您的(短期)凭据和会话。 我正在使用 HTTPS。所以尽管有人可以访问我的计算机并查看令牌,但它可以安全使用? 不,其他人访问您的计算机并检查您的网络流量是不安全的,但这不是令牌与其他形式的身份验证可以帮助解决的问题。如果您的应用程序正在使用它们,他们会窃取您的会话 cookie。 【参考方案1】:

这就是它应该发生的方式。在 JWT 令牌身份验证中,服务器提供的令牌应始终作为具有 Authorization: Bearer <token> 格式的标头发送。

然后网站应该在请求到来时检查令牌的有效性并相应地处理它。

编辑

是的,必须使用 HTTPS。如果有人掌握了您的计算机,那么他们可以使用令牌来冒充用户。令牌的好处是它们大多是短暂的,这意味着它们很快就会过期。因此停止使用它们,需要重新认证。

【讨论】:

这不是在回答我的问题【参考方案2】:

是的,通过标头发送是安全的,即使没有 https

如果有人访问我的计算机并在 devtools 选项卡中检查我的网络并查看我的令牌怎么办

在这种情况下,他还可以偷你的钱包、信用卡、汽车、房子、妻子等。你明白了,如果有人可以直接访问 - 游戏结束

您将 JWT 与 Bearer 混合在一起,它们是不同的

https://***.com/a/40375745/2308005

【讨论】:

"即使没有 https" - 请澄清 解码令牌需要秘钥,没有秘钥无法读取垃圾字符串 如果您说的是 JWT,那就错了,它们的内容始终是公开的,但这与传输加密是否是个好主意无关? JWT 可以在没有任何秘密的情况下被解码(它不比 Base64 多多少)。您只需要秘密来验证它的有效性。但即使你是对的,也没有什么能阻止你自己简单地将其用作授权标头并代表他们提出请求。 你为什么认为我在谈论 jwt?” 因为 OP 专门提到了 JWT? "我想使用 jwt 令牌向我的应用程序添加身份验证。"【参考方案3】:

是的,将令牌附加到标头是很常见的。它看起来像这样:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

当然有人可以进入您的计算机并检查令牌。但是通常您的计算机也需要某种身份验证才能登录。手机也是如此,几乎每个人都有某种密码。

存储令牌的好方法是 httpOnly cookie。使用此标志,javascript 无法读取客户端的 cookie。这使得 XSS 攻击更难获得令牌。

关于 JWT 的问题是它们有一个过期日期,并且它们在到达日期之前都是有效的。假设您登录网页并获得一些令牌。现在有人偷了你的令牌。您注销并从您的设备中删除令牌。

现在的问题是令牌被盗并且仍然有效,因此攻击者可以使用它。

此时,攻击者在技术上就是你,因为他拥有包含保存数据的令牌。

您可以在此处创建一个黑名单。如果您注销,则将您的令牌放入黑名单。每当有人尝试访问需要令牌的东西时,您首先检查该令牌是否在黑名单内,如果是则拒绝请求。

对于黑名单,我建议使用像 redis 这样的缓存来快速访问。

【讨论】:

@MedetTleukabiluly 不,它不是大声笑,我会用真实的编辑它 总是从eyJ开始 @MedetTleukabiluly 出于某种原因我把它误认为是密码哈希 @Ifaruki 喜欢你的回答。好奇1)服务器端是否有类似黑名单的? 2)一旦用户注销,假设确认服务器我今天外出。服务器能否记住最后一个令牌和来自此帐户的无效请求,直到提交不同的新令牌? @Jeb50 关于 JWT 的问题是,一旦创建它们,它们在过期之前始终有效。想象一下,某个第三人拥有您的令牌。他可以授权自己为你。要“使”该令牌“无效”,您需要添加它以将此令牌保存在列表中,就像您注销时的缓存一样。现在发出请求后,您需要一个准备步骤才能获取数据。您首先检查该特定令牌是否在该列表中。如果是,则拒绝访问【参考方案4】:

令牌是一个短暂的密钥。任何有权访问令牌的人都可以访问该密钥解锁的任何内容。感觉不安全,但这是使用令牌的基本属性。您使用 HTTPS 对数据进行加密,使其无法一路读取,但人们总有办法获取令牌。

在易用性和安全性之间经常需要权衡取舍。人们已经接受了与使用令牌进行身份验证相关的风险。需要明确的是,任何存储密钥的身份验证方法都有这个问题;唯一真正的选择是为每个请求询问密码,但没有人有时间这样做。

【讨论】:

以上是关于在请求的标头中发送令牌是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将身份验证令牌放在 GET 请求的标头中

使用浏览器获取请求发送 JWT 令牌

我是不是在发布请求的标头或正文中传递身份令牌?

无法在 POST Ajax 请求中发送授权令牌 - 出现错误 - Access-Control-Allow-Headers 不允许请求标头字段 authToken

POST请求标头与rest api中敏感数据的请求主体

如何验证请求标头、JWT 令牌