JSON Web Tokens介绍

官方介绍: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在多个平台(尤其是移动平台)上的客户端处理的简易性。
Json网络令牌样本​、

                                                                               微信公众号

                                               

                                                                             JAVA程序猿成长之路

                          分享资源,记录程序猿成长点滴。专注于Java,Spring,SpringBoot,SpringCloud,分布式,微服务。 

猜你喜欢

转载自www.cnblogs.com/niugang0920/p/12186610.html