4 分钟讲解 JWT(附图片)
介绍
JWT 的结构
步骤
优势
缺点
介绍
JWT 身份验证和会话身份验证是验证 Web 应用用户身份的方法。
本文将详细介绍 JWT、其结构以及优缺点。JWT
代表JSON Web Token,它是一种常用的无状态用户身份验证标准,用于以 JSON 格式在客户端和服务器之间安全地传输信息。
默认情况下,JWT 是编码的,而不是加密的。
它使用只有服务器知道的密钥进行数字签名。JWT
也可以加密,但本文将重点介绍已签名的非加密令牌。
JWT 的结构
JSON Web Token 由三部分组成,三部分之间用句点分隔:
标头、有效负载和签名。
每部分均采用 Base64 编码。
标题
标头由令牌类型(即 JWT)和使用的签名算法(例如 HMAC SHA256 或 RSA)组成。
{
"typ": "JWT",
"alg": "HS256"
}
有效载荷
有效负载由声明组成。
声明是关于用户的声明以及其他数据。
例如,我们有令牌的签发时间。
我们也有它的到期时间,因为令牌应该过期。
{
"iss": "example_issuer",
"sub": "user_id123",
"exp": 1644768000,
"iat": 1644744000
}
签名
签名是 JWT 最重要的部分。
它由头部、有效载荷和密钥计算得出,并输入到签名算法中以供使用。
signature = HMAC-SHA256(base64urlEncode(header) + "." + base64urlEncode(payload), secret_salt )
步骤
典型的 JWT 授权流程涉及的步骤如下:
1- 身份验证:用户使用用户名和密码登录,或者使用例如 Google 或 Facebook 等平台。
服务器验证用户提供的凭证。
2- 令牌生成并将令牌发送到客户端:服务器将生成 JWT 并将其发送到客户端,客户端将其存储以供将来使用。
3-将令牌发送到服务器:当客户端想要访问服务器上受保护的资源时,它会在 HTTP 请求的授权标头中发送 JWT。
axios.get(URL, {
headers: {
'Authorization': 'Bearer ' + token,
},
})
4-验证令牌:服务器接收请求,并使用签名密钥检查 JWT 的签名,从而验证其有效性。
如果 JWT 有效,服务器将提取其中包含的信息,并根据这些信息确定用户有权执行的操作。
5- 授权请求:如果用户有权访问资源,服务器将返回请求的数据。如果用户未获得授权,服务器将返回错误消息。
优势
-
轻的
-
便携性:可以在多个平台、网络和移动设备上处理。
-
JSON 解析器在大多数编程语言中很常见。
-
由于密钥存储在服务器端,因此可以防止篡改。
-
由于 JWT 令牌的无状态特性,服务器不需要存储任何会话信息。
缺点
- 在服务器端,应在注销时手动将未过期的 JWT 标记为无效。即使 JWT 从客户端删除后仍然有效。
使用的一种方法是令牌黑名单,它涉及在服务器端维护无效令牌列表,防止其重新用于身份验证。
-
对于签名的非加密令牌,我们不应该存储敏感信息,因为 JWT 受到保护以防止篡改,但任何人都可以解码和读取。
-
如果被拦截,可以提供完全访问权限。因此,客户端的 JWT 应该存储在安全的地方,例如浏览器中的 HttpOnly Cookie。
我的其他文章: