JSON WEB TOKEN(JWT)

JSON Web Token (JWT) 是一种身份验证机制,由header、payload和signature三部分组成。header包含签名算法,payload存储用户信息。JWT使用base64url编码,可防止传输中的错误。文章讨论了JWT的使用、重放攻击防御(如加干扰码)、JWT续签策略及其带来的问题,以及互斥登录实现,强调了黑名单管理和安全注意事项。
摘要由CSDN通过智能技术生成

JWTtoke的一种形式。主要由header(头部)payload(载荷)signature(签名)这三部分字符串组成,这三部分使用".“进行连接,完整的一条JWT值为${header}.${payload}.${signature},例如下面使用”."进行连接的字符串:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiMTEiLCJpYXQiOjE2MTQzMjU5NzksImV4cCI6MTYxNDMyNTk4MH0.iMjzC_jN3iwSpIyawy3kNRNlL1mBSEiXtOJqhIZmsl8

header

header最开始是一个JSON对象,该JSON包含algtyp这两个属性,对JSON使用base64url(使用base64转码后再对特殊字符进行处理的编码算法,后面会详细介绍)编码后得到的字符串就是header的值。

{
   
  "alg": "HS256",
  "typ": "JWT"
}
  • alg:签名算法类型,生成JWT中的signature部分时需要使用到,默认HS256
  • typ:当前token类型

payload

payloadheader一样,最开始也是一个JSON对象,使用base64url编码后的字符串就是最终的值。

payload中存放着7个官方定义的属性,同时我们可以写入一些额外的信息,例如用户的信息等。

  • iss:签发人
  • sub:主题
  • aud:受众
  • exp:过期时间
  • nbf:生效时间
  • iat:签发时间
  • jti:编号

signature

signature会使用headeralg属性定义的签名算法,对headerpayload合并的字符串进行加密,加密过程伪代码如下:

HMACSHA256(
  `${
     base64UrlEncode(header)}.${
     base64UrlEncode(payload)}`,
  secret
)

加密过后得到的字符串就是signature

base64url

经过base64编码过后的字符串中会存在+、/、=这三个特殊字符,而JWT有可能通过url query进行传输,而url query中不能有+、/url safe base64规定将+/分别用-_进行替换,同时=会在url query中产生歧义,因此需要将=删除,这就是整个编码过程,代码如下

/**
 * node环境
 * @desc 编码过程
 * @param {any} data 需要编码的内容
 * @return {string} 编码后的值
 */
function base64UrlEncode(data) {
   
  const str = JSON.stringify(data);
  const base64Data = Buffer.from(str).toString('base64');
  // + -> -
  // / -> _
  // = -> 
  const base64UrlData = base64Data.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');

  return base64UrlData;
}

当服务解析JWT内容的时候,需要将base64url编码后的内容进行解码操作。首先就是将-_转成+/base64转码后得到的字符串长度能够被4整除,并且base64编码后的内容只有最后才会有=,下面我们看下解码过程:

/**
 * node环境
 * @desc 解码过程
 * @param {any} base64UrlData 需要解码的内容
 * @return {string} 解码后的内容
 */
function base64UrlDecode(base64UrlData) {
   
  // - -> +
  // _ -> /
  // 使用=补充
  const base64LackData = base64UrlData.replace(/\-/g, '+').replace(/\_/g, '/');
  const num = 4 - base64LackData
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值