jwt json,解析jwt token
00-1010一、跨域认证的问题二。JWT协议III的原则。JWT的数据结构3.1报头3.2有效载荷3.3签名3.4 Base64 URL IV。JWT五世的用法。JWT六世的几个特点。参考链接
00-1010互联网服务离不开用户认证。大致流程如下。
1.用户将用户名和密码发送给服务器。
2.服务器通过验证后,保存当前会话中的相关数据,如用户角色、登录时间等。
3.服务器向用户返回一个session_id,并写入用户的Cookie。
4.用户的每个后续请求都会通过Cookie将session_id发送回服务器。
5.服务器接收session_id,找到之前保存的数据,从而知道用户的身份。
这种模式的问题是不可扩展。当然单机是没有问题的。如果是服务器集群或者跨域面向服务的架构,就需要会话数据共享,每台服务器都可以读取会话。
例如,网站A和网站B是同一家公司的附属服务。现在,用户只需要登录其中一个网站,然后当他们访问另一个网站时,就会自动登录。如何实现这一点?
一种解决方案是持久化会话数据,并将其写入数据库或其他持久层。收到请求后,各种服务都会向持久层请求数据。这种方案的优点是结构清晰,缺点是工程量比较大。此外,如果持久层失败,它将在单点失败。
另一种解决方案是服务器不保存会话数据,所有数据都保存在客户端,每个请求都发送回服务器。JWT是这一计划的代表。
00-1010JWT的原理是服务器认证后,生成一个JSON对象并发送给用户,如下图。
{Name : 张三, Role 3360 Administrator , Expiration time 3360 2018 . 7 . 1 . 0 }之后用户在与服务器通信时必须发回这个JSON对象。服务器只依靠这个对象来识别用户。为了防止用户篡改数据,服务器在生成这个对象时会添加一个签名(见后面)。
服务器不保存任何会话数据,也就是说,服务器变成了无状态,这样更容易实现扩展。
00-1010实际的JWT大概如下。
这是一个很长的字符串,由一个点(.)中间。请注意,JWT内部没有换行,这里写为几行只是为了方便演示。
JWT的三个部分如下。
标题(标题)
有效载荷(有效载荷)
签名(签名)
写成一行,看起来如下。
下面依次介绍三个部分。
目录
报头部分是一个JSON对象,它描述了JWT的元数据。它通常看起来像下面这样。
{alg 3360 HS 256 , TYP 3360 JWT}以上代码中,alg属性表示签名的算法,默认为HMAC SHA256(写成HS 256);Typ属性表示这个令牌的类型,JWT令牌统称为JWT。
最后,使用Base64URL算法将上面的JSON对象转换成一个字符串(详见下文)。
一、跨域认证的问题
有效负载部分也是一个JSON对象,用于存储要传输的实际数据。JWT指定了7个官方领域供选择。
Iss(发行人):发行人
Exp(到期时间):到期时间
Sub (subject):主语
Aud(观众):观众
Nbf(非之前):生效时间
Iat(发布时间):发布时间
Jti (JWT身份证):没有
除了官方字段,您还可以在此部分定义私有字段。这里有一个例子。
{sub 3360 1234567890 , name 3360 John Doe , admin 3360 true}注意,JWT默认情况下是不加密的,任何人都可以。
读到,所以不要把秘密信息放在这个部分。
这个 JSON 对象也要使用 Base64URL 算法转成字符串。
3.3 Signature3>Signature 部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(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/?token=xxx)。Base64 有三个字符+
、/
和=
,在 URL 里面有特殊含义,所以要被替换掉:=
被省略、+
替换成-
,/
替换成_
。这就是 Base64URL 算法。
四、JWT 的使用方式
客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。
此后,客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization
字段里面。
Authorization: Bearer <token>
另一种做法是,跨域的时候,JWT 就放在 POST 请求的数据体里面。
五、JWT 的几个特点
(1)JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
(2)JWT 不加密的情况下,不能将秘密数据写入 JWT。
(3)JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
(4)JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
(5)JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。
(6)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。
六、参考链接
Introduction to JSON Web Tokens, by Auth0Sessionless Authentication using JWTs (with Node + Express + Passport JS), by Bryan ManueleLearn how to use JSON Web Tokens, by dwyl以上就是JSON Web Token(JWT)原理入门教程详解的详细内容,更多关于JSON Web Token(JWT) 教程的资料请关注盛行IT其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。