现代Web安全实践:基于Token与Refresh Token的单点登录(SSO)实现
在数字化转型加速的今天,单点登录(SSO)已成为企业身份管理的核心基础设施。袋鼠云UED团队在过去几年中,为金融、政务、医疗等领域的大型系统构建SSO解决方案。本文将分享基于Token的标准SSO实现,同时解密UED团队对于单点登录的安全实践方式。
单点登录核心原理
1、SSO的基本工作流程

2、双Token机制的优势
* **Access Token:短期有效(通常1-2小时),减少泄露风险**
* **Refresh Token:长期有效(通常7-30天),存储于HttpOnly Cookie中**
* 安全平衡:即使Access Token泄露,攻击者也难以获取新的有效Token
Node.js + JWT实现示例
1、认证服务核心代码
const jwt = require('jsonwebtoken');const crypto = require('crypto');
// 生成密钥对(实际项目应该预生成并妥善保存)const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', { modulusLength: 2048,});
// 生成Tokenfunction generateTokens(user) { const accessToken = jwt.sign( { userId: user.id, role: user.role }, privateKey, { algorithm: 'RS256', expiresIn: '1h' } );
const refreshToken = jwt.sign( { userId: user.id, tokenVersion: user.tokenVersion }, privateKey, { algorithm: 'RS256', expiresIn: '7d' } );
return { accessToken, refreshToken };}
// 验证中间件function authenticate(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1];
if (!token) return res.sendStatus(401);
jwt.verify(token, publicKey, (err, user) => { if (err) return res.sendStatus(403); req.user = user; next(); });}
2、Token刷新接口设计
app.post('/refresh-token', (req, res) => { const refreshToken = req.cookies.refreshToken;
if (!refreshToken) return res.sendStatus(401);
jwt.verify(refreshToken, publicKey, async (err, payload) => { if (err) return res.sendStatus(403);
// 检查数据库中的token版本(防止被盗用) const user = await User.findById(payload.userId); if (user.tokenVersion !== payload.tokenVersion) { return res.sendStatus(403); }
// 颁发新Token const newTokens = generateTokens(user);
// 设置HttpOnly Cookie res.cookie('refreshToken', newTokens.refreshToken, { httpOnly: true, secure: true, sameSite: 'strict', maxAge: 7 * 24 * 60 * 60 * 1000 });
res.json({ accessToken: newTokens.accessToken }); });});
前端实现关键点
1、Axios拦截器配置
const api = axios.create({ baseURL: process.env.API_URL,});
// 请求拦截器api.interceptors.request.use(config => { const token = localStorage.getItem('accessToken'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config;});
// 响应拦截器api.interceptors.response.use( response => response, async error => { const originalRequest = error.config;
// 401错误且不是刷新请求 if (error.response.status === 401 && !originalRequest._retry) { originalRequest._retry = true;
try { const { data } = await axios.post('/refresh-token', {}, { withCredentials: true // 携带cookie });
localStorage.setItem('accessToken', data.accessToken); originalRequest.headers.Authorization = `Bearer ${data.accessToken}`; return api(originalRequest); } catch (refreshError) { // 刷新失败跳转登录 window.location = '/login'; return Promise.reject(refreshError); } }
return Promise.reject(error); });

2、安全存储方案对比

安全增强措施
1、Token撤销策略

2、多因素认证集成
app.post('/login', async (req, res) => { const { email, password } = req.body;
const user = await User.findOne({ email }); if (!user || !await bcrypt.compare(password, user.password)) { return res.status(401).send('认证失败'); }
// 检查是否开启MFA if (user.mfaEnabled) { const tempToken = jwt.sign( { userId: user.id, mfa: true }, privateKey, { expiresIn: '5m' } ); return res.json({ mfaRequired: true, tempToken }); }
// 常规登录流程 const tokens = generateTokens(user); sendTokens(res, tokens);});
app.post('/verify-mfa', authenticateTempToken, (req, res) => { const { code } = req.body;
if (verifyMfaCode(req.user.userId, code)) { const user = await User.findById(req.user.userId); const tokens = generateTokens(user); sendTokens(res, tokens); } else { res.status(401).send('MFA验证失败'); }});
最佳实践建议
`1、传输安全`
* 始终使用HTTPS
* 设置`Secure`和`SameSite`Cookie属性
2、防御措施
* 实现CSRF Token机制
* 设置速率限制(如1分钟5次刷新)
3、监控审计

4、失效处理
* 登出时清除客户端Token
* 服务端维护短期黑名单(JWT本身无状态)
Token与Refresh Token机制为现代SSO提供了优雅的解决方案。作为袋鼠云技术团队,我们在多个项目中验证了这一架构的可靠性,Token+RefreshToken方案在安全性和用户体验之间取得了良好平衡。实际部署时还需要考虑:
* 分布式环境下的密钥管理
* 多平台Token同步
* 会话超时策略
建议结合OAuth 2.0或OpenID Connect等标准协议实现生产级SSO系统。
现代Web安全实践:基于Token与Refresh Token的单点登录(SSO)实现的更多相关文章
- 关于token和refresh token
最近在做公司的认证系统,总结了如下一番心得. 传统的认证方式一般采用cookie/session来实现,这是我们的出发点. 1.为什么选用token而不选用cookie/session? 本质上tok ...
- Access Token 与 Refresh Token【转载哒科普啊】
Access Token 与 Refresh Token access token 是客户端访问资源服务器的令牌.拥有这个令牌代表着得到用户的授权.然而,这个授权应该是临时的,有一定有效期.这是因 ...
- token和refresh token
https://www.cnblogs.com/minirice/p/9232355.html 在spring boot中结合OAuth2使用JWT时,刷新token时refresh token一直变 ...
- IdentityServer4之SSO(基于OAuth2.0、OIDC)单点登录、登出
IdentityServer4之SSO(基于OAuth2.0.OIDC)单点登录.登出 准备 五个Web站点: 1.localhost:5000 : 认证服务器.2 ...
- Asp.Net Core基于Cookie实现同域单点登录(SSO)
在同一个域名下有很多子系统 如:a.giant.com b.giant.com c.giant.com等 但是这些系统都是giant.com这个子域. 这样的情况就可以在不引用其它框架的情况下, ...
- 基于云端的通用权限管理系统,SAAS服务,基于SAAS的权限管理,基于SAAS的单点登录SSO,企业单点登录,企业系统监控,企业授权认证中心
基于云端的通用权限管理系统 SAAS服务 基于SAAS的权限管理 基于SAAS的单点登录SSO 基于.Net的SSO,单点登录系统,提供SAAS服务 基于Extjs 4.2 的企业信息管理系统 基于E ...
- 常用的两种web单点登录SSO的实现原理
单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得 ...
- ASP.NET Core Authentication系列(四)基于Cookie实现多应用间单点登录(SSO)
前言 本系列前三篇文章分别从ASP.NET Core认证的三个重要概念,到如何实现最简单的登录.注销和认证,再到如何配置Cookie 选项,来介绍如何使用ASP.NET Core认证.感兴趣的可以了解 ...
- JWT(JSON Web Token) 多网站的单点登录,放弃session
多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...
- JWT(JSON Web Token) 多网站的单点登录,放弃session 转载https://www.cnblogs.com/lexiaofei/p/7409846.html
多个网站之间的登录信息共享, 一种解决方案是基于cookie - session的登录认证方式,这种方式跨域比较复杂. 另一种替代方案是采用基于算法的认证方式, JWT(json web token) ...
随机推荐
- SSH远程神器—Termius
简介 Termius是一款非常好用而且漂亮的SSH客户端,能快速远程控制服务器,可以定制自己喜欢的主题.Termius不仅涵盖了PC端的Windows.Linux.Mac,还支持手机端的Android ...
- React Props指南:从基础到高阶应用的最佳实践解析
在 React 中,Props(属性)是组件间通信和数据传递的核心机制.通过合理使用 Props,开发者可以构建动态.可复用且易于维护的组件体系.本文将深入探讨 Props 的核心概念.使用方法及最佳 ...
- This APT has Super Cow Powers.
在Debian/Ubuntu上,apt包管理器内嵌着一个彩蛋. 如果你在命令行界面输入 apt help 在最后一行能找到This APT has Super Cow Powers. 说明该apt具有 ...
- 再说【把postgreSQL的表导入SQLite 】
为这个问题,百度了一大圈.确实答案就在手边. 这个短语认识一下:[Extract-Transfrom-Load]其意义: ETL,是英文 Extract-Transform-Load 的缩写, ...
- Eclipse java项目转Maven项目
1.右键项目->configure->选择maven->配置maven的pom.xml 2.在src/main下新建java文件,将原来src下的java文件夹拷贝至该目录下: 3. ...
- 做Docx预览,一定要做这个神库!!
Hey, 我是 沉浸式趣谈 本文首发于[沉浸式趣谈],我的个人博客 https://yaolifeng.com 也同步更新. 转载请在文章开头注明出处和版权信息. 如果本文对您有所帮助,请 点赞.评论 ...
- MySQL 中 INNER JOIN、LEFT JOIN 和 RIGHT JOIN 的区别是什么?
在MySQL中,INNER JOIN.LEFT JOIN和RIGHT JOIN是用于连接两个或多个表的操作符,它们的主要区别在于如何处理匹配的记录和不匹配的记录. INNER JOIN: 只返回两个表 ...
- SpringBoot——使用http2
使用http2 许多浏览器,包括Edge,仅在TLS(即HTTPS)情况下支持HTTP/2.即使服务器端配置为无TLS支持的HTTP/2,浏览器可能仍将回退到HTTP/1.1.所以我们需要有一个证书来 ...
- 【记录】SMB|Windows下修改SMB端口并挂载
环境:Window11 使用背景:勒索病毒导致445端口不安全,故而该端口在服务器端被全面禁用了,如需使用SMB服务需要换个SMB服务端口. 方法1:端口转发 win+x点开管理员权限的终端: 输入如 ...
- 信息资源管理综合题之“什么是CA 和 什么是数字证书 和 CA实施认证服务的技术基础是什么 和 补全CA签名加密流程图”
一.公钥密码体系和RSA算法是密钥管理.身份认证.防抵赖篡改等安全问题的理论基础和技术保障.题图是运用RSA算法用户A向用户B传送加密信息并进行数学签名的过程.其中A.B的公钥分别为GA.GB,A.B ...