您现于de位置乃:亚博 > APP学习

亚博 2019-11-29 APP学习 225

快速了解什么乃JSON Web Token(JWT)

JSON Web Token(JWT)4壳白盍餍衐e跨域身份验证解决方案.

3383598-c82676bb8445bae9.webp.jpg


1.跨域身份验证

Internet服务无法与用户身份验证分开.1般过程如下.

1.用户向服务器发送用户名和密码.

2.验证服务器后 相关数据(如用户角色 登录时间等)将保存于当前会话中.

3.服务器向用户返回session_id session信息都会写入到用户deCookie.

4.用户de每个后续请求都将通过于Cookie中取出session_id传给服务器.

5.服务器收到session_id并对比之前保存de数据 确认用户de身份.

u=81505614,2635154874&fm=173&app=25&f=JPEG.jpg

这种模式好的de问题乃 没有分布式架构 无法支持横向扩展.如果使用1个服务器 该模式完全没有问题.但乃 如果它乃服务器群集或面向服务de跨域体系结构de话 则需要1个统1desession数据库库来保存会话数据实现共享 这样负载均衡下de每个服务器才可以正确de验证用户身份.

例如虫虫举1个实际中常见de单点登陆de需求:站点A和站点B提供同1公司de相关服务.现于要求用户只需要登录其中1个网站 然后它就会自动登录到另1个网站.怎么做?

1种解决方案乃听过持久化session数据 写入数据库或文件持久层等.收到请求后 验证服务从持久层请求数据.该解决方案de优点于于架构清晰 而缺点乃架构修改比较费劲 整个服务de验证逻辑层都需要重写 工作量相对较大.而且由于依赖于持久层de数据库或者问题系统 会有单点风险 如果持久层失败 整个认证体系都会挂掉.

u=1542585179,3885887088&fm=173&app=25&f=JPEG.jpg

本文虫虫给大家介绍另外1种灵活de解决方案 通过客户端保存数据 而服务器根本不保存会话数据 每个请求都被发送回服务器. JWT乃这种解决方案de代表.

u=2871748982,2552404266&fm=173&app=25&f=JPEG.jpg

2. JWTde原则

JWTde原则乃于服务器身份验证之后 将生成1个JSON对象并将其发送回用户 如下所示.

{

"UserName": "Chongchong",

"Role": "Admin",

"Expire": "2018-08-08 20:15:56"

}

之后 当用户与服务器通信时 客户于请求中发回JSON对象.服务器仅依赖于这个JSON对象来标识用户.为了防止用户篡改数据 服务器将于生成对象时添加签名(有关详细信息 请参阅下文).

服务器不保存任何会话数据 即服务器变为无状态 使其更容易扩展.

3. JWTde数据结构

典型de 1个JWT看起来如下图.

改对象为1个很长de字符串 字符之间通过"."分隔符分为3个子串.注意JWT对象为1个长字串 各字串之间也没有换行符 此处为了演示需要 我们特意分行并用不同颜色表示了.每1个子串表示了1个功能块 总共有以下3个部分:

JWTde3个部分如下.JWT头 有效载荷和签名 将它们写成1行如下.

u=563276735,1576219691&fm=173&app=25&f=JPEG.jpg

我们将于下面介绍这3个部分.

3.1 JWT头

JWT头部分乃1个描述JWT块数据deJSON对象 通常如下所示.

{

"alg": "HS256",

"typ": "JWT"

}

于上面de代码中 alg属性表示签名使用de算法 默认为HMAC SHA256(写为HS256);typ属性表示令牌de类型 JWT令牌统1写为JWT.

最后 使用Base64 URL算法将上述JSON对象转换为字符串保存.

3.2 有效载荷

有效载荷部分 乃JWTde主体内容部分 也乃1个JSON对象 包含需要传递de数据. JWT指定7个默认字段供选择.

iss:发行人

exp:到期时间

sub:主题

aud:用户

nbf:于此之前不可用

iat:发布时间

jti:JWT ID用于标识该JWT

除以上默认字段外 我们还可以自定义私有字段 如下例:

{

"sub": "1234567890",

"name": "chongchong",

"admin": true

}

请注意 默认情况下JWT乃未加密de 任何人都可以解读其内容 因此不要构建隐私信息字段 存放保密信息 以防止信息泄露.

JSON对象也使用Base64 URL算法转换为字符串保存.

3.3签名哈希

签名哈希部分乃对上面两部分数据签名 通过指定de算法生成哈希 以确保数据不会被篡改.

首先 需要指定1个密码(secret).该密码仅仅为保存于服务器中 并且不能向用户公开.然后 使用标头中指定de签名算法(默认情况下为HMAC SHA256)根据以下公式生成签名.

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),

secret)

于计算出签名哈希后 JWT头 有效载荷和签名哈希de3个部分组合成1个字符串 每个部分用"."分隔 就构成整个JWT对象.

3.4 Base64URL算法

如8 JWT头和有效载荷序列化de算法都用到了Base64URL.该算法和常见Base64算法类似 稍有差别.

作为令牌deJWT可以放于URL中(例如api.example/?token=xxx). Base64中用de3个字符乃"+" "/"和"=" 由于于URL中有特殊含义 因此Base64URL中对他们做了替换:"="去掉 "+"用"-"替换 "/"用"_"替换 这就乃Base64URL算法 很简单把.

4. JWTde用法

客户端接收服务器返回deJWT 将其存储于Cookie或localStorage中.

此后 客户端将于与服务器交互中都会带JWT.如果将它存储于Cookie中 就可以自动发送 但乃不会跨域 因此1般乃将它放入HTTP请求deHeader Authorization字段中.

Authorization: Bearer

当跨域时 也可以将JWT被放置于POST请求de数据主体中.

5. JWT问题和趋势

1 JWT默认不加密 但可以加密.生成原始令牌后 可以使用改令牌再次对其进行加密.

2 当JWT未加密方法乃 1些私密数据无法通过JWT传输.

3 JWT不仅可用于认证 还可用于信息交换.善用JWT有助于减少服务器请求数据库de次数.

4 JWTde好的缺点乃服务器不保存会话状态 所以于使用期间不可能取消令牌或更改令牌de权限.也就乃说 1旦JWT签发 于有效期内将会1直有效.

5 JWT本身包含认证信息 因此1旦信息泄露 任何人都可以获得令牌de所有权限.为了减少盗用 JWTde有效期不宜设置太长.对于某些重要操作 用户于使用时应该每次都进行进行身份验证.

6 为了减少盗用和窃取 JWT不建议使用HTTP协议来传输代码 而乃使用加密deHTTPS协议进行传输.


评论