JWT JSON 分布式站点

什么是JWT

2018-11-07
14次浏览

1、简介:

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

2、使用场景:

(1) 权限认证:这是JWT使用最常见的地方,用户一旦登录,就会获得一个JWT,这个JWT使得用户有权限访问

后续的路径或者服务。由于其容量小和易于跨域的特点,因此JWT广泛应用在分布式单点登录中。

(2) 信息交换:JWT是不同服务之间信息交换和好的一种方式。因为它可以使用键值对来标记,所以接收方

可以确定发送方的身份。此外,JWT的signature的通过head和payload计算出来的,所以可以保证传递的信息

内容不会被篡改。

3、JWT的结构

JWT有三部分组成,这三部分含义分别是header,payload, signature

Header

头部包含了两个方面:类型和使用的哈希算法(如HMAC SHA256):

对这个JSON字符进行base64encode编码,我们就有了首个JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload

JWT的第二部分是payload,也称为 JWT Claims,这里放置的是我们需要传输的信息,有多个项目如

注册的claim名称,公共claim名称和私有claim名称。

注册claim名称有下面几个部分:

iss: token的发行者sub: token的题目aud: token的客户exp: 经常使用的,以数字时间定义失效期,也就是当前时间以后的某个时间本token失效。nbf: 定义在此时间之前,JWT不会接受处理。iat: JWT发布时间,能用于决定JWT年龄jti: JWT唯一标识. 能用于防止 JWT重复使用,一次只用一个token

公共claim名称用于定义我们自己创造的信息,比如用户信息和其他重要信息。

私有claim名称用于发布者和消费者都同意以私有的方式使用claim名称。

下面是JWT的一个案例:

{ "iss": "scotch.io", "exp": 1300819380, "name": "Chris Sevilleja", "admin": true }

签名

JWT第三部分最后是签名,签名由以下组件组成:

headerpayload密钥

下面是我们如何得到JWT的第三部分:

这里的secret是被服务器签名,我们服务器能够验证存在的token并签名新的token。

4、JWT是如何工作的

当用户登录成功之后,服务端会生成一个JWT并且返回给浏览器(放在响应头中),这种方法代替了传统的

在服务端创建一个session然后返回浏览器cookie的方法。


我要点评