
1) 【一句话结论】采用JWT(JSON Web Token)结合HMAC-SHA256签名算法,通过设置合理的过期时间(exp)和额外的防重放机制(如时间戳+序列号或nonce),构建无状态、安全的认证授权体系,确保用户登录后访问安全检测API时,身份验证和权限控制高效且安全。
2) 【原理/概念讲解】JWT是一种自包含的认证令牌,包含三部分:
{"alg":"HS256","typ":"JWT"}),用于标识token的用途和加密方式。{"sub":"user1","aud":"api.360.com","iat":1701234567,"exp":1701312167}),其中exp为过期时间,iat为生成时间,aud为接收方(API标识)。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
【面试口播版答案】
好的,面试官。对于360的Web服务,比如用户登录后访问安全检测API,我建议采用JWT(JSON Web Token)结合HMAC-SHA256签名算法来实现安全的认证授权。具体来说,JWT由三部分组成:头部(定义签名算法,如HS256)、载荷(存储用户ID、API标识、生成时间、过期时间等)、签名(通过HMAC-SHA256确保数据完整性)。我们设置合理的过期时间(比如1小时),并在载荷中添加唯一标识(如时间戳+随机数),结合服务器端记录已验证的token序列,防止重放攻击。生成时,服务器用密钥对header和payload进行签名,客户端携带token访问API,服务端验证签名、过期时间、aud等字段,确保身份合法。这样既实现了无状态、轻量级的认证,又通过签名和过期时间保证了安全性,有效防止重放攻击。
【追问清单】