一、 JWT 介绍

一. JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑和自包含的方式,用于 在各方之间作为JSON对象安全地传输信息。作为标准,它没有提供技术实现,但是大部分的语言平台都有 按照它规定的内容提供了自己的技术实现,所以实际在用的时候,只要根据自己当前项目的技术平台,到官 网上选用合适的实现库即可。 二.使用JWT来传输数据,实际上传输的是一个字符串,这个字符串我们也把它叫做token(令牌),这个 token有几个特点: 1. 紧凑,token很小,能通过url参数或请求头的方式来传递 2. token可以包含很多信息,比如用户信息等,别人拿到这个token,就能拿到这些关键的业务信 息,从而避免再通过数据库查询等方式才能得到它们。 3. 在生成token时可以设置有效时间,在有效时间内服务器都可以正确的解析这个token并且可以拿 到关键的业务信息,所以无需像session一样要在服务器保存用户的状态,可以大大减轻服务器的压力 4. 在分布式系统中也无需考虑像session共享等问题,只需在每个分布式节点中使用统一的解密算法 来解析token即可。 三.基于token的身份认证流程: 1.用户携带用户名和密码请求访问 2.服务器校验用户凭据 3.应用提供一个token给客户端 4.客户端存储token,并且在随后的每一次请求中都带着它 5.服务器校验token并返回数据

二、 JWT 组成

jwt由三部分组成,这三部分分别是:header(头部)、payload(载荷)和signature(签名)。 1.Header:头部信息,是一个 JSON 对象,用于描述 JWT 的元数据 例如:{ "alg": "HS256", "typ": "JWT" } alg:表示签名的算法,默认是HMAC SHA256(写成 HS256),它是一种哈希加密算法 typ:表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT 2.Payload:载荷,也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,供选 用 iss (issuer):签发人 exp (expiration time):过期时间 sub (subject):主题 aud (audience):受众 nbf (Not Before):生效时间 iat (Issued At):签发时间 jti (JWT ID):编号 3.Signature:签名,部分是对前两部分的签名,防止数据篡改。然后还需要指定一个密钥(secret)。这 个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法,按照下面的公式 产生签名 HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) 算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间 用"点"(.)分隔,就可以返回给用户

image.png