Jwt令牌

153 阅读2分钟
定义:

​ JSON Web Token(JWT)是一个开放的行业标准(RFC 7519),它定义了一种简介的、自包含的协议格式,用于 在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥对来签名,防止被篡改。

​ RSA的公钥/私钥对 是成对出现的

官网: jwt.io/

标准:tools.ietf.org/html/rfc751…

JWT令牌的优点:

​ 1、jwt基于json,非常方便解析。

​ 2、可以在令牌中自定义丰富的内容,易扩展。

​ 3、通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。

​ 4、资源服务使用JWT可不依赖认证服务即可完成授权。

缺点:

​ JWT令牌较长,占存储空间比较大。

令牌结构

​ JWT令牌由三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz

Header

​ 头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)

​ 一个例子如下:

​ 下边是Header部分的内容

 {    
     "alg": "HS256",  
     "typ": "JWT" 
 }         

​ 将上边的内容使用 Base64Url编码,得到一个字符串就是JWT令牌的第一部分。

Payload

​ 第二部分是负载,内容也是一个json对象,它是存放有效信息的地方,它可以存放jwt提供的现成字段,比 如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可自定义字段。

​ 此部分不建议存放敏感信息,因为此部分可以解码还原原始内容。

​ 最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。

​ 一个例子:

{
    "sub": "1234567890",
    "name": "456",
    "admin": true
}
Signature

​ 第三部分是签名,此部分用于防止jwt内容被篡改。

​ 这个部分使用base64url将前两部分进行编码,编码后使用点(.)连接组成字符串,最后使用header中

​ 声明 签名算法进行签名。

一个例子:

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

base64UrlEncode(header) :jwt令牌的第一部分。

base64UrlEncode(payload):jwt令牌的第二部分。

secret:签名所使用的密钥。