1. 如何實(shí)現(xiàn)安全的 HttpOnly 和 Secure Cookie? ?
?問題?:防止 XSS 攻擊竊取 Cookie,同時(shí)確保僅通過 HTTPS 傳輸。
?解決方案?:
?服務(wù)端設(shè)置?(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 請求默認(rèn)不發(fā)送 Cookie,需顯式配置。
?解決方案?:
?前端配置?(Axios):
axios.get('https://api.example.com/data', {
withCredentials: true
});
?服務(wù)端配置?(Nginx):
add_header 'Access-Control-Allow-Origin' 'https:
add_header 'Access-Control-Allow-Credentials' 'true';
?注意?:Access-Control-Allow-Origin
不能為 *
。
?3. 如何實(shí)現(xiàn) Cookie 的自動(dòng)續(xù)期? ?
?問題?:用戶長時(shí)間未操作但保持登錄狀態(tài)。
?解決方案?:
?滑動(dòng)過期時(shí)間?(JWT 示例):
function refreshToken(oldToken) {
const newExpiry = Date.now() + 30 * 60 * 1000;
return jwt.sign({ ...jwt.decode(oldToken), exp: newExpiry }, secret);
}
- 每次請求驗(yàn)證 Cookie 后,重置過期時(shí)間。
?4. Cookie 與 LocalStorage 如何選擇? ?
?對比?:
?特性? | ?Cookie? | ?LocalStorage? |
---|
?容量? | ≤4KB | ≥5MB |
?自動(dòng)傳輸? | 是(通過請求頭) | 否 |
?安全性? | 可設(shè) HttpOnly /Secure | 易被 XSS 竊取 |
?適用場景? | 會(huì)話管理、身份驗(yàn)證 | 持久化本地?cái)?shù)據(jù)(如主題設(shè)置) |
?5. 如何防御 Cookie 劫持? ?
?解決方案?:
?SameSite 屬性?:
httpCopy Code
Set-Cookie: sessionId=123
Lax
:允許同站和導(dǎo)航跳轉(zhuǎn)請求攜帶 Cookie。Strict
:完全禁止跨站攜帶7。
?綁定 User-Agent/IP?:
if (req.cookies.token && req.headers['user-agent'] === storedUA) {
}
?注意?:IP 綁定可能誤傷動(dòng)態(tài) IP 用戶。
?6. 如何實(shí)現(xiàn)分布式系統(tǒng)的 Session 共享? ?
?問題?:多臺(tái)服務(wù)器需共享用戶會(huì)話狀態(tài)。
?解決方案?:
?Redis 集中存儲(chǔ)?(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
}));
- 所有服務(wù)器從 Redis 讀寫 Session。
?轉(zhuǎn)自https://juejin.cn/post/7503390744385519627
該文章在 2025/5/13 10:20:33 編輯過