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是什么的主要内容,如果未能解决你的问题,请参考以下文章
此 Canon SDK C++ 代码片段的等效 C# 代码是啥?