什么是JWT

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是JWT相关的知识,希望对你有一定的参考价值。

JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。就像这样:

jwt的头部承载两部分信息:

声明类型,这里是jwt
声明加密的算法 通常直接使用 HMAC SHA256
完整的头部就像下面这样的JSON:

然后将头部进行base64加密(该加密是可以对称解密的),构成了第一部分.

载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分

标准中注册的声明
公共的声明
私有的声明
标准中注册的声明 (建议但不强制使用) :

公共的声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息,因为该部分在客户端可解密.

私有声明是提供者和消费者所共同定义的声明,一般不建议存放敏感信息,因为base64是对称解密的,意味着该部分信息可以归类为明文信息。

定义一个payload:

然后将其进行base64加密,得到Jwt的第二部分。

jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

将这三部分用.连接成一个完整的字符串,构成了最终的jwt:

一般是在请求头里加入Authorization,并加上Bearer标注:
参考技术A

JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以JSON对象的形式安全地传输信息。此信息可以验证和信任,因为它是数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。

应用场景:

    授权:这是使用JWT最常见的场景

    信息交流:JSON Web令牌是在各方之间安全传输信息的好方法。

    JSON Web令牌由三个部分组成,以点( . )分隔,它们是:

    Header

    Payload

    Signature 签名

    JWT通常如下所示:

    Header.Payload.Signature

Header:

通常由两部分组成:令牌的类型(JWT)和使用的签名算法(如HMAC SHA256或RSA)。

 "alg": "HS256",  "typ": "JWT"

对这个JSON进行Base64Url编码以形成JWT的第一部分

Payload:

有效负载,其中包含声明。声明是关于实体(通常是用户)和附加数据的语句。索赔分为三类:登记的、公开的和私人的债权。

 "sub": "1234567890",  "name": "John Doe",  "admin": true

对有效负载进行Base64Url编码,以形成JSON Web令牌的第二部分。

Signature 签名:

如果要使用HMAC SHA256算法,则将按以下方式创建签名:

HMACSHA256(
 base64UrlEncode(header) + "." +
 base64UrlEncode(payload),
 secret)

参数说明:

HMACSHA256:使用SHA256是因为Header中alg:HS256,如果是alg:HS128,那就是HMACSHA28。

base64UrlEncode:Base64中用的三个字符是"+","/"和"=",由于在URL中有特殊含义,因此Base64URL中对他们做了替换:"="去掉,"+"用"-"替换,"/"用"_"替换,这就是Base64URL算法。

secret:服务器给的 key

Signature :最后将HMACSHA256后的值进行Base64URL后就是需要的签名。



输出是三个Base64-URL字符串,用点分隔,可以轻松地在html和HTTP环境中传递,与基于XML的标准(如SAML)相比更加紧凑。

JWT是什么

JWT是什么

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的

JWT主要解决的实际问题

  • 跨域授权:用户发送用户名和密码登录系统,服务端验证后将会话关键数据进行保存,在后续的交互中,用户都要使用该信息进行身份验证,允许用户访问该令牌允许的路由、服务和资源。单点登录就是当前JWT最典型的落地应用。

  • 信息交换 : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWT可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改

JWT的结构

JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:

header
payload
signature

JWT组成结构就应该如下所示

header.payload.signature

用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。

header


  "alg": "HS256",
  "typ": "JWT"

alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。然后会将上面的 JSON 对象使用 Base64URL 算法转成字符串。

payload


    "iss ": 'crisschan',
    "title": 'pass',
    "admin":true


payload是实体和其他数据的声明,这里包含三种类型:

  • 1 registered:JWT预定义好的一些数据
  • 2 public:registered之外可以随意定义
  • 3 private:在数据使用方之间达成共识,并且不是注册或者公开的数据。

如下是registered的关键字:

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud(audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWTID):编号

对payload进行Base64编码就得到JWT的第二部分,也就是payload部分

signature

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

为了得到签名部分,你必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可。

Base64URL

Header 和 Payload 串型化的算法是 Base64URL。这个算法跟 Base64 算法基本类似,但有一些小的不同。

JWT 作为一个令牌(token),有些场合可能会放到 URL(比如 api.example.com/?token=xxx)。Base64 有三个字符+、/和=,在 URL 里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_ 。这就是 Base64URL 算法。

例子

在认证的时候,当用户用他们的凭证成功登录以后,一个JWT将会被返回,这个凭证储存在 Cookie 里面,也可以储存在 localStorage。此后,token就是用户凭证了,你必须非常小心以防止出现安全问题。一般而言,你保存令牌的时候不应该超过你所需要它的时间。

无论何时用户想要访问受保护的路由或者资源的时候,用户代理(通常是浏览器)都应该带上JWT,典型的,通常放在Authorization header中,用Bearer schema。

header应该看起来是这样的:

Authorization: Bearer

服务器上的受保护的路由将会检查Authorization header中的JWT是否有效,如果有效,则用户可以访问受保护的资源。如果JWT包含足够多的必需的数据,那么就可以减少对某些操作的数据库查询的需要,尽管可能并不总是如此。

如果token是在授权头(Authorization header)中发送的,那么跨源资源共享(CORS)将不会成为问题,因为它不使用cookie。

以上是关于什么是JWT的主要内容,如果未能解决你的问题,请参考以下文章

JWTJWT 整合

jwt

JWT

快速入门

jwt的思考

JWT简单讲解