微服务系列之-JWT安全认证


前言

JSON Web Tokens(JWT)是一种认证协议,是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准(RFC 7519)。JWT 一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该 Token 也可直接被用于认证,也可被加密。

授权服务器将用户信息和授权范围序列化后放入一个JSON字符串,然后使用Base64进行编码,最终在授权服务器用私钥对这个字符串进行签名,得到一个JSON Web Token。

假设其他所有的资源服务器都将持有一个RSA公钥,当资源服务器接收到这个在Http Header中存有Token的请求,资源服务器就可以拿到这个Token,并验证它是否使用正确的私钥签名(是否经过授权服务器签名,也就是验签)。验签通过,反序列化后就拿到Toekn中包含的有效验证信息。


一、JWT认证流程

在这里插入图片描述
流程描述:

  • 客户端调用登录接口(或者获取 token 接口),传入用户名密码。
  • 服务端请求身份认证中心,确认用户名密码正确。
  • 服务端创建 JWT,返回给客户端。
  • 客户端拿到 JWT,进行存储(可以存储在缓存中,也可以存储在数据库中,如果是浏览器,可以存储在 Cookie 中)在后续请求中,在 HTTP 请求头中加上 JWT。
  • 服务端校验 JWT,校验通过后,返回相关资源和数据。

二、JWT数据结构

在这里插入图片描述JWT 是由三段信息构成的,第一段为头部(Header),第二段为载荷(Payload),第三段为签名(Signature)。每一段内容都是一个 JSON 对象,将每一段 JSON 对象采用 BASE64 编码,将编码后的内容用. 链接一起就构成了 JWT 字符串。如下:

header.payload.signature
  1. 头部(header)
    头部用于描述关于该 JWT 的最基本的信息,例如其类型以及签名所用的算法等
    指明了类型为JWT,签名算法是 RS256算法的header
    在这里插入图片描述

  2. 载荷(payload)
    载荷也是body,是存放有效信息的地方。有效信息包含以下内容:
    在这里插入图片描述在这里插入图片描述除了上面的默认字段外,我们还可以自定义私有字段,如:
    在这里插入图片描述

  3. 签名(signature)
    创建签名需要使用 Base64 编码后的 header 和 payload 以及一个秘钥,将 base64 编码后的 header 和 base64 编码后的 payload 使用.连接组成的字符串,通过 header 中声明的加密方式进行加盐 secret 组合加密,然后就构成了 jwt 的第三部分。

在这里插入图片描述示例:

rs256sign(<base64URL-encoded header>.<base64URL-encoded body>)

三、JWT 的优点

  • 跨语言,JSON 的格式保证了跨语言的支撑
  • 基于 token,无状态
  • 占用字节小,便于传输

四、关于 token 注销

token 的注销,由于 token 不存储在服务端,由客户端存储,当用户注销时,token 的有效时间还没有到,还是有效的。所以如何在用户注销登录时让 token 注销是一个要关注的点。一般有如下几种方式:

  • token 存储在localStorage中,这样客户端注销时,自然可以清空掉
  • 注销时,将 token 存放到分布式缓存中,每次校验 token 时检查下该 token 是否已注销。不过这样也就失去了快速校验 token 的优点。
  • 采用短期令牌,比如token有效期是 20 分钟,这样可以一定程度上降低注销后 token 可用性的风险。

总结

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页