官方介绍:https://jwt.io/introduction/
https://auth0.com/learn/json-web-tokens/
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。此信息可以通过数字签名进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSA的公钥/私钥对进行签名。
让我们进一步解释这个定义的一些概念。
有关JSON Web令牌的完整详细信息,请查看JWT手册。
这些是JSON Web Tokens非常有用的场景:
JWT由dot(.
)分隔的三个部分组成,它们是:
因此,JWT通常如下所示。
xxxxx.yyyyy.zzzzz
让我们分解不同的部分。
标头通常由两部分组成:令牌的类型,即JWT,以及哈希算法,如HMAC SHA256或RSA。
例如:
{
"alg": "HS256",
"typ": "JWT"
}
然后,这个JSON被编码为Base64Url,形成JWT的第一部分。
令牌的第二部分是有效负载,其中包含声明。声明是关于实体(通常是用户)和其他元数据的声明。索赔有三种类型:保留,公开和私人索赔。
请注意,声明名称只有三个字符,因为JWT意味着紧凑。
有效载荷的一个例子可能是:
{
"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令牌并且必须在本地保存(通常在本地存储中,但也可以使用cookie),而不是在传统方法中创建会话。服务器并返回一个cookie。
每当用户想要访问受保护的路由时,它应该使用承载模式发送JWT,通常在Authorization标头中。因此,标题的内容应如下所示。
Authorization: Bearer
这是一种无状态认证机制,因为用户状态永远不会保存在服务器内存中。服务器的受保护路由将在Authorization标头中检查有效的JWT,如果有,则允许用户。由于JWT是自包含的,所有必要的信息都在那里,减少了返回和转发到数据库的需要。
这允许完全依赖无状态的数据API,甚至向下游服务发出请求。由于跨域资源共享(CORS)不使用cookie,因此哪些域正在为您的API提供服务并不重要。
步骤翻译:
因为JWT签发的token中已经包含了用户的身份信息,并且每次请求都会携带,这样服务的就无需保存用户信息,甚至无需去数据库查询,完全符合了Rest的无状态规范。
让我们来谈谈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在多个平台(尤其是移动平台)上的客户端处理的简易性。
、
微信公众号
JAVA程序猿成长之路
分享资源,记录程序猿成长点滴。专注于Java,Spring,SpringBoot,SpringCloud,分布式,微服务。