前端小食堂 | Day18 - 身份认证の八卦阵

devtools/2025/3/28 4:21:45/

🔐 今日秘术:JWT/OAuth2 攻防奥义

1. JWT 安全の六合阵法
// 🚫 危险操作:未验证签名  
const decodeUnsafe = (token) => JSON.parse(atob(token.split('.')[1]));  // ✅ 安全姿势一:严格签名验证  
import jwt from 'jsonwebtoken';  
const payload = jwt.verify(token, secretKey, { algorithms: ['HS256'] });  // ✅ 安全姿势二:强制过期时间检查  
if (payload.exp < Date.now() / 1000) throw new Error('令牌已过期');  // ✅ 安全姿势三:关键声明校验  
if (payload.iss !== 'my-auth-server') throw new Error('非法签发方');  // 🔥 防御算法切换攻击  
// 服务端配置拒绝"none"算法  
jwt.verify(token, secretKey, { algorithms: ['HS256', 'RS256'] });  

🔔 攻击类型识别

  • 令牌泄露:通过XSS/网络嗅探获取JWT
  • 签名绕过:篡改Header中的alg:none
  • 密钥爆破:弱密钥被暴力破解

2. OAuth2 防御の四象结界
// 🚫 危险配置:开放重定向漏洞  
const redirectUri = req.query.redirect_uri; // 未经验证直接使用  // ✅ 安全姿势一:白名单验证  
const validUris = ['https://app.com/callback'];  
if (!validUris.includes(redirectUri)) return 403;  // ✅ 安全姿势二:PKCE 增强  
const codeVerifier = generateRandomString(64);  
const codeChallenge = sha256(codeVerifier);  
// 授权请求携带 challenge  
redirectToAuthServer({  client_id,  code_challenge: codeChallenge,  code_challenge_method: 'S256'  
});  // ✅ 安全姿势三:state参数防CSRF  
const state = crypto.randomBytes(16).toString('hex');  
storeInSession(state);  
redirectToAuthServer({ state });  // 回调时校验state  
if (req.query.state !== getFromSession()) throw new Error('非法请求');  

❄️ 冷知识:现代安全机制

// 🛡️ Refresh Token 自动续期  
let accessToken, refreshToken;  async function refreshTokens() {  try {  const newTokens = await axios.post('/refresh', { refreshToken });  accessToken = newTokens.access;  } catch (err) {  // 刷新失败则要求重新登录  logout();  }  
}  // 🛡️ 浏览器安全存储  
sessionStorage.setItem('token', token); // 标签页隔离  
localStorage.setItem('refreshToken', encrypt(refreshToken)); // 加密存储  // 🛡️ 设备指纹绑定  
const deviceId = generateFingerprint();  
axios.post('/login', { ..., deviceId });  

🌟 实验室安全工坊

实现安全令牌中间件

// JWT 安全校验中间件  
const jwtAuth = (req, res, next) => {  try {  const token = req.headers.authorization?.split(' ')[1];  if (!token) return res.sendStatus(401);  const payload = jwt.verify(token, publicKey, {  algorithms: ['RS256'],  issuer: 'auth-server',  clockTolerance: 30 // 允许30秒时钟偏移  });  // 检查令牌是否被加入黑名单  if (redis.get(`jwt:${payload.jti}`)) return res.sendStatus(401);  req.user = payload;  next();  } catch (err) {  res.status(401).json({ error: '令牌无效' });  }  
};  // 令牌吊销端点  
app.post('/logout', (req, res) => {  const jti = req.user.jti; // JWT唯一标识  redis.set(`jwt:${jti}`, 'revoked', 'EX', 3600); // 吊销1小时  res.sendStatus(204);  
});  

明日秘境:《前端加密の奇门遁甲——HTTPS/数据加密实战》 🧪
(留言告诉我你遇到过的认证漏洞,本安全顾问为你定制防御结界!🔒)


🛎️ 本日避坑指南

  1. JWT 十大危险操作
- 🚨 敏感数据存储于Payload  
- 🚨 使用对称加密且密钥泄露  
- 🚨 未设置合理的exp过期时间  
- 🚨 接受任意签名算法  
- 🚨 未处理令牌吊销场景  
  1. OAuth2 安全红线
- 🚨 使用隐式授权(Implicit Flow)  
- 🚨 允许任意redirect_uri  
- 🚨 未校验response_type参数  
- 🚨 客户端密钥明文存储  
- 🚨 未使用PKCE增强移动端安全  
  1. 安全头配置强化
# OAuth2 端点额外防护  
add_header X-Content-Type-Options "nosniff" always;  
add_header Cache-Control "no-store" always;  
add_header Pragma "no-cache" always;  
  1. 渗透测试工具
# JWT 攻击工具  
https://github.com/ticarpi/jwt_tool  # OAuth2 测试套件  
https://github.com/oauth2-proxy/oauth2-proxy  

🔮 安全工具速递

工具用途
jwt.ioJWT 在线调试工具
OpenSSL密钥对生成与管理
PostmanOAuth2 流程测试
Keycloak开源认证服务器
OWASP ZAP自动化安全扫描

http://www.ppmy.cn/devtools/170966.html

相关文章

《mysql篇》--JDBC编程

JDBC是什么 JDBC就是Java DataBase Connectivity的缩写&#xff0c;翻译过来就很好理解了&#xff0c;就是java连接数据库。所以顾名思义&#xff0c;JDBC就是一种用于执行SQL语句的JavaApl&#xff0c;是Java中的数据库连接规范。为了可以方便的用Java连接各种数据库&#xff…

考研课程安排(自用)

文章目录 408数据结构&#xff08;王道&#xff09;计算机组成原理&#xff08;王道&#xff09;操作系统&#xff08;王道&#xff09;计算机网络&#xff08;湖科大版&#xff09; 数学一高等数学&#xff08;微积分&#xff09;线性代数和概率论 408 数据结构&#xff08;王…

唯品会商品详情页架构设计与实现:高并发场景下的技术实践‌

引言 唯品会作为国内领先的电商平台&#xff0c;其商品详情页需要应对海量用户的高并发访问&#xff0c;同时保证低延迟和高可用性。本文将从架构设计、数据库优化、缓存策略、前端渲染等方面&#xff0c;结合代码示例&#xff0c;深入解析唯品会商品详情页的技术实现。 一、…

数据结构的基本概念

数据结构与算法是计算机科学的核心领域之一&#xff0c;它们在软件开发、系统设计和优化中起着至关重要的作用。以下是对数据结构与算法的全面介绍&#xff0c;包括基本概念、分类、应用场景以及学习建议。 一、数据结构的基本概念 数据结构是指组织和存储数据的方式&#xff…

Powershell WSL导出导入ubuntu22.04.5子系统

导出Linux子系统 导出位置在C盘下,根据自己的实际情况更改即可Write-Host "export ubuntu22.04.5" -ForegroundColor Green wsl --export Ubuntu-22.04 c:\Ubuntu-22.04.tar 导入Linux子系统 好处是目录可用在任意磁盘路径,便于迁移不同的设备之间Write-Host &quo…

GPT-5 将免费向所有用户开放?

GPT-5 将免费向所有用户开放&#xff1f; 硅谷知名分析师 Ben Thompson 最近与 OpenAI CEO Sam Altman 进行了一场深度对谈&#xff0c;其中Sam Altman透漏GPT-5将免费向大家发放。 OpenAI 这波操作可不是一时冲动&#xff0c;而是被逼出来的。DeepSeek 这个新秀横空出世&am…

大数据学习(76)-Impala计算引擎

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

solana增加流动性和删除流动性

在 Solana 区块链上增加和删除流动性通常通过去中心化交易所&#xff08;DEX&#xff09;实现&#xff0c;例如 Raydium 或 Orca。以下是详细的操作流程和注意事项&#xff1a; 一、增加流动性 步骤&#xff1a; 1. 连接钱包 使用支持 Solana 的钱包&#xff08;如 Phantom、…