权限管理
「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」
什么是JWT?
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名
JWT的组成
Header、Payload、Signature
header头部
头部包含了2部分,token类型和采用的加密算法
{
"alg": "HS256",
"typ": "JWT"
}
Payload负载
存放信息的地方, 可以把用户的id等信息放在这里,
常用的由 iss(签发者),exp(过期时间),sub(面向的用户),aud(接收方),iat(签发时间)
{
"iss": "lion1ou JWT",
"iat": 1441593502,
"exp": 1441594722,
"aud": "www.example.com",
"sub": "lion1ou@163.com"
}
Signature签名
Signature签名前⾯两部分都是使⽤ Base64 进⾏编码的,即前端可以解开知道⾥⾯的信息。
Signature 需要使⽤编码 后的 header 和 payload 以及我们提供的⼀个密钥,然后使⽤ header 中指定的签名算法(HS256)进 ⾏签名。签名的作⽤是保证 JWT 没有被篡改过。 三个部分通过 . 连接在⼀起就是我们的 JWT 了,它可能⻓这个样⼦,⻓度貌似和你的加密算法和私钥 有关系。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9`.`eyJpZCI6IjU3ZmVmMTY0ZTU0YWY2NGZmYzUzZGJkNSIsInhzcmYiOiI0ZWE1YzUwOGE2NTY2ZTc2MjQwNTQzZjhmZWIwNmZkNDU3Nzc3YmUzOTU0OWM0MDE2NDM2YWZkYTY1ZDIzMzBlIiwiaWF0IjoxNDc2NDI3OTMzfQ`.`PA3QjeyZSUh7H0GfE0vJaKW4LjKJuC3dVLQiY4hii8s
签名的目的
实际上是对头部以及负载内容进行签名,防止内容被窜改。如果有人对头部以及负载的内容解码之后进行修改,再进行编码,最后加上之前的签名组合形成新的JWT的话,那么服务器端会判断出新的头部和负载形成的签名和JWT附带上的签名是不一样的。如果要对新的头部和负载进行签名,在不知道服务器加密时用的密钥的话,得出来的签名也是不一样的。
为什么使用JWT
传统认证方式
JWT认证
JWT使用
- 授权中心和资源中心持有私钥和公钥
- 私钥颁发令牌
- 公钥验证令牌