51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

设计一个安全的认证授权机制,用于360的Web服务,比如用户登录后访问安全检测API,问如何实现JWT的生成、验证,以及如何防止重放攻击,考虑签名算法(如HMAC-SHA256)和过期时间?

360Web服务端开发工程师难度:中等

答案

1) 【一句话结论】采用JWT(JSON Web Token)结合HMAC-SHA256签名算法,通过设置合理的过期时间(exp)和额外的防重放机制(如时间戳+序列号或nonce),构建无状态、安全的认证授权体系,确保用户登录后访问安全检测API时,身份验证和权限控制高效且安全。

2) 【原理/概念讲解】JWT是一种自包含的认证令牌,包含三部分:

  • Header(头部):定义token类型和签名算法(如{"alg":"HS256","typ":"JWT"}),用于标识token的用途和加密方式。
  • Payload(载荷):存储用户信息和权限(如{"sub":"user1","aud":"api.360.com","iat":1701234567,"exp":1701312167}),其中exp为过期时间,iat为生成时间,aud为接收方(API标识)。
  • Signature(签名):通过HMAC-SHA256算法生成,确保数据完整性(公式:HMAC-SHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret))。

过期时间(exp)用于控制token有效期,防止长期有效导致安全风险。重放攻击防御:可通过在Payload中添加唯一标识(如nonce或序列号),结合服务器端记录已验证的token序列号,或使用时间戳+随机数,确保每次请求的token唯一且未被重复使用。

3) 【对比与适用场景】

方式定义特性使用场景注意点
Session服务器端存储用户会话信息,客户端存储session id有状态,需服务器维护,安全依赖服务器传统Web应用(如银行后台),需严格状态管理服务器负载高,跨设备/跨域困难
JWT自包含的token,客户端存储,服务器不存储无状态,轻量,可跨设备/跨域微服务、API网关(如360安全检测API),需快速验证需妥善管理密钥,防止泄露;过期时间设置需合理

4) 【示例】
生成JWT伪代码(服务端):

import base64, json, time, hmac, hashlib

def generate_jwt(secret, user_id, aud, exp_seconds=3600):
    header = {"alg": "HS256", "typ": "JWT"}
    payload = {
        "sub": user_id,
        "aud": aud,
        "iat": int(time.time()),
        "exp": int(time.time()) + exp_seconds
    }
    header_b64 = base64.urlsafe_b64encode(json.dumps(header).encode()).decode().replace('=', '')
    payload_b64 = base64.urlsafe_b64encode(json.dumps(payload).encode()).decode().replace('=', '')
    signature = hmac.new(secret.encode(), f"{header_b64}.{payload_b64}".encode(), hashlib.sha256).hexdigest()
    return f"{header_b64}.{payload_b64}.{signature}"

# 示例:生成token
secret = "360_secret_key"
token = generate_jwt(secret, "user123", "api.360.com")
print(token)  # 输出类似 "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1Ni..."

验证JWT伪代码(服务端):  
```python
def verify_jwt(token, secret):
    parts = token.split('.')
    if len(parts) != 3:
        return False
    header_b64, payload_b64, signature = parts
    expected_signature = hmac.new(secret.encode(), f"{header_b64}.{payload_b64}".encode(), hashlib.sha256).hexdigest()
    if signature != expected_signature:
        return False
    payload = json.loads(base64.urlsafe_b64decode(payload_b64).decode())
    if 'exp' in payload and payload['exp'] < time.time():
        return False
    if 'aud' in payload and payload['aud'] != 'api.360.com':
        return False
    return True

# 示例:验证token
print(verify_jwt(token, secret))  # 返回True或False
  1. 【面试口播版答案】
    好的,面试官。对于360的Web服务,比如用户登录后访问安全检测API,我建议采用JWT(JSON Web Token)结合HMAC-SHA256签名算法来实现安全的认证授权。具体来说,JWT由三部分组成:头部(定义签名算法,如HS256)、载荷(存储用户ID、API标识、生成时间、过期时间等)、签名(通过HMAC-SHA256确保数据完整性)。我们设置合理的过期时间(比如1小时),并在载荷中添加唯一标识(如时间戳+随机数),结合服务器端记录已验证的token序列,防止重放攻击。生成时,服务器用密钥对header和payload进行签名,客户端携带token访问API,服务端验证签名、过期时间、aud等字段,确保身份合法。这样既实现了无状态、轻量级的认证,又通过签名和过期时间保证了安全性,有效防止重放攻击。

  2. 【追问清单】

  • 问:如果token被泄露,如何处理?
    回答要点:立即通知用户更换密码,并生成新的token,同时服务器端记录泄露的token,后续验证时拒绝。
  • 问:过期时间设置多长合适?
    回答要点:根据业务需求,比如安全检测API可能需要较短的过期时间(如15-30分钟),避免长期有效导致风险,同时兼顾用户体验。
  • 问:如何处理客户端缓存token?
    回答要点:建议客户端缓存token,但设置合理的过期时间,定期刷新token(如使用refresh token),避免缓存过期后用户需要重新登录。
  • 问:如果用户同时登录多个设备,如何处理?
    回答要点:使用多设备登录检测,比如在生成token时添加设备标识,服务器端记录设备信息,当检测到新设备登录时,通知用户或强制下线旧设备。
  • 问:如何防止恶意用户伪造token?
    回答要点:签名使用强密钥(如256位密钥),验证时严格检查所有字段(如aud、exp),结合HTTPS传输,确保数据传输安全。
  1. 【常见坑/雷区】
  • 签名密钥泄露:若密钥泄露,所有token被伪造,需定期更换密钥,并通知用户。
  • 过期时间设置不合理:过期时间过短影响用户体验,过长导致安全风险,需根据业务场景平衡。
  • 重放攻击防御不足:仅依赖过期时间,未结合唯一标识(如nonce),需在payload中添加防重放字段,服务器端记录已验证的token序列。
  • payload中敏感信息泄露:若payload包含敏感信息(如用户权限),需加密或避免存储,仅存储必要信息。
  • 验证时未检查所有字段:如未验证aud(API标识),可能导致token被用于其他API,需严格检查所有字段。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1