这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战
介绍
JSON Web Token (JWT) 是一个开放标准 ( RFC 7519 ),它定义了一种紧凑且自包含的方式,用于在各方之间作为 JSON 对象安全地传输信息。该信息可以被验证和信任,因为它是经过数字签名的。JWT 可以使用HMAC算法或使用RSA或ECDSA的公钥/私钥对进行签名。
虽然 JWT 可以加密并在各方之间提供保密,但我们将重点关注签名 令牌(Token)。签名令牌可以验证其中包含的声明的完整性,而加密令牌则对其他方隐藏这些声明。当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是对其进行签名的一方。
特点
紧凑
由于其较小的体积,JWT可以通过URL、POST参数或HTTP头部参数进行传递,体积小也意味着其传输速度会相当快。
独立
有效负载包含了所需要的关于用户的所有信息,避免了多次查询数据库的需要。
使用场景
授权
这是使用 JWT 最常见的场景。用户登录后,每个后续请求都将包含 JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是当今广泛使用 JWT 的一项功能,因为它的开销很小,并且能够轻松跨不同域使用。
信息交换
JWT 是一种在各方之间安全传输信息的好方法。因为 JWT 可以被签名——例如,使用公钥/私钥对——你可以确定发件人就是他们所说的那样。此外,由于使用标头和有效负载计算签名,因此您还可以验证内容是否未被篡改。
JWT结构
在其紧凑形式中,JWT由用点 ( .)分隔的三个部分组成,它们是:
Header(头部)Payload(载荷)Signature(签名)
因此,JWT通常看起来如下。
xxxxx.yyyyy.zzzzz
示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IuS4h-aBtueahOayq-eZvSJ9.PAxe7KUicknHL0H2hYJxm3V_UsHXa2GcHsgCJ40S8Fg
解码:
//Header
{
"alg": "HS256",
"typ": "JWT"
}
//Payload
{
"sub": "1234567890",
"name": "万恶的沫白"
}
//Signature
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
123456 //密钥
)
JWT验证
官网有提供验证工具