zoukankan      html  css  js  c++  java
  • 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网络令牌样本​、

    微信公众号

                              
  • 相关阅读:
    「赛后总结」Codeforces Round #680 (Div. 2)
    雲雀
    「题解」洛谷 P1494 [国家集训队]小Z的袜子
    NOIP 2020 退役记
    任务查询系统「主席树+差分」
    组合「欧拉路」
    AtCoder 123 Triangle「思维题」
    旅行(加强版)「基环树」
    一个简单的询问「莫队」
    [HNOI2012]永无乡「线段树合并」
  • 原文地址:https://www.cnblogs.com/niugang0920/p/12186610.html
Copyright © 2011-2022 走看看