- 什么是JWT
- JSON Web 令牌 (JWT) 是一种紧凑的 URL 安全方法,用于表示要在双方之间传输的声明。JWT 中的声明被编码为 JSON 对象,该对象用作 JSON Web 签名 (JWS) 结构的有效负载或 JSON Web 加密 (JWE) 结构的明文,从而使声明能够进行数字签名或使用消息身份验证代码 (MAC) 和/或加密进行完整性保护
- 传统session流程
- 1)浏览器发起登陆请求
- 2)服务端验证身份,生成身份验证信息,存储在服务端,并且告诉浏览器写入cookie中
- 3)浏览器发送请求请求,携带cookie 内容发送到服务器端
- 4)服务器发现cookie中的用户信息,进行身份验证
- 5)服务器返回用户需要的数据
- JWT工作流程
- 1)浏览器发起登陆请求
- 2)服务器端验证用户身份,根据算法将用户标识符打包生成token,并返回给浏览器
- 3)浏览器再次发送请求时,携带上面生成的token一起发送给服务器
- 4)服务器获取发送来的token并进行验证
- 5)返回用户需要的数据
- JWT和Session的区别
- 1)session 存储在服务端占用服务器资源,而 JWT 存储在客户端2)session 存储在 Cookie 中,存在伪造跨站请求伪造攻击的风险3)session 只存在一台服务器上,那么下次请求就必须请求这台服务器,不利于分布式应用4)存储在客户端的 JWT 比存储在服务端的 session 更具有扩展性
- JWT工作原理
- 数据格式
- JWT生成的token串由三部分组成,中间以"."进行分割。header.payload.signature
- header
- 承载两部分信息
- alg:声明加密使用的算法
- typ:声明类型
- 承载两部分信息
- payload
- 承载有效的JWT数据包,包含三部分
- 标准声明
- 标准声明的字段
- 公共声明
- 公共声明的字段
- 公共声明字段可以添加任意信息,但是因为可以被解密出来,所以不要存放敏感信息
- 私有声明
- 私有声明的字段
- 标准声明
- 承载有效的JWT数据包,包含三部分
- signature
- 签证信息,通过header和playload,加上secret通过算法加密生成
- 生成公式
- signature = 加密算法(header + "." + payload, **)
- 数据格式
- token过期时间如何确定
- payload 中有个标准字段 exp,明确表示了这个 token 的过期时间.服务端可以拿这个时间与服务器时间作对比,过期则拒绝访问。
- 如何防止token被篡改
- 由于header和payload都是可能被解密为明文的,所以在服务器端可以依赖signature验证是否被篡改过
- 如何提高JWT的安全性
- 1)缩短 token 有效时间;
- 2)使用安全系数高的加密算法;
- 3)token 不要放在 Cookie 中,有 CSRF 风险;
- 4)使用 HTTPS 加密协议;
- 5)对标准字段 iss、sub、aud、nbf、exp 进行校验;
- 6)使用成熟的开源库,不要手贱造轮子;
- 7)特殊场景下可以把用户的 UA、IP 放进 payload 进行校验(不推荐)