再次认识 jwt

发现问题

在测试 node-jsonwebtoken 的使用方式

javascript 复制代码
import { sign, verify } from 'jsonwebtoken';

const token = sign({ foo: 'bar' }, 'secret');

console.log(token);

console.log(verify(token, 'secret'));
console.log(verify(token, 'incorret_secret'));

生成的 jwt 是eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJpYXQiOjE3MDYwNjE1MTB9.LQJzaFCIyMGW8CIni59LtGb32BkXVzsQSY2iRfhlnBU

incorret_secret 这里会报:JsonWebTokenError: invalid signature 错误,说签名错误

突发奇想,想拿着生成好的 jwt 验证一下是否可以解析出来,就打开了jwt.io 复制过去之后,发现我的 payload 也就是 { foo: 'bar' } 是可以查看的,如下图:

我最初以为我在加密之后,别人是不能查看的,上面的结果和我的理解不一致,我以为别人是不知道我的 payload 的。

jwt 的 payload 是不加密的

jwt的结构是三段式的,中间用了两个.隔开了,后来我发现其实前两段都是 base64 编码后的值:

HEADER 表明了使用的算法和类型

json 复制代码
{
  "alg": "HS256",
  "typ": "JWT"
}

payload 是想传递的信息包:

json 复制代码
{
  "foo": "bar",
  "iat": 1706061510
}

第三段的 Signature 是真正被加密的:使用算法将上面的信息做加密

scss 复制代码
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

验证和最终结论

通过以上的信息,知道了真正加密的部分只有 Signature 部分。Signature 用于验证消息在发送过程中没有被更改,也可以验证 secret 是否有效。

javascript 复制代码
import { sign, verify } from 'jsonwebtoken';

const token = sign({ foo: 'bar' }, 'secret');

console.log(token);

console.log(
  verify(
    'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXJyIiwiaWF0IjoxNzA2MDY0NjU0fQ==.n4Wwcf1zYfZfcVg9HNzrnxeYi2xGThNxgQUWrD2x6xI',
    'secret',
  ),
);

我这里更改了 payload 的部分,就会报错:JsonWebTokenError: invalid token,更改 header 部分也一样

scss 复制代码
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

根据上面的公式和运行结果来看,无论 headerpayloadsecret 哪一个对不上,都会导致解析失败,jwt 的验证不是对内容的解析,而是保证内容没有更改过。

相关推荐
KKKlucifer7 小时前
数据安全合规自动化:策略落地、审计追溯与风险闭环技术解析
人工智能·安全
wanhengidc7 小时前
云手机 高振畅玩不踩坑
运维·服务器·安全·web安全·智能手机
QQ1__8115175157 小时前
Spring boot名城小区物业管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
钛态7 小时前
前端微前端架构:大项目的救命稻草还是自找麻烦?
前端·vue·react·web
一粒黑子7 小时前
【实战解析】阿里开源 PageAgent:纯前端 GUI Agent,一行JS让网页支持自然语言操控
前端·javascript·开源
独角鲸网络安全实验室7 小时前
2026微信小程序抓包全解析:从实操落地到合规风控,解锁前端调试新范式
前端·微信小程序·小程序·抓包·系统代理绕过·https证书严格校验·进程隔离
紫微AI7 小时前
前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了
前端·人工智能·typescript
GISer_Jing7 小时前
AI前端(From豆包)
前端·aigc·ai编程
IT枫斗者7 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
测试修炼手册7 小时前
[测试技术] 深入理解 JSON Web Token (JWT)
前端·json