OpenID Connect 登录后如何在 Vue 中安全存储 ID Token?
我用 OpenID Connect 接入了公司的统一认证,登录成功后拿到了 ID Token,但不确定该存 localStorage 还是 sessionStorage,听说都有安全风险?
现在我是这样存的,但担心被 XSS 攻击偷走:
<script setup>
import { useAuthStore } from '@/stores/auth'
const handleLoginSuccess = (response) => {
const { id_token } = response
// 直接存 localStorage,是不是太危险了?
localStorage.setItem('id_token', id_token)
useAuthStore().setToken(id_token)
}
</script>
建议换个思路:把ID Token存在HttpOnly的Cookie里。这样前端JavaScript根本访问不到它,就算有XSS漏洞也拿不走Token。
具体做法是在登录成功后,让服务端设置一个Secure、HttpOnly的Cookie:
然后在服务端写入Cookie:
前端需要验证用户身份时,通过服务器端的会话来判断,而不是直接操作ID Token。
这种方案虽然麻烦点,但安全性高多了。开发中确实要多为安全考虑,这比省事重要。
但 sessionStorage 依然防不住 XSS。真正安全的做法是后端用 HttpOnly Cookie 存 token,前端根本不碰 token,只通过 Cookie 自动认证。