如标题所示,JWT 令牌存储在服务器端的哪里?在数据库中还是在内存中?我知道实施可能会因不同的要求而有所不同,但一般来说您会将其存储在哪里?
如果我想提供一个非常基本的令牌身份验证服务器,这意味着在通过 POST 请求接收到用户名和密码后,我想返回一个令牌。在这种情况下,使用非常基本的算法生成的令牌与 jwt 令牌有何不同?
通过简单算法生成的令牌:
这种情况下,JWT还有用价值吗?
谢谢!
客户端需要存储,服务器端不需要存储。
JWT 本身拥有所有声明,并且也由服务器签名。收到后,服务器检查签名并读取声明。它不会将其与存储的值进行匹配。这就是针对访问令牌使用 JWT 的全部意义。
查看 JWT 的结构。
您不需要在服务器端存储令牌。 您应该在服务器上存储私钥(您选择的任何字符串),最好作为环境变量。 jsonwebtoken 提供的方法使用此私钥生成令牌以传递给客户端。 客户端必须将此令牌存储在客户端,以便可以将此令牌传递给标头中向服务器发出的后续请求。 服务器会从 header 中提取 token 值,并通过调用 jsonwebtoken 的方法使用私钥验证它。如果 token 没有以任何方式修改,则验证将成功。
不需要存储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')
代币是一个通用术语。 JWT 定义了 token 的结构,包含以下三个部分。
1. header
2. payload
3. signature
存储 JWT 或任何其他格式的令牌是由业务需求驱动的。
如果出于任何原因必须使用/验证 JWT 的内容,则可以将其存储在数据库或任何其他存储中。
如果需要验证签名,则没有理由存储颁发的 JWT。
在客户端,使用cookie来存储JWT令牌——始终安全,始终httpOnly,并具有正确的相同站点标志。 而在服务器端,我们不需要在服务器端存储令牌。我们需要存储私钥,我们在 jwt 签名中获得的私钥应该存储在环境变量中。