JWT 令牌存储在服务器的哪里以及其他相关问题

问题描述 投票:0回答:5

如标题所示,JWT 令牌存储在服务器端的哪里?在数据库中还是在内存中?我知道实施可能会因不同的要求而有所不同,但一般来说您会将其存储在哪里?

如果我想提供一个非常基本的令牌身份验证服务器,这意味着在通过 POST 请求接收到用户名和密码后,我想返回一个令牌。在这种情况下,使用非常基本的算法生成的令牌与 jwt 令牌有何不同?

通过简单算法生成的令牌:

  1. 它不包含有效负载
  2. 其值不是根据用户名和密码计算的,因此无法将其重新哈希回任何有意义的值

这种情况下,JWT还有用价值吗?

谢谢!

security jwt
5个回答
7
投票

客户端需要存储,服务器端不需要存储。

JWT 本身拥有所有声明,并且也由服务器签名。收到后,服务器检查签名并读取声明。它不会将其与存储的值进行匹配。这就是针对访问令牌使用 JWT 的全部意义。

查看 JWT 的结构。


7
投票

您不需要在服务器端存储令牌。 您应该在服务器上存储私钥(您选择的任何字符串),最好作为环境变量。 jsonwebtoken 提供的方法使用此私钥生成令牌以传递给客户端。 客户端必须将此令牌存储在客户端,以便可以将此令牌传递给标头中向服务器发出的后续请求。 服务器会从 header 中提取 token 值,并通过调用 jsonwebtoken 的方法使用私钥验证它。如果 token 没有以任何方式修改,则验证将成功。


5
投票

不需要存储Jwt token,但需要存储“secret-key”。 jwt的结构是header.payload.signature,其中签名由服务器生成,如下所示:

signature = HS256(base64Header + '.' + base64Payload, 'mysecret')

所以本质上:
1.header.payload.signature 在第一次登录时发送给客户端

2.client在后续的api调用中返回header.payload.signature 3.服务器解码验证如下: base64Header、base64Payload、signature = token.split('.')

header = base64Decode(base64Header)  
payload = base64Decode(base64Payload)

serverComputedSignature = HS256(base64Header + '.' + base64Payload, 
'mysecret')

if serverComputedSignature != signature:  
 print('FAILED')

4
投票

代币是一个通用术语。 JWT 定义了 token 的结构,包含以下三个部分。

1. header
2. payload
3. signature

存储 JWT 或任何其他格式的令牌是由业务需求驱动的。

如果出于任何原因必须使用/验证 JWT 的内容,则可以将其存储在数据库或任何其他存储中。

如果需要验证签名,则没有理由存储颁发的 JWT。


0
投票

在客户端,使用cookie来存储JWT令牌——始终安全,始终httpOnly,并具有正确的相同站点标志。 而在服务器端,我们不需要在服务器端存储令牌。我们需要存储私钥,我们在 jwt 签名中获得的私钥应该存储在环境变量中。

© www.soinside.com 2019 - 2024. All rights reserved.