授权/鉴权与JWT大概是怎么一回事

     鉴权与授权   

        众所周知,有些资源不能让所有用户都能访问,需要加以限制,此时我们说,某个资源访问需要某些权限。比如说限制全部用户信息,只有超级管理员这个权限的用户才能查看和修改。

         所以在用户访问这个资源的时候,就必须有一个步骤是鉴定该用户是否为超级管理员,鉴定为真则允许访问,否则拒绝,这个步骤就成为称为鉴权

想要鉴权,必然要求用户在访问资源的时候,就会携带权限信息。权限信息应该如下图

在网页访问中,用户如何在访问时携带以上权限信息,实际上就是登陆的时候,服务器将信息打包发送给到浏览器,后续浏览器的每次访问都要带上以上信息。登陆的时候,服务器将权限给到浏览器的过程,成为授权

        让我们稍微总结一下,授权就是登陆时账号密码验证通过之后,服务器给客户端发送的角色信息,这个角色信息用来作为判断是有有权访问其他的资源的一句,我们不妨称为权限信息。而这个用户访问资源时服务器判断权限信息的过程就叫做鉴权。

        简而言之,登陆的时候浏览器发了一个标志给用户,后续用户访问资源携带这个标志,服务器比对用户携带的标志与资源标志是不是一致,一致则允许访问。

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. 比对签名是为了确认是否有被篡改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值