使用 jwt decode 来解码 react js 中的令牌是不是安全?

Posted

技术标签:

【中文标题】使用 jwt decode 来解码 react js 中的令牌是不是安全?【英文标题】:Is that safe use jwt decode to decode token in react js?使用 jwt decode 来解码 react js 中的令牌是否安全? 【发布时间】:2020-12-11 13:04:33 【问题描述】:

这可能是个愚蠢的问题,但我/对此很好奇。我是 React-js 和 node-js 后端的新手。我将 jwt 令牌保存在 Web 浏览器本地存储中,并在 react js 前端解码该令牌。我的问题是在前端安全使用 jwt 解码方法,因为如果有人知道令牌也可以解码令牌?

【问题讨论】:

您使用了正确的词:decode,但您似乎将其理解为好像它意味着 decrypt。 JWT 有效负载通常不加密,它只是 base64url 编码。但是,如果您无法确认签名有效,那么信任来自 JWT 的信息是否安全? 【参考方案1】:

答案是肯定的和否定的,如果你有一些用户识别信息(比如 userId)并且你可以接受这些数据,那么你可以在前端对其进行解码。如果您要在令牌上存储一些敏感信息,那么不会。 (这是一种不好的做法)。另请注意,无法修改有效负载。即使修改了签名也不会验证令牌。所以最好的做法是不要在有效负载中包含敏感数据。

【讨论】:

【参考方案2】:

JWT 代码有 3 个单独的部分,用 . 分隔 公共部分包含

HEADER:ALGORITHM & TOKEN TYPE

PAYLOAD:DATA

和一个VERIFY SIGNATURE 保证您的令牌有效与否。

所有持有token的人都可以提取公开部分

JWT decode 只查找公共部分,因此在您的前端代码中这样做是完全安全的。

一个例子:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

>> after decode
HEADER:ALGORITHM & TOKEN TYPE

  "alg": "HS256",
  "typ": "JWT"

PAYLOAD:DATA


  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022

【讨论】:

【参考方案3】:

是的。

JWT 背后的理念并不是它们不能被解码,事实上恰恰相反。它们被设计用于分布式系统。相反,它们是安全的,因为它们只能使用密钥生成,而该密钥应该只在应用程序的服务器端可用。

JWT 实际上包含三个部分 - 标头、有效负载和签名 - 标头、有效负载和密钥被组合并散列以形成签名。

然后使用此签名来验证标头和有效负载是否未被修改。如果有,签名将不再匹配。

【讨论】:

综上所述,为了确保您的设置“安全”,请勿在客户端的令牌和/或签名上存储任何敏感数据。

以上是关于使用 jwt decode 来解码 react js 中的令牌是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PyJWT 的 Jwt 解码引发签名验证失败

如何在没有密钥或没有验证的情况下解码 php/laravel 中的 jwt?

JWT-解码需要未定义,jwt解码未定义

JWT 解码返回 null

PHP Slim 解码 JWT 令牌

Jwt 令牌解码 - Symfony 4