官方文档
一、什么是JWT
JWT(全称JSON Web Token)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于作为JSON对象在各方之间安全地传输信息。此信息是经过数字签名的,因此可以验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。
虽然JWT可以加密,也可以在各方之间提供保密性,但我们将专注于签名代币。签名令牌可以验证其中包含的声明的完整性,而加密令牌则向其他方隐藏这些声明。当使用公钥/私钥对对令牌进行签名时,签名还证明只有持有私钥的一方才是签名方。
二、JWT的应用场景
1、授权认证:这是使用JWT最常见的场景。一旦用户登录,每个后续请求都将包括JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是目前广泛使用JWT的一个功能,因为它的开销很小,并且能够在不同的域中轻松使用。
2、信息交换:JSON Web令牌是在各方之间安全传输信息的好方法。因为JWT可以签名——例如,使用公钥/私钥对——所以你可以确保发送者就是他们所说的那个人。此外,由于签名是使用标头和有效载荷计算的,因此还可以验证内容是否未被篡改。
三、 JWT的构成
JSON Web由header、payload、Signature组成,由点(.)分隔。
1、Header
Header通常由两部分组成:令牌的类型(JWT)和所使用的签名算法(如HMAC SHA256或RSA)。
格式如下:
"Header":
{
"alg": "HS256",
"typ": "JWT"
}
2、Payload
Payload 包含的事声明的内容。声明是关于实体(通常是用户)和附加数据的声明。索赔有三种类型:注册声明、共有声明和私有声明。
"Payload":
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
3、Signature
Signature由header、payload、secret加签后得到。
例如,如果要使用HMAC SHA256算法,则将以以下方式创建签名:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
4、加的验证
官方提供了一个调试地址,jwt.ioDebugger
四、JWT的工作原理
在身份验证中,当用户使用其凭据成功登录时,将返回一个JWT Token由于Token是凭据,因此必须非常小心地防止出现安全问题。一般来说,不应将令牌保存的时间超过所需的时间。
由于缺乏安全性,您也不应将敏感会话数据存储在浏览器存储(Local Storage)中。
每当用户想要访问受保护的路由或资源时,用户代理都应该发送JWT,通常在Authorization头中使用Bearer模式。header的内容应如下所示:
Authorization: Bearer <token>
在某些情况下,这可能是一种无状态授权机制。服务器的受保护路由将在Authorization标头中检查有效的JWT,如果存在,则允许用户访问受保护的资源。如果JWT包含必要的数据,则可以减少查询数据库以进行某些操作的需要,尽管情况并非总是如此。
请注意,如果您通过HTTP头发送JWT令牌,则应尽量防止它们变大。有些服务器不接受超过8 KB的标头。如果您试图在JWT令牌中嵌入太多信息,例如通过包括所有用户的权限,您可能需要一个替代解决方案,如 Auth0 Fine-Grained Authorization。
如果Token是在 Header的Authorization中发送的,则跨域资源共享(CORS)不会成为问题,因为它不使用cookie。
下图显示了如何获取JWT并将其用于访问API或资源:
请注意,对于已签名的Token,其包含的所有信息都会暴露给用户或其他方,即使他们无法更改这些信息。这意味着您不应将机密信息放入Token中。
五、为什么要使用JWT
让我们来谈谈JSON Web Token(JWT)与Simple Web Token(SWT)和Security Assertion Markup Language Tokens (SAML)相比的优势。
由于JSON没有XML那么冗长,所以当对其进行编码时,其大小也更小,这使得JWT比SAML更紧凑。这使得JWT成为在HTML和HTTP环境中传递的一个很好的选择。
在安全性方面,SWT只能使用HMAC算法通过共享密钥进行对称签名。但是,JWT和SAML Token可以使用X.509证书形式的公钥/私钥对进行签名。与签名JSON的简单性相比,在不引入模糊安全漏洞的情况下使用XML数字签名对XML进行签名是非常困难的。
JSON解析器在大多数编程语言中很常见,因为它们直接映射到对象。相反,XML没有自然的文档到对象映射。这使得使用JWT比使用SAML断言更容易。
关于使用情况,JWT是在互联网范围内使用的。这突出了在多个平台(尤其是移动平台)上客户端处理JSONWeb Token的方便性。
六、JWT的场景问题
JWT的问题主要表现在其数据一致性上,如用户基于某些因素失效了,但是Token依旧有效。
具体的优化,可以参考这篇文章.