什么是JSON Web Token


JSON Web Token(JWT) 是一个开源标准,体积小且自包含的并且可以在两者间进行安全传输JSON对象。这些信息都是经过加密和签名。(常用一些算法HMAC和RSA 或者ECDSA)


什么时候使用JSON Web Tokens?


下面列出一些JSON Web Tokens 常用的一些场景:



  1. Authorization:这是使用JWT大多数最常用的场景,每次用户登陆系统,服务器生成一个JWT,随后每次客户端的请求都将JWT放到Header中,服务器端每次验证这个JWT,如果通过,允许用户访问API以及一些服务和资源,JWT被广泛使用在单点登录,因为整个体积比较小,可以很容易穿过不同域。
     
  2. Information Exchange:JWT是一个比较好的安全的方式在两者间进行消息传输,因为JWTs能被签名,例如,使用public公钥/private私钥对你能知道消息的发送方是谁, 额外, Header和payload也被计算在签名内,你也可以验证内容未被篡改。 


JSON Web Token 组成结构是什么?


JSON Web Tokens 由三部分组成通过.分割,他们是:



  • Header
  • Payload
  • Signature


因此,一个JWT通常看上去像是下面:


xxxxx.yyyyy.zzzzz


让我们分解不同部分.


Header


Header 通常有两部分组成,类型和签名算法,例如 HMAC SHA256或者RSA。

{

  "alg": "HS256",

  "typ": "JWT"

}

Header 经过Base64编码组成了JSON Web Token 第一部分


Payload


token的第二部分是Payload,里面包含claims,claims通常包含一个实体(通常用户) 和 额外数据,


通常有三种类型的claims:registered,public,and private claims。



  1. Registered claims:这些是一组预定义的claims,不是强制性的,但建议使用, 提供一组有用的、可互操作的claims。其中一些是:iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等
  2. Public claims:这些可以由使用JWT的人随意定义,为了避免冲突,它们应该在 IANA JSON Web Token Registry中定义或定义为包含命名空间的URI。
  3. Private claims:这部分claims是为不同方之间共享信息,它既不是register claims 也不是public claims。
     

下面是payload例子

{

  "sub": "1234567890",

  "name": "John Doe",

  "admin": true

}

payload 经过Base64编码组成了JSON Web Token 第二部分


Signature



  1. Base64 编码 header
  2. Base64 编码 payload
  3. secret 秘钥
  4. 签名算法是使用Header中指定的算法。


例如如果你想使用HMAC SHA256算法,签名将通过下面方式被创建:

HMACSHA256(

  base64UrlEncode(header) + "." +

  base64UrlEncode(payload),

  secret)


签名用来验证消息是否被改变在整个传输过程中,在使用私钥签名的令牌的情况下,它还可以验证 JWT 的发送者是谁。


字符串合并


输出是三个由点分隔的 Base64字符串,可以在 HTML 和 HTTP 环境中轻松传递,同时与基于 XML 的标准(如 SAML)相比更加紧凑。


下面显示的JWT是前面Header 和payload 编码,并且使用一个secret 签名之后。

Json Web Token_json

可以使用 jwt.io Debugger 来解码、验证和生成 JWT。

Json Web Token_签名算法_02


JSON Web Tokens 如何工作?


在验证中, 如果用户使用他们的凭证成功登陆,一个JSON Web Token将返回,由于tokens是凭证,因此必须非常小心保护以防止出现安全问题。通常,您不应将令牌保留的时间超过所需的时间。


然而,用户想访问一个受保护的API和资源,用户需要发送这个JWT,通常使用Authorization头,使用Bearer 模式.

Authorization: Bearer <token>


在某些情况下,这是一个无状态机制,服务器只需要验证header中的Authorization是否是一个有效的JWT,如果存在,则允许用户访问资源。


如果令牌在 Authorization 标头中发送,则跨源资源共享 (CORS) 不会成为问题,因为它不使用cookie 需要注意是使用签名tokens,所有的信息包含在token或者暴露给第三方,尽管不能改变它,但是尽量不要把安全的信息放到token中。


为什么使用JSON Web Tokens?


让我们来谈谈与Simple Web Token(SWT) 和Security Assertioin Markup Language Tokens(SAML)相比,JSON Web Token (JWT) 的优势。


1.相比XML,JSON 体积更小。


2.安全性方便要高。


3.JSON 更容易映射到对象,相反,XML 没有自然的文档到对象映射。


欢迎关注本人公众号

Json Web Token_xml_03