loading

运维

「服务器」前后端分离之JWT用户认证

宝塔服务器面板¥3188大礼包,请点击领取!

对目前的Web网站来说,前后端分离已经变得越来越流行了,越来越多的企业/网站都开始往这个方向靠拢。在前后端分离中,经常会遇到需要根据用户来分配权限和显示相对应信息的问题,虽然传统的COOKIE和SESSION机制可以解决这个问题,但就通用性而言,JWT(JSON Web Token)相对来说更好。那什么是JWT呢?
JWT是什么
Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519)。该标准被设计为紧凑且安全的,一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息。当然该标准也可直接被用于认证,也可被加密。
JWT的几个特点:
1.由于它们的尺寸较小,JWT可以通过URL,POST参数或HTTP头部发送。 另外,尺寸越小意味着传输速度越快。
2.有效载荷包含有关用户的所有必需信息,避免了多次查询数据库的需要。
JWT的使用场景
1、验证
这是使用JWT最常见的情况。 一旦用户登录,每个后续请求将包括JWT。它将允许用户访问该令牌允许的路由,服务和资源。 单点登录是当今广泛使用JWT的一项功能,因为它的开销很小,而且能够轻松地跨不同域使用。
2、信息交换
JWT是在各方之间安全传输信息的好方法, 因为JWT可以被签名(例如使用公钥/私钥对进行签名)。所以你可以确定发件人是他们说的那个人。 此外,由于使用标头(header)和有效载荷(payload)计算签名,因此您还可以验证内容是否未被篡改。
JWT的结构
JWT包含三个由点(.)分隔的部分,它们是:
标头(header)
有效负载(payload)
签名(signature)
因此,JWT通常看起来如下所示:

xxxxx.yyyyy.zzzzz

下面我们将其分解不同的部分,分别来说明:
标头(header)
标头(header)通常由两部分组成:令牌的类型(即JWT)和正在使用的散列算法(如HMAC SHA256或RSA)。
如下所示:
「服务器」前后端分离之JWT用户认证
然后,将这个JSON用Base64编码,形成JWT的第一部分。
有效负载(payload)
令牌的第二部分是包含声明的有效载荷。 声明是关于实体(通常是用户)和附加元数据的声明。 有三种类型的声明:
1.标准中注册的声明,
2.公开声明
3.私人声明
标准中注册的声明:这是一组预先定义的声明,这些声明不是强制性的,但建议提供一套有用的,可互操作的声明。 如下:
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
注意:声明名称只有三个字符长,因为JWT是紧凑的。
公开声明:这些可以由使用JWT的人员随意定义。 但为避免冲突,应在IANA JSON Web令牌注册表中定义它们,或者将其定义为包含防冲突命名空间的URI。
私人声明:这是为了共享使用它们的当事方之间共享信息而创建的声明,既不是登记声明,也不是公开声明。
示例如下:
「服务器」前后端分离之JWT用户认证
然后将有效载荷进行Base64编码,以形成JSON Web令牌的第二部分。
签名(signature)
要创建签名部分,您必须采用标头(header),有效载荷(payload),密钥(secret),以及标头中指定的算法。例如,如果您想使用HMAC SHA256算法,签名将按以下方式创建:
「服务器」前后端分离之JWT用户认证
签名通常用于验证JWT的发件人是谁,并JWT在传送的过程中不被篡改。
注意:secret是保存在服务器端的,JWT的签发生成也是在服务器端的,secret就是用来进行JWT的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
下面显示了一个JWT,它由编码头(header)、编码有效载荷(payload)和签名(signature)通过(.)拼接而成:
「服务器」前后端分离之JWT用户认证
如果需要,你可以使用jwt.io的Debugger工具,来编码、验证和生成JWT。操作界面如下:
「服务器」前后端分离之JWT用户认证
JWT的工作原理
在身份验证中,当用户使用他们的凭证(如用户名、密码)成功登录时,后台服务器将返回一个JWT,前端接收到这个JWT将其保存在本地(通常在本地存储中,也可以使用Cookie,但不是传统方法中创建会话,服务器并返回一个cookie)。下次用户想要访问受保护的路由或资源时,就将本地保存的JWT放在头部发送到后台服务器。服务器接收到请求,检查头部中JWT的存在,如果存在就允许访问受保护的路由或资源,否则就不允许。
如下所示:
「服务器」前后端分离之JWT用户认证
这是一种无状态身份验证机制,因为用户状态永远不会保存在服务器内存中。 由于JWT是独立的,所有必要的信息都在那里,所以减少了多次查询数据库的需求。
「服务器」前后端分离之JWT用户认证
总结
优点
因为json的通用性,所以JWT是可以进行跨语言支持的,像JAVA、JavaScript、NodeJS、PHP等很多语言都可以使用。
因为有了payload部分,所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。
便于传输,JWT的构成非常简单,字节占用很小,所以它是非常便于传输的。
它不需要在服务端保存会话信息, 所以它易于应用的扩展
安全相关
不应该在JWT的payload部分存放敏感信息,因为该部分是客户端可解密的部分。
保护好secret私钥,该私钥非常重要。
如果可以,请使用https协议

(0)

本文由 podipod软库网 作者:Anonymous 发表,转载请注明来源!

全国计算机等级考试题库

热评文章

发表评论