鉴权与授权
众所周知,有些资源不能让所有用户都能访问,需要加以限制,此时我们说,某个资源访问需要某些权限。比如说限制全部用户信息,只有超级管理员这个权限的用户才能查看和修改。
所以在用户访问这个资源的时候,就必须有一个步骤是鉴定该用户是否为超级管理员,鉴定为真则允许访问,否则拒绝,这个步骤就成为称为鉴权。
想要鉴权,必然要求用户在访问资源的时候,就会携带权限信息。权限信息应该如下图
在网页访问中,用户如何在访问时携带以上权限信息,实际上就是登陆的时候,服务器将信息打包发送给到浏览器,后续浏览器的每次访问都要带上以上信息。登陆的时候,服务器将权限给到浏览器的过程,成为授权。
让我们稍微总结一下,授权就是登陆时账号密码验证通过之后,服务器给客户端发送的角色信息,这个角色信息用来作为判断是有有权访问其他的资源的一句,我们不妨称为权限信息。而这个用户访问资源时服务器判断权限信息的过程就叫做鉴权。
简而言之,登陆的时候浏览器发了一个标志给用户,后续用户访问资源携带这个标志,服务器比对用户携带的标志与资源标志是不是一致,一致则允许访问。
JWT
什么是JWT
jwt的全称是Json Web Token,用Json文本的形式,在Web领域作为Token的来使用的玩意儿。
JWT的结构
JWT(JSON Web Token)的报文通常由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature),这三部分由点(`.`)连接成一个字符串。下面是一个示例JWT报文及其各部分的解释:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1. 头部(Header):
- 通常包含令牌的类型(即JWT)和所使用的签名算法,如HMAC SHA256(HS256)。
{
"alg": "HS256",
"typ": "JWT"
}
经过Base64编码后,这部分变成了JWT的第一个部分。
2. 载荷(Payload):
- 包含所要传递的信息。载荷可以包含多个声明(Claims)。声明是关于实体(通常是用户)和其他数据的声明。
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"exp": 1516239022
}
sub 是JWT中常用的一个声明,表示主题(通常是用户的唯一标识);exp 表示令牌的过期时间。
经过Base64编码后,这部分变成了JWT的第二个部分。
3.签名(Signature):
- 用于验证消息在传输过程中没有被更改,并且,对于使用私钥签名的令牌,还可以验证发送者的身份。
- 签名的生成过程通常涉及以下步骤:
1. 使用头部指定的算法(比如HS256),使用密钥对头部和载荷的Base64Url编码字符串进行签名。
2. 将头部、载荷和签名连接成一个字符串。
- 例如,如果使用HS256算法,签名部分将是:
HMACSHA256(
base64UrlEncode(header),
base64UrlEncode(payload),
secret
)
这里的`secret`是服务器用来签名和验证JWT的密钥。
请注意,上面的JWT报文是一个示例,实际的JWT应该包含实际的头部、载荷和签名。在实际应用中,头部和载荷通常由你的应用程序逻辑来定义,签名则由服务器使用一个只有服务器知道的密钥生成。
为了安全起见,不要在JWT中存储敏感信息,因为JWT可以被解码查看。此外,确保在HTTPS上传输JWT,以防止中间人攻击。
JWT被设计于什么场合
前文提到的鉴权与授权就是JWT最主要的应用场合, 用户在登录时,服务器会给JWT到浏览器,后续浏览器的每次访问都会携带token到服务器,服务器会检查token,通过之后则允许访问资源。
服务器会如何检查JWT
1.Base64解码Header和Load
2.通过Header中相同的算法+密钥 对Header和Load的内容进行签名
3.新算出来的签名与JWT中的签名进行比较相同则认为没有被篡改过
检查JWT的意义是什么
1. 用相同的算法和密钥进行签名是为了检查JWT是为了确认token是自己的发给浏览器的
2. 比对签名是为了确认是否有被篡改