问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Cookie与Token详解及测试需重点关注点

创作时间:
作者:
@小白创作中心

Cookie与Token详解及测试需重点关注点

引用
CSDN
1.
https://blog.csdn.net/m0_58552717/article/details/146886185

Cookie和Token是现代Web应用中两种重要的身份验证与会话管理机制。它们在性能、灵活性和安全性方面各有特点。作为测试人员,理解它们的工作原理以及如何进行有效的测试,是保证应用安全性和稳定性的关键。

Cookie与Token的基本概念

Cookie是网站存储在用户浏览器中的小数据片段,用于记住用户信息,如登录状态或偏好设置。它们分为:

  • 会话Cookie:浏览器关闭后删除。
  • 持久Cookie:在过期或手动删除前保留。

Cookie通常通过HTTPS传输,并可设置"Secure"和"HttpOnly"标志以增强安全。

Token是用于认证的字符串,常用于API的无状态系统。常见类型包括JSON Web Tokens (JWT)和访问令牌,通过HTTP头部发送,服务器验证身份。

使用场景

  • Cookie常用于传统Web应用的会话管理。
  • Token适合现代API和无状态认证系统。

测试重点

Cookie测试

  • 确保设置"Secure"和"HttpOnly"标志。
  • 验证登出后Cookie被删除。
  • 测试Cookie是否能被篡改。

Token测试

  • 验证每个请求的Token是否有效。
  • 检查Token过期和刷新机制。
  • 确保Token唯一且不可重用。

其他关注点

  • 测试登录和登出流程。
  • 确保未授权访问被阻止。
  • 检查多标签/窗口下的会话管理。

Cookie的详细解释

Cookie是服务器发送到用户浏览器的数据片段,浏览器存储这些数据,并在后续请求中自动发送回服务器。它们有以下类型:

  • 会话Cookie:临时存储,浏览器关闭后删除。
  • 持久Cookie:设置过期时间,保留到指定日期或手动删除。

Cookie可以设置以下标志以增强安全:

  • Secure:确保仅通过HTTPS传输。
  • HttpOnly:防止JavaScript访问,减少XSS攻击风险。
  • SameSite:限制跨站点请求,防止CSRF攻击。

研究显示,Cookie在传统Web应用中常用于存储会话ID,服务器通过会话ID检索用户状态。这种方法是状态化的,服务器需要维护会话数据。

Token的详细解释

Token是用于认证的字符串,通常在用户登录后由服务器生成并发送给客户端。客户端在后续请求中通过HTTP头部(如Authorization: Bearer )发送Token,服务器验证其有效性。常见类型包括:

  • JSON Web Tokens (JWT):包含用户信息的自包含令牌,通过签名验证完整性。
  • 访问令牌:通过协议如OpenID Connect或OAuth 2.0获取,用于API认证。

Token的特点是无状态,服务器不维护会话状态,每个请求都依赖Token的验证。这适合现代API和分布式系统,证据显示其在微服务架构中应用广泛。

使用场景与对比

特性
Cookie
Token
存储位置
浏览器自动存储并发送
客户端管理,需手动发送
状态性
状态化(服务器维护会话)
无状态(每个请求自包含)
安全风险
易受XSS和CSRF攻击
需注意Token泄露和刷新机制
典型使用
Web应用会话管理
API认证和无状态系统

从表中可以看出,Cookie适合传统Web应用,Token更适合API和现代架构。测试时需根据应用类型选择重点。

Cookie与Token深度解析

Cookie工作机制

本质:服务器发送到浏览器并保存在本地的小型数据片段

工作原理:

  1. 客户端首次访问
  2. 服务端通过Set-Cookie响应头下发
  3. 浏览器自动存储
  4. 后续请求自动携带Cookie头
  5. 服务端验证
  6. 维持有状态会话

关键属性:

Set-Cookie: sessionId=abc123;
Domain=.example.com;
Path=/;
Max-Age=3600;
Secure;
HttpOnly;
SameSite=Lax

Token工作机制

主流实现:JWT(JSON Web Token)

结构组成:

Header.Payload.Signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

验证流程:

  1. 客户端登录获取Token
  2. 客户端存储Token(通常LocalStorage)
  3. 请求时手动添加到Authorization头
  4. 服务端解密验证签名

测试工程师必备知识体系

安全测试要点

Cookie安全:

  • HttpOnly测试:验证是否阻止JS访问
// 尝试读取Cookie应失败
try {
  document.cookie;
} catch(e) {
  /* 预期抛出异常 */
}
  • Secure测试:非HTTPS请求不应传输
curl -I http://example.com/ --cookie "session=123"
# 应观察到Cookie未发送
  • SameSite测试:
# 跨站请求测试
def test_samesite():
    session = requests.Session()
    # 模拟跨站请求
    response = session.post('https://victim.com/transfer',
                            data={'to': 'hacker', 'amount': 1000},
                            headers={'Origin': 'https://attacker.com'})
    assert 'Set-Cookie' not in response.headers

Token安全:

  • 签名算法测试:尝试修改Payload保留原签名
# 修改JWT中间部分但保留原签名
echo "eyJhbG...<篡改部分>...SflKxw" | base64 -d | jq
# 服务端应拒绝
  • 时效性测试:精确到秒的过期验证
// Postman测试脚本
const token = pm.response.json().token;
const decoded = jwt_decode(token);
pm.expect(new Date(decoded.exp * 1000)
  .to.be.lessThan(new Date(Date.now() + 3600*1000));

功能测试要点

会话管理测试:

测试场景
预期结果
清除Cookie后访问
跳转登录页
修改Cookie值
会话失效
过期Cookie
返回401

Token刷新测试:

def test_token_refresh():
    # 获取初始Token
    token = login()
    # 等待Token临近过期
    time.sleep(TOKEN_LIFETIME - 10)
    # 发起业务请求
    response = request_with_token(token)
    # 验证是否触发自动刷新
    assert 'New-Token' in response.headers
    assert response.status_code == 200

并发测试:

Cookie会话冲突:

# 模拟多终端登录
curl -H "Cookie: session=A" https://api.example.com/profile &
curl -H "Cookie: session=B" https://api.example.com/profile &
# 验证会话是否互斥

Token复用检测:

// 使用相同Token发起并行请求
const token = pm.variables.get('token');
const requests = [
    { url: 'api/order', method: 'POST' },
    { url: 'api/payment', method: 'POST' }
];
requests.forEach(req => {
    pm.sendRequest({
        url: req.url,
        method: req.method,
        header: {'Authorization': `Bearer ${token}`}
    }, (err, res) => {
        pm.expect(res.code).to.equal(200);
    });
});

性能测试要点

基准测试指标:

指标
Cookie方案
Token方案
认证耗时
依赖会话存储查询
仅需解密验证
服务端内存占用
高(存储会话)
无状态
集群扩展成本
需会话复制/共享
天然支持

测试脚本示例:

// JMeter测试计划示例
HTTP Request Defaults:
- Server: api.example.com
- Path: /auth-check
- Method: GET
Cookie Manager:
- Implementation: HC4CookieHandler
- Policy: standard
HTTP Header Manager:
- Authorization: Bearer ${token}
Throughput Controller:
- Total Executions: 1000

专项测试技术

渗透测试技术

Cookie劫持测试:

# 使用Mitmproxy拦截
mitmproxy -s cookie_stealer.py
![](https://wy-static.wenxiaobai.com/chat-rag-image/12463076684879948605)
# cookie_stealer.py内容:
def response(flow):
    if 'Set-Cookie' in flow.response.headers:
        print(f"Stolen Cookie: {flow.response.headers['Set-Cookie']}")

Token重放攻击:

# 使用旧Token尝试访问
def test_token_replay():
    old_token = get_used_token()  # 获取已使用过的Token
    response = requests.get(
        'https://api.example.com/data',
        headers={'Authorization': f'Bearer {old_token}'}
    )
    assert response.status_code == 401  # 应拒绝旧Token

自动化测试框架集成

Pytest插件示例:

# conftest.py
@pytest.fixture
def authenticated_session():
    session = requests.Session()
    # Cookie方案
    if AUTH_TYPE == 'cookie':
        session.get(LOGIN_URL)
        yield session
        session.get(LOGOUT_URL)
    # Token方案
    else:
        token = get_token()
        session.headers.update({'Authorization': f'Bearer {token}'})
        yield session
        revoke_token(token)

总结

一个意想不到的细节是,Cookie和Token可能在同一应用中混合使用。例如,Web应用可能使用Cookie存储会话ID,同时通过Token处理API调用。测试时需特别注意两者协同工作,确保不会出现安全漏洞,如Token泄露导致Cookie被劫持。

Cookie和Token在现代Web应用中有着广泛的应用,它们各自有着不同的优势和适用场景。测试人员需要关注这两者在应用中的使用情况,确保它们在会话管理和身份验证中的正确性与安全性。通过全面的测试策略,可以有效避免潜在的安全漏洞,并为用户提供一个更加安全、稳定的应用环境。

Cookie和Token是Web应用认证的核心,测试时需重点关注安全标志、验证机制、会话管理等。建议测试人员根据应用类型选择测试重点,并结合工具如Burp Suite进行安全测试。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号