前端用localStorage存Refresh Token被恶意调用,怎么防?
我在项目里用JWT方案,把Refresh Token存在localStorage里,但测试时发现如果前端页面被XSS攻击,Refresh Token会被直接窃取。虽然Access Token设置了短时效,但Refresh Token一旦泄露岂不是能无限刷新权限?
尝试过把Refresh Token改为HttpOnly cookie存储,但前端跨域请求时总提示credentials未正确配置。后端用Express时,即使设置了withCredentials=true,跨域预检还是返回401…
现在搞不清楚两种方案哪个更安全:是该坚持HttpOnly cookie方案,还是用加密存储Refresh Token在前端?有没有其他防护手段能防止Refresh Token被恶意使用?
// 前端请求示例
fetch('https://api.example.com/refresh-token', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' }
})
.then(res => {
if (!res.ok) throw new Error('Refresh failed');
return res.json();
})
.catch(err => console.error('Refresh error:', err));
前端fetch保持credentials: 'include'就好,记得域名和协议要匹配。
credentials,加这个:XSS防护单独搞,比如CSP头加上:
script-src 'self';别想着靠加密存储来防,前端解密逻辑一样会被攻破。