手机版

JSON网络令牌的详细介绍

时间:2021-08-30 来源:互联网 编辑:宝哥软件园 浏览:

JSON网络令牌(JWT)是目前最流行的跨域认证解决方案。本文介绍了它的原理和用途。

第一,跨域认证问题

Internet服务不能与用户身份验证分开。一般流程如下。

1.用户将用户名和密码发送到服务器。

2.验证服务器后,保存当前会话中的相关数据,如用户角色和登录时间。

3.服务器向用户返回一个session_id,并写入用户的Cookie。

4.用户的每个后续请求都会通过Cookie将session_id发送回服务器。

5.服务器接收session_id并找到前一时期保存的数据,从而知道用户的身份。

这个模型的问题是它不可伸缩。单台机器没有问题。如果是服务器集群或跨域面向服务的体系结构,则需要会话数据共享,并且每台服务器都可以读取会话。

比如网站A和网站B是同一家公司的相关服务。现在,用户只需要登录其中一个网站,然后当他们访问另一个网站时,就会自动登录。如何实现这一点?

一种解决方案是会话数据持久性,写入数据库或其他持久层。各种服务收到请求后,都会向持久层请求数据。这种方案的优点是结构清晰,缺点是工程量比较大。此外,如果持久层失败,它将在单点失败。

另一种方案是服务器根本不保存会话数据,所有的数据都保存在客户端,每个请求都发回服务器。JWT是这一计划的代表。

第二,JWT原则

JWT的原理是,在服务器进行身份验证后,生成一个JSON对象并将其发送回用户,如下所示。

在{ '名称' : '张三','角色' : '管理员','到期时间' : ' 2018年7月1日0: 00'}之后,用户在与服务器通信时应该发回这个JSON对象。服务器只依靠这个对象来识别用户。为了防止用户篡改数据,服务器将在生成此对象时添加签名(请参见后面的内容)。

服务器不保存任何会话数据,也就是说,服务器变成无状态,这样更容易扩展。

第三,JWT的数据结构

实际的JWT可能如下所示。

这是一个很长的带点的字符串。)将其分成三部分。请注意,JWT内部没有换行。在这里,为了便于展示,它被写成几行。

JWT的三个部分如下。

标头(标头)有效负载(签名)写成一行,如下所示。

标题。有效载荷.签名

下面依次介绍三个部分。

3.1标题

Header部分是一个描述JWT元数据的JSON对象,通常如下所示。

{'alg' :' hs256 ',' typ' :' jwt'}上述代码中,alg属性表示签名的算法,默认值为HMAC SHA256(写成hs 256);Typ属性指示此令牌的类型,JWT令牌被写成JWT。

最后,上面的JSON对象使用Base64URL算法转换成字符串(见后面)。

3.2有效载荷

有效载荷也是一个JSON对象,用于存储要传输的实际数据。JWT指定了7个官方字段供选择。

Iss(发行人):发行人exp(到期时间):到期时间sub(主题):主题aud(受众):受众nbf(非之前):生效时间iat(发行时间):发行时间jti (JWT ID):编号。除了官方字段,您还可以在此部分定义私有字段。这里有一个例子。

{'sub' :' 1234567890 ',' name' :' John Doe ',' admin' : true}请注意,JWT在默认情况下是不加密的,任何人都可以读取,因此不要将机密信息放在此部分。

这个JSON对象也应该使用Base64URL算法转换成字符串。

3.3签名

签名是前两部分的签名,防止数据被篡改。

首先,你需要指定一个秘密。这个密钥只有服务器知道,不能透露给用户。然后,使用Header中指定的签名算法(默认为HMAC SHA256)根据以下公式生成签名。

HMAC sha 256(Base64 URENCODE(标头)'.'Base64 URLENCODE (Payload,Secret),在计算签名后,将报头、有效载荷和签名三部分拼成一个字符串,并用一个“点”分隔每一部分。),可以返回给用户。

3.4 Base64URL

如前所述,标头和负载序列化的算法是Base64URL。这种算法与Base64算法基本相似,但也有一些细微的区别。

作为一个标记,JWT在某些情况下可能会被放入URL(例如api.example.com/?)标记=xxx)。Base64有三个字符,/和=,这三个字符在URL中有特殊含义,所以应该替换:=省略,替换为-,/替换为_。这是Base64URL算法。

第四,利用JWT

客户端接收服务器返回的JWT,可以存储在Cookie或localStorage中。

之后,每次客户端与服务器通信时,都会带来这个JWT。可以在Cookie中自动发送,但不能跨域,最好放在HTTP请求的头信息Authorization字段。

授权:承载令牌的另一种方式是,当跨域时,将JWT放在POST请求的数据体中。

动词(verb的缩写)JWT的几个特点

(1)默认情况下,JWT不加密,但也可以加密。原始令牌生成后,可以使用密钥再次加密。

(2)当JWT没有加密时,秘密数据不能写入JWT。

(3)JWT不仅可用于认证,还可用于信息交换。有效地使用JWT可以减少服务器查询数据库的次数。

(4)4)JWT最大的缺点是,因为服务器不保存会话状态,所以在使用过程中不可能废除令牌或更改令牌的权限。也就是说,一旦JWT被发布,它将保持有效,直到它到期,除非服务器部署额外的逻辑。

(5)JWT本身就包含认证信息,一旦泄露,任何人都可以获得令牌的所有权利。为了减少盗用,JWT的有效期应该设置得更短。对于一些重要的权限,用户在使用时应该再次进行身份验证。

(6)为了减少盗用,JWT不应该通过HTTP协议明确传输,而应该通过HTTPS协议。

不及物动词参考链接

介绍JSON网络令牌,通过使用JWTs(带有节点快速护照JS)的无身份验证,由Bryan ManueleLearn编写了解如何使用JSON网络令牌,由dwyl编写

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:JSON网络令牌的详细介绍是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。