作者:迷彩

JWT(JSON Web Token)介绍与实践

JWT介绍

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

JWT特点

  • 体积小,因而传输速度快
  • 传输方式多样,可以通过URL/POST参数/HTTP头部等方 式传输
  • 严格的结构化。它自身(在 payload 中)就包含了所有 与用户相关的验证消息,如用户可访问路由、访问有效期 等信息,服务器无需再去连接数据库验证信息的有效性, 并且 payload 支持为你的应用而定制化。
  • 支持跨域验证,可以应用于单点登录。

JWT原理

  • JWT是Auth0提出的通过对JSON进行加密签名来实现授 权验证的方案,编码之后的JWT看起来是这样的一串字符:
  • eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIx MjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWR taW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEf xjoYZgeFONFh7HgQ
  • 由 . 分为三段,通过解码可以得到:

JWT的结构-Header

  • Header

// 包括类别(typ)、加密算法(alg);
{ “alg”: “HS256”,“typ”: “JWT”}
jwt的头部包含两部分信息: 声明类型,这里是jwt 声明加密的算法 通常直接使用 HMAC SHA256 然后将头部进行base64加密(该加密是可以对称解 密的),构成了第一部分。
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

JWT的结构-Payload

  • Payload

Token的第二部分是负载,它包含了claim, Claim是一 些实体(通常指的用户)的状态和额外的元数据,有三种 类型的claim:reserved, public 和 private.Reserved claims: 这些claim是JWT预先定义的,在JWT中并不会强 制使用它们,而是推荐使用,常用的有 iss(签发 者),exp(过期时间戳), sub(面向的用户), aud(接 收方), iat(签发时间)。 Public claims:根据需要定义 自己的字段,注意应该避免冲突 Private claims:这些是 自定义的字段,可以用来在双方之间交换信息 负载使用 的例子:{ “sub”: “1234567890”, “name”: “John Doe”, “admin”: true} 上述的负载需要经过Base64Url编码后作 为JWT结构的第二部分。

JWT的结构-Signature

创建签名需要使用编码后的header和payload以及一个秘 钥,使用header中指定签名算法进行签名。例如如果希 望使用HMAC SHA256算法,那么签名应该使用下列方式 创建: HMACSHA256( base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret) 签名用于验证 消息的发送者以及消息是没有经过篡改的。 完整的JWT 完整的JWT格式的输出是以. 分隔的三段Base64编码,与 SAML等基于XML的标准相比,JWT在HTTP和HTML环 境中更容易传递。

JWT使用场景

如何使用JWT? 在身份鉴定的实现中,传统方法是在服 务端存储一个session,给客户端返回一个cookie,而使 用JWT之后,当用户使用它的认证信息登陆系统之后,会 返回给用户一个JWT,用户只需要本地保存该token(通 常使用local storage,也可以使用cookie)即可。 当用 户希望访问一个受保护的路由或者资源的时候,通常应该 在Authorization头部使用Bearer模式添加JWT,其内容 看起来是下面这样:Authorization: Bearer

因为用户的状态在服务端的内存中是不存储的,所以这是 一种无状态的认证机制。服务端的保护路由将会检查请求 头Authorization中的JWT信息,如果合法,则允许用户 的行为。由于JWT是自包含的,因此减少了需要查询数据 库的需要。 JWT的这些特性使得我们可以完全依赖其无 状态的特性提供数据API服务,甚至是创建一个下载流服 务。因为JWT并不使用Cookie的,所以你可以使用任何 域名提供你的API服务而不需要担心跨域资源共享问题 (CORS)。

JWT的认证流程图

JWT(JSON Web Token)介绍与实践_JWT

JWT工具类-生成Token方法

JWT(JSON Web Token)介绍与实践_json_02

JWT工具类-解析Token方法

JWT(JSON Web Token)介绍与实践_java_03

测试Token的生成和解析

JWT(JSON Web Token)介绍与实践_服务端_04

JWT的使用总结

  • 因为json的通用性,所以JWT是可以进行跨语言 支持的,像JAVA,JavaScript,NodeJS,PHP等很多 语言都可以使用。
  • payload部分,JWT可以在自身存储一些其他业 务逻辑所必要的非敏感信息。
  • 便于传输,jwt的构成非常简单,字节占用很小, 所以它是非常便于传输的。它不需要在服务端保 存会话信息, 所以它易于应用的扩展。

作者:迷彩