什么是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的主要内容,如果未能解决你的问题,请参考以下文章