惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
罗磊的独立博客
人人都是产品经理
人人都是产品经理
博客园_首页
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
L
Lohrmann on Cybersecurity
博客园 - 【当耐特】
量子位
Last Week in AI
Last Week in AI
D
Darknet – Hacking Tools, Hacker News & Cyber Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
C
Cyber Attacks, Cyber Crime and Cyber Security
腾讯CDC
有赞技术团队
有赞技术团队
Cyberwarzone
Cyberwarzone
T
Tor Project blog
V
V2EX
L
LINUX DO - 热门话题
Security Latest
Security Latest
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
NISL@THU
NISL@THU
C
Cisco Blogs
T
Tailwind CSS Blog
G
GRAHAM CLULEY
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
小众软件
小众软件
K
Kaspersky official blog
博客园 - 司徒正美
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
Jina AI
Jina AI
S
Schneier on Security
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Exploit Database - CXSecurity.com
Scott Helme
Scott Helme
J
Java Code Geeks
博客园 - 聂微东
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
C
Cybersecurity and Infrastructure Security Agency CISA
F
Fortinet All Blogs
T
Threat Research - Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
雷峰网
雷峰网

博客园 - KLAPT

Gateway 网关 CodeX =>Skills Redis 内存满了怎么处理 SpringBoot 默认配置修改 JWT 续签 Access Token + Refresh Token 双 Token claudeCode 命令 MyBatis 的 Mapper 接口 AI | CC GUI 集成 IDEA 完整教程 在IDEA中使用Claude Code IDEA中使用CodeX MyBatisPlus解决大数据量查询慢问题 idea 中的 claude code Dubbo 和 Spring Cloud Gateway的区别 Transactional 注解中propagation 掌握 Spring 框架这 10 个扩展点 SpringBoot 快速实现 api 加密 Spring Boot/Cloud 中 bootstrap.yml 与 application.yml SpringBoot 实现 DOCX 转 PDF 微服务Token鉴权设计的几种方案 进程、线程、协程 RSA 加密 Java二维码 ntp服务端和客户端 Chronyd与NTP chronyd 作为服务器时钟 chrony sudo命令和su 的区别 java -cp 和 java -jar Maven 项目打包:实现业务代码与第三方依赖分离 达梦数据库创建用户 梦数据库新增大字段报错问题 达梦数据库操作 MySQL UPDATE多表关联更新 达梦数据库 为HTTP POST请求设置请求体 在Java中调用第三方接口并返回第三方页面 Java调用第三方接口的方法 Nginx 之Rewrite 使用详解 linux 命令 Spring Boot项目中集成Spring Security OAuth2和Apache Shiro
Token
KLAPT · 2026-06-08 · via 博客园 - KLAPT

一、JWT 全称 JSON Web Token,说白了就是一段字符串,用点号分成三段:Header、Payload、Signature。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIn0.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

c787fb623b4aeddc74f5c8e8b21d3e42

 JWT的三段结构:Header(算法类型)、Payload(用户信息)、Signature(签名),三部分Base64编码后用点号连接

  • Header :声明算法类型(比如 HS256)
  • Payload :存用户信息(用户 ID、角色、过期时间)。只是 Base64 编码,不是加密 ——任何人拿到 token 都能解码看到内容,密码绝对不能放
  • Signature :用 Header + Payload + 服务端密钥算出来的签名,作用是防篡改

JWT认证完整流程:用户登录→服务端签发Token→客户端存储→请求时带上Token→服务端验签登录成功 → 服务端签发 Token → 客户端保存(一般放 localStorage)→ 每次请求在 Header 里带上 `Authorization: Bearer <token>` → 服务端验签,从 Payload 取用户信息。全程不查数据库、不查 Redis,自给自足。 这就是"无状态"的意思。

二、JWT"无状态"的代价:四个致命场景

   无状态听起来很美,上线后就知道了。

  1. 账号被盗,无法立即踢人 。Token 有效期 2 小时,现在还剩 1 小时 45 分钟。怎么让它立刻失效?纯 JWT 做不到——已签发的 token 在过期前一直有效。
  2. 封禁用户不生效 。账号封了,但手里的 token 还能用。
  3. 改密码不踢其他设备 。用户改了密码,想让其他设备全部失效。纯 JWT 做不到。
  4. token 过期吞表单 。用户填了 20 多分钟的表单,点提交,token 过期了,整个内容全丢。

这四个场景加在一起,几乎是所有正经业务系统都会碰到的问题

三、为什么要把 Token 放 Redis

用户被踢下线时,把 token 加进黑名单。每次请求先查黑名单,在里面就拒。黑名单存哪?内存不行(多台服务器不共享,重启丢),数据库太慢(每个请求都查一次受不了),Redis 最合适 ——查询不到 1ms,分布式共享。

// 退出登录时,把 token 加入黑名单
publicvoidlogout(String token){
    long expiration = jwtUtil.getExpiration(token);
    long ttl = expiration - System.currentTimeMillis();
    if (ttl > 0) {
        redisTemplate.opsForValue().set(
            "blacklist:" + token, "1", ttl, TimeUnit.MILLISECONDS
        );
    }
}

// 验证 token 时,先查黑名单
public boolean isTokenValid(String token){
    if (redisTemplate.hasKey("blacklist:" + token)) {
        returnfalse;
    }
    return jwtUtil.verify(token);
}

Redis 只存"已失效"的 token,平时没什么写入,查询也快。还有更彻底的方案:直接把 token 存 Redis,每次验证都去 Redis 查。 这和传统 Session 没太大区别,只是借了 JWT 格式当 Session ID 用。

四、双 Token 续期方案

Token 到期了,用户正在操作怎么办?

  • AccessToken :有效期短(30 分钟),做实际鉴权
  • RefreshToken :有效期长(7 天),只用来换 AccessToken

AccessToken 过期,前端用 RefreshToken 换新的,对用户无感。RefreshToken 存 Redis,用户改密码就删掉,自动让他下次操作时重新登录。

五、Redis 本身可靠吗

有人担心引入单点故障。Redis 的高可用方案跑了十几年:

  • Sentinel(哨兵模式) :主节点挂了自动选新主
  • Cluster(集群模式) :数据分片,横向扩展