什么是JSON Web Token
JSON Web Token(JWT) 是一个开源标准,体积小且自包含的并且可以在两者间进行安全传输JSON对象。这些信息都是经过加密和签名。(常用一些算法HMAC和RSA 或者ECDSA)
什么时候使用JSON Web Tokens?
下面列出一些JSON Web Tokens 常用的一些场景:
- Authorization:这是使用JWT大多数最常用的场景,每次用户登陆系统,服务器生成一个JWT,随后每次客户端的请求都将JWT放到Header中,服务器端每次验证这个JWT,如果通过,允许用户访问API以及一些服务和资源,JWT被广泛使用在单点登录,因为整个体积比较小,可以很容易穿过不同域。
- 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。
- Registered claims:这些是一组预定义的claims,不是强制性的,但建议使用, 提供一组有用的、可互操作的claims。其中一些是:iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等
- Public claims:这些可以由使用JWT的人随意定义,为了避免冲突,它们应该在 IANA JSON Web Token Registry中定义或定义为包含命名空间的URI。
- Private claims:这部分claims是为不同方之间共享信息,它既不是register claims 也不是public claims。
下面是payload例子
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
payload 经过Base64编码组成了JSON Web Token 第二部分
Signature
- Base64 编码 header
- Base64 编码 payload
- secret 秘钥
- 签名算法是使用Header中指定的算法。
例如如果你想使用HMAC SHA256算法,签名将通过下面方式被创建:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
签名用来验证消息是否被改变在整个传输过程中,在使用私钥签名的令牌的情况下,它还可以验证 JWT 的发送者是谁。
字符串合并
输出是三个由点分隔的 Base64字符串,可以在 HTML 和 HTTP 环境中轻松传递,同时与基于 XML 的标准(如 SAML)相比更加紧凑。
下面显示的JWT是前面Header 和payload 编码,并且使用一个secret 签名之后。
可以使用 jwt.io Debugger 来解码、验证和生成 JWT。
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 没有自然的文档到对象映射。