JWT是什么

Posted CrissChan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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是什么的主要内容,如果未能解决你的问题,请参考以下文章

每个资源服务器的 JWT 多个受众

JWT 令牌 - 受众、发行人和子域

AzureAD JWT 令牌受众声明前缀使 JWT 令牌无效

Jwt 无法有效的发行者或受众

ASP.NET Core JWT 身份验证受众属性

当客户端需要令牌以访问多个受众时如何创建 JWT?