JWT简单介绍

1.背景介绍
        HTTP 是一种没有状态的协议,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。也就导致服务器无法分辨是谁浏览了网页。为了维持用户在网站的状态,比如登陆、购物车等。为了保证数据安全可靠地在用户与服务端之间传输,实现服务端的认证就显得极为必要。 常见的服务端认证方法有基于 Cookie-Session的认证;以及 Token (令牌)认证,如 JWT。

JWT是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。

2.知识剖析

JWT的结构
JWT包含了使用.分隔的三部分: Header 头部 Payload 负载 Signature 签名
其结构看起来是这样的Header.Payload.Signature
JWT 的 header 中承载了两部分信息

{
  "alg": "RS256",
  "typ": "JWT"
}
alg: 声明加密的算法
typ: 声明类型
对这个头部信息进行 base64,即可得到 header 部分

payload 是主体部分,意为载体,承载着有效的 JWT 数据包,它包含三个部分

标准声明
公共声明
私有声明
标准声明的字段

interface Stantar {
  iss?: string; // JWT的签发者
  sub?: string; // JWT所面向的用户
  aud?: string; // 接收JWT的一方
  exp?: number; // JWT的过期时间
  nbf?: number; // 在xxx日期之间,该JWT都是可用的
  iat?: number; // 该JWT签发的时间
  jti?: number; //JWT的唯一身份标识
}

 公共声明的字段

interface Public {
  [key: string]: any;
}
公共声明字段可以添加任意信息,但是因为可以被解密出来,所以不要存放敏感信息。

私有声明的字段

interface Private {
  [key: string]: any;
}
私有声明是 JWT 提供者添加的字段,一样可以被解密,所以也不能存放敏感信息。
       JWT 流程
浏览器发起请求登陆
服务端验证身份,根据算法,将用户标识符打包生成 token, 并且返回给浏览器
浏览器发起请求获取用户资料,把刚刚拿到的 token 一起发送给服务器
服务器发现数据中有 token,验明正身
服务器返回该用户的用户资料

3.编码实战

4.常见问题

1 它是如何做身份验证的?
首先,JWT 的 Token 相当是明文,是可以解密的,任何存在 payload 的东西,都没有秘密可言,所以隐私数据不能签发 token。

而服务端,拿到 token 后解密,即可知道用户信息,如userId,那么你就知道这个用户是谁,是否有权限进行下一步的操作。

2.如何防止 Token 被串改?
此时 signature字段就是关键了,能被解密出明文的,只有header和payload

假如黑客/中间人串改了payload,那么服务器可以通过signature去验证是否被篡改过。

在服务端在执行一次 signature = 加密算法(header + "." + payload, 密钥);, 然后对比 signature 是否一致,如果一致则说明没有被篡改。

3 安全性相关


缩短 token 有效时间
使用安全系数高的加密算法
token 不要放在 Cookie 中,有 CSRF 风险,跨站请求伪造
使用 HTTPS 加密协议
对标准字段 iss、sub、aud、nbf、exp 进行校验
特殊场景下可以把用户的 UA、IP 放进 payload 进行校验(不推荐)。

5.参考文献
            https://blog.csdn.net/qq_40081976/article/details/79046825
            https://blog.csdn.net/luckey_zh/article/details/61197587

   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值