免费网站建设招商,石家庄最近新闻事件,wordpress 首页顶部为空,百度 网站改版了JSON Web Token#xff08;缩写 JWT#xff09;是目前最流行的跨域认证解决方案#xff0c;本文介绍它的原理和用法。 一、跨域认证的问题
互联网服务离不开用户认证。一般流程是下面这样。 1、用户向服务器发送用户名和密码。
2、服务器验证通过后#xff0c;在当前对话…JSON Web Token缩写 JWT是目前最流行的跨域认证解决方案本文介绍它的原理和用法。 一、跨域认证的问题
互联网服务离不开用户认证。一般流程是下面这样。 1、用户向服务器发送用户名和密码。
2、服务器验证通过后在当前对话session里面保存相关数据比如用户角色、登录时间等等。
3、服务器向用户返回一个 session_id写入用户的 Cookie。
4、用户随后的每一次请求都会通过 Cookie将 session_id 传回服务器。
5、服务器收到 session_id找到前期保存的数据由此得知用户的身份。
这种模式的问题在于扩展性不好。单机当然没有问题如果是服务器集群或者是跨域的服务导向架构就要求 session 数据共享每台服务器都能够读取 session。
举例来说A 网站和 B 网站是同一家公司的关联服务。现在要求用户只要在其中一个网站登录再访问另一个网站就会自动登录请问怎么实现
一种解决方案是 session 数据持久化写入数据库或别的持久层。各种服务收到请求后都向持久层请求数据。这种方案的优点是架构清晰缺点是工程量比较大。另外持久层万一挂了就会单点失败 同时它增加了数据库的压力.
另一种方案是服务器索性不保存 session 数据了所有数据都保存在客户端每次请求都发回服务器。JWT 就是这种方案的一个代表。
把用户信息放到客户端服务端的app是不是就是无状态的。微服务都是无状态的。
二、JWT 的原理
JWT 的原理是服务器认证以后生成一个 JSON 对象发回给用户就像下面这样。
{
{姓名: 张三,角色: 管理员,到期时间: 2018年7月1日0点0分
}
以后用户与服务端通信的时候都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据服务器在生成这个对象的时候会加上签名详见后文。
服务器就不保存任何 session 数据了也就是说服务器变成无状态了从而比较容易实现扩展。
三、JWT 的数据结构
实际的 JWT 大概就像下面这样。 它是一个很长的字符串中间用点.分隔成三个部分。注意JWT 内部是没有换行的这里只是为了便于展示将它写成了几行。
JWT 的三个部分依次如下。
1.Header头部 明文
2.Payload负载 明文
3.Sgnature签名
写成一行就是下面的样子。
Header.Payload.Signature 下面依次介绍这三个部分。
3.1 Header
Header 部分是一个 JSON 对象描述 JWT 的元数据通常是下面的样子。
{alg: HS256,typ: JWT
}
上面代码中
alg属性表示签名的算法algorithm默认是 HMAC SHA256写成 HS256
typ属性表示这个令牌token的类型typeJWT 令牌统一写为JWT。
最后将上面的 JSON 对象使用 Base64URL 算法详见后文转成字符串。
3.2 Payload
Payload 部分也是一个 JSON 对象用来存放实际需要传递的数据。JWT 规定了7个官方字段供选用。
iss (issuer)签发人
exp (expiration time)过期时间
sub (subject)主题
aud (audience)受众
nbf (Not Before)生效时间
iat (Issued At)签发时间
jti (JWT ID)编号
除了官方字段你还可以在这个部分定义私有字段下面就是一个例子。
{sub: 1234567890,name: John Doe,admin: true
}
注意JWT 默认是不加密的任何人都可以读到所以不要把秘密信息放在这个部分。
这个 JSON 对象也要使用 Base64URL 算法转成字符串。
3.3 Signature
签名利用“加密算法”对JWT进行签名保证没有被篡改过值得注意的是这里的数据都是明文的算法实际上执行的是最后的数据签名功能只能保证“不被篡改”而不是保证“不被解密”所以后面看到“加密、解密”其实都是为签名服务的。
首先需要指定一个密钥secret。这个密钥只有服务器才知道不能泄露给用户。然后使用 Header 里面指定的签名算法默认是 HMAC SHA256按照下面的公式产生签名。
HMACSHA256(base64UrlEncode(header) . base64UrlEncode(payload), secret)
算出签名以后把 Header、Payload、Signature 三个部分拼成一个字符串每个部分之间用点.分隔就可以返回给用户。
3.4 Base64URL
前面提到Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似但有一些小的不同。
JWT 作为一个令牌token有些场合可能会放到 URL比如 api.example.com/?tokenxxx。Base64 有三个字符、/和在 URL 里面有特殊含义所以要被替换掉被省略、替换成-/替换成_ 。这就是 Base64URL 算法。
四、JWT 的使用方式
客户端收到服务器返回的 JWT可以储存在 Cookie 里面也可以储存在 localStorage。
此后客户端每次与服务器通信都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送但是这样不能跨域所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。
Authorization: Bearer token
另一种做法是跨域的时候JWT 就放在 POST 请求的数据体里面。
五、JWT 的几个特点
1JWT 默认是不加密但也是可以加密的。生成原始 Token 以后可以用密钥再加密一次。
2JWT 不加密的情况下不能将秘密数据写入 JWT。
3JWT 不仅可以用于认证也可以用于交换信息。有效使用 JWT可以降低服务器查询数据库的次数。
4JWT 的最大缺点是由于服务器不保存 session 状态因此无法在使用过程中废止某个 token或者更改 token 的权限。也就是说一旦 JWT 签发了在到期之前就会始终有效除非服务器部署额外的逻辑。
5JWT 本身包含了认证信息一旦泄露任何人都可以获得该令牌的所有权限。为了减少盗用JWT 的有效期应该设置得比较短。对于一些比较重要的权限使用时应该再次对用户进行认证.
6为了减少盗用JWT 不应该使用 HTTP 协议明码传输要使用 HTTPS 协议传输。
网址阿里云登录 - 欢迎登录阿里云安全稳定的云计算服务平台欢迎登录阿里云全球领先的云计算及人工智能科技公司阿里云为200多个国家和地区的企业、开发者和政府机构提供云计算基础服务及解决方案。阿里云云计算、安全、大数据、人工智能、企业应用、物联网等云计算服务。https://thoughts.aliyun.com/workspaces/62abebdcf6ec31001a1d4713/docs/63f2bd2a0f1dae0001117801