JWT详解

嚴華  金牌会员 | 2023-11-2 00:11:48 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 928|帖子 928|积分 2784

一、JWT认证原理

JWT(Json Web Token)是一种服务端向客户端发放令牌的认证方式。客户端用户名密码登录时,服务端会生成一个令牌返回给客户端;客户端随后在向服务端请求时只需携带这个令牌,服务端通过校验令牌来验证是否是来自合法的客户端,进而决定是否向客户端返回应答。
简单来说,就是服务器认证之后,会返回(生成)一个JSON对象,发送给客户端(用户),就像下面一样:
  1. {
  2.      "姓名": "张三",
  3.      "角色": "管理员",
  4.      "到期时间": "2023.10.2"
  5. }
复制代码
​        以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。

  • 适用场景

  • 授权:
    这是最常见的使用场景,解决单点登录问题。因为JWT使用起来轻便,开销小,服务端不用记录用户状态信息(无状态),所以使用比较广泛;
  • 信息交换:
​        JWT是在各个服务之间安全传输信息的好方法。因为JWT可以签名,例如,使用公钥/私钥对儿 - 可以确定请求方是合法的。此外,由于使用标头和有效负载计算签名,还可以验证内容是否未被篡改。


  • 工作流程
1.浏览器发起请求登陆,携带用户名和密码;
2.服务端验证身份,根据算法,将用户标识符打包生成 token,
3.服务器返回JWT信息给浏览器,JWT不包含敏感信息;
4.浏览器发起请求获取用户资料,把刚刚拿到的 token一起发送给服务器;
5.服务器发现数据中有 token,验明正身;
6.服务器返回该用户的用户资料;

二、JWT结构

​      JWT包含三部分:头部Header、负载Payload和签名Signature。

  • 头部Header
​        头部描述JWT的元数据,包括算法alg和类别typ等信息。alg描述签名算法,这样接收者可以根据对应的算法来验证签名,默认是如下所示的HS256,表示 HMAC-SHA256;typ表示令牌类型,设置为JWT,表示这是一个JWT类型的令牌。  {   "alg": "HS256",   "typ": "JWT" }

  • 负载Payload
​        存放令牌的主体内容,由认证服务AuthN生成相关信息并放到令牌的负载中。重要属性包括:  iss:令牌发行者 issuer aud:令牌受众 audience 在JWT验证时,会校验发行者、受众信息和令牌负载中的发行者iss、受众audience是否匹配。JWT的内容本身不是加密的,所有拿到令牌的服务都可以看到令牌负载Payload中的内容,因此建议Payload里不要存放私密的信息。

  • 签名Signature
​        签名字段是对头部和负载的签名,确保只有特定合法的认证服务才可以发行令牌。实际使用中一般是把头部和负载分别执行Base64转换成字符串,然后使用认证服务的密钥对拼接的字符串进行签名,签名算法正是前面介绍的头域中定义的算法。
一个完整的JWT示例如下:
​        对于头部Header和负载Payload进行签名得到Signature。
  1. # Header:
  2. {
  3.         "alg": "RS512",  
  4.     "typ": "JWT"
  5. }  
  6. # Payload
  7. {   
  8.     "iss": "weather@cloudnative-istio",
  9.     "audience": "weather@cloudnative-istio"
  10. }
  11. # Signature
  12. RSASHA512
  13. (   
  14.     base64UrlEncode(header) + "." +  
  15.     base64UrlEncode(payload)  
  16. )
复制代码
以上结构最终输出的令牌如下,可以看到“.”分割的三个字符串分别对应JWT结构的头部、负载和签名三部分。
  1. eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjQ2ODU5ODk3MDAsInZlciI6IjIuMCIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoid2VhdGhlckBjbG91ZG5hdGl2ZS1pc3Rpby5ib29rIiwic3ViIjoid2VhdGhlckBjbG91ZG5hdGl2ZS1pc3Rpby5ib29rIn0.SEp-8qiMwI45BuBgQPH-wTHvOYxcE_jPI0wqOxEpauw
复制代码
三、JWT的优缺点

1、JWT默认不加密,但可以加密。生成原始令牌后,可以使用改令牌再次对其进行加密。
2、当JWT未加密方法是,一些私密数据无法通过JWT传输。
3、JWT不仅可用于认证,还可用于信息交换。善用JWT有助于减少服务器请求数据库的次数。
4、JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权限。也就是说,一旦JWT签发,在有效期内将会一直有效。
5、JWT本身包含认证信息,因此一旦信息泄露,任何人都可以获得令牌的所有权限。为了减少盗用,JWT的有效期不宜设置太长。对于某些重要操作,用户在使用时应该每次都进行进行身份验证。
6、为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行传输。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表