共计 2477 个字符,预计需要花费 7 分钟才能阅读完成。
为什么需要关注 Token 传递方式?
在 API 开发中,Token 是身份验证的核心凭证。错误的传递方式可能导致:

- Token 泄露:通过 URL 或日志暴露敏感信息
- CSRF 攻击:Cookie 方式未配合 SameSite 属性时易受攻击
- 缓存污染:URL 参数可能被 CDN 或浏览器缓存
某电商平台曾因将 Token 放在 URL 参数中,导致用户会话被恶意劫持。这提醒我们:传递方式直接影响系统安全性。
APIPost 传 Token 的 5 种实战方式
1. Authorization Header (Bearer Token)
适用场景:RESTful API 标准做法,适合前后端分离架构
APIPost 操作:
1. 在请求 Headers 选项卡点击『+』
2. Key 输入Authorization,Value 输入Bearer your_token_here
GET /api/user HTTP/1.1
Host: example.com
Authorization: Bearer eyJhbGciOiJIUzI1Ni...
2. URL Query Parameters
适用场景:临时调试或第三方回调(需配合 HTTPS)
APIPost 配置:
1. 在 Params 选项卡添加参数
2. Key 设为access_token,Value 填入 Token
GET /api/data?access_token=abc123 HTTP/1.1
Host: example.com
警告:生产环境慎用,参数会出现在浏览器历史、服务器日志中
3. HTTP Cookies
适用场景:传统 Web 应用,需配合 SameSite 和 HttpOnly 属性
APIPost 设置:
1. 在 Cookies 管理界面添加条目
2. 勾选 HttpOnly 和 Secure 选项(模拟生产配置)
GET /api/profile HTTP/1.1
Host: example.com
Cookie: session_id=xyz789; Path=/; HttpOnly; SameSite=Strict
4. Request Body
适用场景:POST/PUT 请求,避免 URL 长度限制
APIPost 操作:
1. 选择 Body -> raw -> JSON
2. 添加 "token": "your_value" 字段
{
"query": "products",
"token": "mno456"
}
5. 自定义 Header
适用场景:企业内网 API 或特殊安全要求
GET /api/device HTTP/1.1
X-API-Key: custom_key_987
后端解析代码示例
Python Flask 示例
from flask import request, jsonify
@app.route('/api/protected')
def protected():
# 方式 1:解析 Authorization Header
auth_header = request.headers.get('Authorization')
if auth_header and auth_header.startswith('Bearer'):
token = auth_header[7:]
# 方式 2:获取 URL 参数
token = request.args.get('access_token')
# 方式 3:读取 Cookie
token = request.cookies.get('session_id')
if not token:
return jsonify(error="Missing token"), 401
# 验证逻辑...
return jsonify(data="Access granted")
Node.js Express 示例
app.get('/api/secure', (req, res) => {
// 方式 4:解析 Body 中的 Token
const bodyToken = req.body?.token;
// 方式 5:获取自定义 Header
const customToken = req.header('X-API-Key');
// 优先级处理
const token = bodyToken || customToken || req.query.access_token;
if (!token) {return res.status(401).json({error: 'Unauthorized'});
}
// JWT 验证等操作...
});
安全对比矩阵
| 方式 | 安全性 | 缓存风险 | 适用场景 |
|---|---|---|---|
| Authorization Header | ★★★★★ | 无 | 通用推荐方案 |
| URL 参数 | ★★☆☆☆ | 高 | 临时调试 / 特殊回调 |
| Cookie | ★★★★☆ | 中 | 需要维持会话的 Web 应用 |
| Request Body | ★★★★☆ | 无 | POST/PUT 请求 |
| 自定义 Header | ★★★★☆ | 无 | 企业内部 / 特殊安全要求 |
三大避坑指南
- Token 过期处理
- 实现 Refresh Token 机制
-
返回 401 时前端自动刷新(APIPost 可用 Tests 脚本模拟)
pm.test("Auto refresh token", function() {if (pm.response.code === 401) { pm.sendRequest({ url: '/auth/refresh', method: 'POST', header: {'Authorization': pm.environment.get('refreshToken') } }, (err, res) => {pm.environment.set('accessToken', res.json().token); pm.expect.fail('Token expired - auto refreshed'); }); } }); -
日志脱敏
-
Nginx 配置过滤敏感 Header
log_format main '$remote_addr - $request [$status]' '$http_user_agent $http_referer'; -
CSRF 防护
- Cookie 方式必须设置 SameSite 属性
- 关键操作需二次验证
思考题:如何选择最佳方案?
当你的 API 需要同时支持:
– 移动 APP(无 Cookie)
– 浏览器 SPA 应用
– 第三方服务调用
你会如何设计 Token 传递方案?欢迎在评论区分享你的架构思路!
