官方介绍:https://jwt.io/introduction/
https://auth0.com/learn/json-web-tokens/
什么是JSON WEB TOKEN?
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。此信息可以通过数字签名进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对进行签名。
让我们进一步解释这个定义的一些概念。
- 压缩:由于它的大小,它可以通过URL,POST参数或HTTP头内部发送。此外,由于其尺寸,其传输速度很快。
- 自包含:有效负载包含有关用户的所有必需信息,以避免多次查询数据库。
有关JSON Web令牌的完整详细信息,请查看JWT手册。
什么时候应该使用JSON WEB TOKEN?
这些是JSON Web Tokens非常有用的场景:
- 身份验证:这是使用JWT的典型方案,一旦用户登录,每个后续请求将包括JWT,允许用户访问该令牌允许的路由,服务和资源。Single Sign On是一种现在广泛使用JWT的功能,因为它的开销很小,并且能够在不同域的系统中轻松使用。
- 信息交换:JWT是在各方之间安全传输信息的好方法,因为它们可以签名,例如使用公钥/私钥对,您可以确定发件人是他们所说的人。此外,由于使用标头和有效负载计算签名,您还可以验证内容是否未更改。
哪个是JSON WEB TOKEN结构?
JWT由dot(.
)分隔的三个部分组成,它们是:
- 头
- 有效载荷
- 签名
因此,JWT通常如下所示。
xxxxx.yyyyy.zzzzz
让我们分解不同的部分。
头
标头通常由两部分组成:令牌的类型,即JWT,以及哈希算法,如HMAC SHA256或RSA。
例如:
{
"alg": "HS256",
"typ": "JWT"
}
然后,这个JSON被编码为Base64Url,形成JWT的第一部分。
有效载荷
令牌的第二部分是有效负载,其中包含声明。声明是关于实体(通常是用户)和其他元数据的声明。索赔有三种类型:保留,公开和私人索赔。
- 保留的声明:这些是一组预定义的声明,这些声明不是强制性的,但建议用于提供一组有用的,可互操作的声明。其中一些是:iss(发行人),exp(到期时间),sub(主题), aud(观众)等。
请注意,声明名称只有三个字符,因为JWT意味着紧凑。
- 公开声明:这些可以由使用JWT的人随意定义。但是为避免冲突,应在IANA JSON Web令牌注册表中定义它们,或者将其定义为包含防冲突命名空间的URI。
- 私人声明:这些声明是为了在同意使用它们的各方之间共享信息而创建的。
有效载荷的一个例子可能是:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
然后有效载荷被Base64Url编码以形成JWT的第二部分。
签名
要创建签名部分,您必须采用编码标头,编码的有效负载,秘密,标头中指定的算法,并对其进行签名。
例如,如果要使用HMAC SHA256算法,将以下列方式创建签名。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
签名用于验证JWT的发件人是否是其所说的人,并确保邮件未被更改。
把所有人放在一起
输出是三个由点分隔的Base64字符串,可以在HTML和HTTP环境中轻松传递,与基于XML的标准(如SAML)相比更加紧凑。
下面显示了一个JWT,它具有先前的头和有效负载编码,并使用机密签名。
您可以浏览jwt.io,在那里您可以使用JWT并将这些概念付诸实践。jwt.io允许您解码,验证和生成JWT。
JSON WEB TOKEN如何工作?
在身份验证中,当用户使用其凭据成功登录时,将返回JSON Web令牌并且必须在本地保存(通常在本地存储中,但也可以使用cookie),而不是在传统方法中创建会话。服务器并返回一个cookie。
每当用户想要访问受保护的路由时,它应该使用承载模式发送JWT,通常在Authorization标头中。因此,标题的内容应如下所示。
Authorization: Bearer <token>
这是一种无状态认证机制,因为用户状态永远不会保存在服务器内存中。服务器的受保护路由将在Authorization标头中检查有效的JWT,如果有,则允许用户。由于JWT是自包含的,所有必要的信息都在那里,减少了返回和转发到数据库的需要。
这允许完全依赖无状态的数据API,甚至向下游服务发出请求。由于跨域资源共享(CORS)不使用cookie,因此哪些域正在为您的API提供服务并不重要。
步骤翻译:
- 1、用户登录
- 2、服务的认证,通过后根据secret生成token
- 3、将生成的token返回给浏览器
- 4、用户每次请求携带token
- 5、服务端利用公钥解读jwt签名,判断签名有效后,从Payload中获取用户信息
- 6、处理请求,返回响应结果
因为JWT签发的token中已经包含了用户的身份信息,并且每次请求都会携带,这样服务的就无需保存用户信息,甚至无需去数据库查询,完全符合了Rest的无状态规范。
为什么要使用JSON WEB TOKEN?
让我们来谈谈JSON Web令牌(JWT)将其与简单Web令牌(SWT)和安全断言标记语言令牌(SAML)进行比较的好处。
由于JSON比XML简洁,因此在编码时它的大小也会更小; 使JWT比SAML更紧凑。这使得JWT成为在HTML和HTTP环境中传递的不错选择。
在安全方面,SWT只能使用HMAC算法通过共享密钥进行对称签名。虽然JWT和SAML令牌也可以使用X.509证书形式的公钥/私钥对来签名。但是,与签署JSON的简单性相比,使用XML数字签名对XML进行签名而不会引入模糊的安全漏洞非常困难。
JSON解析器在大多数编程语言中很常见,因为它们直接映射到对象,相反,XML没有自然的文档到对象映射。这使得使用JWT比使用SAML断言更容易。
关于使用,JWT用于互联网规模。这突出了JWT在多个平台(尤其是移动平台)上的客户端处理的简易性。
微信公众号