应优先使用 httponly cookie 存储 token,因其可防 xss 窃取;若必须用 localstorage,则加密仅为防物理接触泄露,需动态获取密钥、用 web crypto api 加密最小必要字段,并避免存储密钥或主 token。

直接在 localStorage 中存加密后的 Token,看似加了一层防护,实则掩盖了根本风险——它没解决 XSS 下脚本可任意读取 localStorage 的问题。加密只是把明文变密文,而攻击者拿到密文后,只要控制页面,就能用相同密钥当场解密,或干脆把整个加解密逻辑一起偷走。真正有效的做法,是减少对 localStorage 的依赖,并配合更底层的防护机制。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
优先改用 HttpOnly Cookie 存 Token
这是目前最成熟、被广泛验证的安全方案:
- 服务端登录成功后,通过
Set-Cookie响应头下发 Token,带上HttpOnly、Secure和SameSite=Strict(或Lax)属性 - 浏览器自动在每次同源请求中携带该 Cookie,前端 JS 完全无法读取或篡改
- 即使页面存在 XSS 漏洞,恶意脚本也无法窃取 Token
- 配合后端校验签名、设置短期有效期、支持主动登出失效,形成完整闭环
如果必须用 localStorage,加密只是辅助,不是核心防线
此时加密的目的不是防 XSS,而是防本地物理接触(比如他人直接打开开发者工具复制值)或浏览器导出数据时的二次泄露。关键要配合以下三点:
- 加密密钥不硬编码在代码里,而是从服务端动态获取(如登录后返回一个 session-bound key),且仅缓存在内存中,不用 localStorage 存
- 使用 Web Crypto API 而非第三方库(如 CryptoJS),避免引入不可信的依赖和潜在漏洞
- 加密后只存最小必要字段:例如仅加密用户 ID + 时间戳签名,而非整个 JWT;Token 本身仍由后端签发并校验,前端不信任其内容
用 sessionStorage 替代 localStorage 存短期凭证
对登录态这类会话级数据,sessionStorage 是更合理的选择:
- 关闭标签页即自动清空,天然降低长期泄露风险
- 同样支持加密存储,但生命周期可控,无需手动清理
- 可封装为带自动过期检查的工具:
const safeSessionStore = { set(key, value, expireInMs = 30 * 60 * 1000) { const item = { data: encrypt(value), expires: Date.now() + expireInMs }; sessionStorage.setItem(key, JSON.stringify(item)); }, get(key) { const item = sessionStorage.getItem(key); if (!item) return null; const parsed = JSON.parse(item); if (Date.now() > parsed.expires) { sessionStorage.removeItem(key); return null; } return decrypt(parsed.data); } };
永远不要把密钥、私钥、主 Token 明文或加密后存进 localStorage
哪怕加了 AES-256,只要密钥出现在前端代码或内存中,就可能被调试器、console、堆快照或恶意扩展捕获。真正的密钥管理应发生在服务端,前端只负责传递已签名的临时凭证,并依赖服务端做最终鉴权。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










