1. 如何实现安全的 HttpOnly 和 Secure Cookie?
问题:防止 XSS 攻击窃取 Cookie,同时确保仅通过 HTTPS 传输。
解决方案:
-
服务端设置(Node.js 示例):
res.setHeader('Set-Cookie', [ 'token=abc123; HttpOnly; Secure; SameSite=Strict', 'theme=dark; HttpOnly; Secure; Max-Age=3600' ]);HttpOnly:禁止 JavaScript 访问 Cookie。Secure:仅允许 HTTPS 传输。SameSite=Strict:阻止 CSRF 攻击。
2. 跨域请求如何携带 Cookie?
问题:CORS 请求默认不发送 Cookie,需显式配置。
解决方案:
-
前端配置(Axios):
axios.get('https://api.example.com/data', { withCredentials: true // 允许携带 Cookie }); -
服务端配置(Nginx):
add_header 'Access-Control-Allow-Origin' 'https://your-app.com'; add_header 'Access-Control-Allow-Credentials' 'true';注意:
Access-Control-Allow-Origin不能为*。
3. 如何实现 Cookie 的自动续期?
问题:用户长时间未操作但保持登录状态。
解决方案:
-
滑动过期时间(JWT 示例):
function refreshToken(oldToken) { const newExpiry = Date.now() + 30 * 60 * 1000; // 延长 30 分钟 return jwt.sign({ ...jwt.decode(oldToken), exp: newExpiry }, secret); }- 每次请求验证 Cookie 后,重置过期时间。
4. Cookie 与 LocalStorage 如何选择?
对比:
| 特性 | Cookie | LocalStorage |
|---|---|---|
| 容量 | ≤4KB | ≥5MB |
| 自动传输 | 是(通过请求头) | 否 |
| 安全性 | 可设 HttpOnly/Secure | 易被 XSS 窃取 |
| 适用场景 | 会话管理、身份验证 | 持久化本地数据(如主题设置) |
5. 如何防御 Cookie 劫持?
解决方案:
-
SameSite 属性:
httpCopy Code Set-Cookie: sessionId=123; SameSite=Lax; SecureLax:允许同站和导航跳转请求携带 Cookie。Strict:完全禁止跨站携带7。
-
绑定 User-Agent/IP:
// 服务端验证 Cookie 时检查 User-Agent if (req.cookies.token && req.headers['user-agent'] === storedUA) { // 允许访问 }注意:IP 绑定可能误伤动态 IP 用户。
6. 如何实现分布式系统的 Session 共享?
问题:多台服务器需共享用户会话状态。
解决方案:
-
Redis 集中存储(Node.js + Redis):
const session = require('express-session'); const RedisStore = require('connect-redis')(session); app.use(session({ store: new RedisStore({ host: 'redis-server' }), secret: 'your-secret', resave: false }));- 所有服务器从 Redis 读写 Session。