1. 什么是JWT

Json web token(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其他业务逻辑所必须的声明信,可以被直接用于认证,也可被加密。

2. JWT组成

JWT由三部分组成:Base64.encode(header).Base64(payload).签名值

  • header头部

    • 声明类型,即JWT
    • 声明加密算法,同时直使用HMAC SHA256
  • Payload - jwt存放的数据 【注意不能存放敏感数据】

    • 标准中注册的声明(建议但不强制使用)
      • iss:JWT签发者
      • sub:JWT所面向的用户
      • aud:接收JWT的一方
      • exp:JWT的过期时间,过期时间必须大于签发时间
      • iat:JWT的签发时间
      • jti:JWT的唯一身份标识,主要用来作为一词性token,从而回避重放攻击
    • 公共的声明
      • 可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息。
    • 私有的声明
      • 是提供者和消费者所共同定义的声明,一般不建议存放敏感信息。
  • Payload采用md5加密之后的签名值

3. JWT示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

img

4. JWT作用

JWT初衷是为了实现授权和身份认证作用,可以实现无状态、分布式的Web应用授权。

  • Authentication(鉴权)
    这是使用JWT最常见的情况。 一旦用户登录,每个后续请求都将包含JWT,允许用户访问该令牌允许的路由,服务和资源。 单点登录是当今广泛使用JWT的一项功能,因为它的开销很小,并且能够轻松地跨不同域使用。
  • Information Exchange(信息交换)
    JSON Web Tokens是在各方之间安全传输信息的好方式。 因为JWT可以签名:例如使用公钥/私钥对,所以可以确定发件人是他们自称的人。 此外,由于使用标头和有效载荷计算签名,因此您还可以验证内容是否未被篡改。

JWT主要流程如下:

img

5. 与传统session区别

5.1 传统session

HTTP本身是一种无状态协议,即意味着如果用户向应用提供了用户名和密码进行认证,认证通过后HTTP协议不会记录认证后的状态,因此在下一次请求时,用户还需再进行一次认证,依据HTTP协议,为了使应用能够识别是哪个用户发出的请i去,只能在客户首次登录成功后,在服务器存储一用户登录的信息,该登录信息会在响应时传递给浏览器,即Set-Cookie,以便下次请求时发送给应用,应用可更具请求中携带的Cookie识别该请求来自哪个用户。

传统session认证缺点:

  • 随着用户增多,服务器开销会明显增大(每个用户的登录信息都会保存到服务session中)
  • 由于session时存在于服务器的物理内存中,所在不适用分布式服务器
  • 非 浏览器的客户端、手机移动端等不适用
  • 由于session认证本质基于cookie,当发生 cookie
  • 劫持后,用户很容易受到跨站请i去伪造攻击
  • 由于基于Cookie,而Cookie无法跨域,所以session的认证也无法跨域,对单点登录不适用

5.2 JWT优势

  • 简洁,JWT Token数据量小,传输速度也很快
  • 由于JWT Token是以JSON加密形式保存在客户端的,所以JWT是跨语言的,原则上任何web形式都支持
  • 不依赖于cookie和session,所以没有了传统session认证的弊端,适用于分布式微服务
  • 单点登录友好,token可以被保存在客户端的任意位置的内存中,不一定是cookie,所以不依cookie
  • 适合移动端应用