前端存 Access Token 到底该用 localStorage 还是 cookie? UP主~文阁 提问于 2026-03-16 19:31:18 阅读 45 安全 最近在做登录功能,后端返回了 Access Token,但我不确定该存在哪。听说 localStorage 容易被 XSS 攻击,但用 cookie 又怕 CSRF,到底怎么选才安全? 我试过把 token 存 localStorage,像这样:localStorage.setItem('token', res.token),但同事说这不安全。如果改用 cookie,是不是得加 HttpOnly 和 SameSite?可那样前端又读不到 token 了,咋办? 认证授权 我来解答 赞 12 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 长孙含平 Lv1 按照规范,前端存储 Access Token 的时候,推荐使用 cookie 而不是 localStorage。localStorage 确实容易受到 XSS 攻击,而 cookie 的安全性可以通过设置一些标志来增强。 对于 CSRF 风险,你需要在 cookie 中设置 HttpOnly 标志来防止 JavaScript 访问 cookie,同时设置 SameSite=Strict 或 SameSite=Lax 来防止 CSRF 攻击。不过,设置了 HttpOnly 后,前端就无法通过 JavaScript 读取这个 cookie 了,这在某些情况下可能是个问题。 一个常见的做法是使用双重提交模式来解决 CSRF 问题。具体来说,服务器生成一个 CSRF token,并将其作为 cookie 和表单字段发送给客户端。当客户端提交请求时,服务器会验证这两个 token 是否一致,从而确保请求的合法性。 至于如何在前端获取 Access Token,通常的做法是让后端在需要验证用户身份的接口中,通过验证 cookie 来决定是否允许请求,而不是直接将 token 发送到前端。这样可以避免前端直接暴露 token 的风险。 举个例子,如果你的 API 需要认证,你可以这样设置 cookie: document.cookie = "accessToken=" + res.token + "; HttpOnly; SameSite=Strict; path=/"; 然后在每次发起请求时,浏览器会自动将这个 cookie 发送到服务器,无需手动附加 token。 希望这些信息对你有帮助。 回复 点赞 2026-03-24 16:01 雪利 ☘︎ Lv1 这个问题挺经典的,说白了就是 XSS 和 CSRF 两个风险的权衡。 localStorage 确实有 XSS 风险,因为任何能执行你页面 JS 的漏洞都能直接读走 token。但说实话,cookie 方案搞对了比 localStorage 安全得多。 核心在于:token 存 cookie 的话,设成 HttpOnly + SameSite,浏览器会自动帮你发送,根本不需要前端去读。CSRF 的问题不是 cookie 的锅,是你后端没有做 CSRF 防护。 推荐的做法是这样的: 后端设置两个 cookie,一个是 token(HttpOnly + SameSite=Strict),另一个是 CSRF token(不用 HttpOnly,前端要读)。登录时后端同时返回这两个东西,前端把 CSRF token 存 localStorage 或者内存里,每次发请求时: // 请求头里带上 CSRF token fetch('/api/protected', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-Token': localStorage.getItem('csrfToken') }, credentials: 'include' // 这个很重要,会自动带 cookie }) 后端验证两点:cookie 里的 token 是不是有效的,以及请求头里的 CSRF token 是不是匹配。这样 XSS 读不走 token(HttpOnly 挡着),CSRF 也攻击不了(没有匹配的 CSRF token)。 如果你们后端不想改,那简单方案就是 localStorage + 每次请求用 Authorization 头: // 存 localStorage localStorage.setItem('accessToken', res.token); // 请求时放 header fetch('/api/xxx', { headers: { 'Authorization': 'Bearer ' + localStorage.getItem('accessToken') } }) 这种方式CSRF 风险确实存在,因为浏览器会自动带 cookie,但至少 token 本身不会被 XSS 直接偷走。要完全安全还是得用第一种方案。 总的来说,业务敏感度高的话,别省那点功夫,老老实实做 cookie + CSRF token 这套。 回复 点赞 2026-03-17 09:09 加载更多 相关推荐 2 回答 74 浏览 Access Token 存储在 LocalStorage 安全吗?遇到跨域请求被泄露怎么办? 我在做用户登录功能时把 Access Token 放在了 LocalStorage,但测试跨域请求时突然出现错误:“Failed to load resource: Preflight respons... UX乙豪 安全 2026-02-11 10:39:34 2 回答 86 浏览 前端用localStorage存Refresh Token被恶意调用,怎么防? 我在项目里用JWT方案,把Refresh Token存在localStorage里,但测试时发现如果前端页面被XSS攻击,Refresh Token会被直接窃取。虽然Access Token设置了短时... 淑怡酱~ 安全 2026-01-26 22:16:23 2 回答 40 浏览 前端用OAuth2.0登录时,如何安全地处理access_token? 我正在用Vue做第三方登录,后端用的是OAuth2.0授权码模式。现在的问题是,拿到access_token之后,不知道该存在localStorage还是cookie里,听说都有安全风险。而且我试过把... 俊美的笔记 安全 2026-02-27 09:21:22 1 回答 63 浏览 Token 存 localStorage 安全吗?为什么登录后还能被 CSRF 攻击? 我最近在做登录功能,后端返回的 token 我直接存到了 localStorage 里,每次请求手动加到 Authorization 头。但听说这样容易被 XSS 拿走,而且好像还是防不住 CSRF?... Zz艺硕 前端 2026-03-19 21:48:19 2 回答 110 浏览 CSRF Token验证时,表单提交的Token和Cookie里的不一致怎么办? 我在用CSRF Token防护登录表单,后端每次响应头都带了Set-Cookie: csrfToken=xxx,前端用JavaScript读取cookie里的值,然后塞到表单的隐藏字段里: docum... 小艳苹 安全 2026-01-29 05:05:32 2 回答 64 浏览 Double Submit Cookie的token怎么传到请求头里? 我按照文档做了Double Submit Cookie防护,但测试时发现后端收不到CSRF-TOKEN的请求头,只能拿到cookie里的值。这是为什么啊? 我的登录表单这样写的: document.c... 长孙一然 安全 2026-01-28 20:01:29 1 回答 62 浏览 设置 SameSite=Strict 的 Cookie 后,Vue 前端还能正常发送 CSRF Token 吗? 我在后端设置了带 SameSite=Strict 的 CSRF Cookie,但前端用 Vue 发请求时好像拿不到这个 Cookie,导致 CSRF Token 传不上去。我试过在 axios 请求里... 小志远 安全 2026-03-31 01:22:16 2 回答 93 浏览 CSRF防护中,为什么我的前端生成的Token无法被后端正确验证? 我按照教程给表单请求加了CSRF防护,前端用UUID生成token存到cookie和隐藏字段里,但后端验证时总提示不匹配。明明都按文档做了,但验证还是失败,哪里出问题了? 前端代码这样写的: // 生... 令狐采涵 安全 2026-02-08 23:07:32 2 回答 124 浏览 前端POST请求被漏洞扫描工具标记CSRF漏洞,但后端已加防伪cookie该怎么办? 我在开发登录功能时,前端用axios发送POST请求,后端已通过nginx设置了Csrf-Token cookie且验证了请求头中的token。但最近漏洞扫描工具提示"缺少CSRF防护",明明后端已经... 爱学习的欢欢 安全 2026-01-28 22:49:30 1 回答 48 浏览 Double Submit Cookie 防 CSRF 到底怎么实现才安全? 我最近在项目里尝试用 Double Submit Cookie 方案防 CSRF,后端把 token 放在 Set-Cookie 里,前端再从 cookie 读出来塞到请求头。但我不确定这样是不是真的... Dev · 玉淇 安全 2026-03-23 19:29:25
对于 CSRF 风险,你需要在 cookie 中设置 HttpOnly 标志来防止 JavaScript 访问 cookie,同时设置 SameSite=Strict 或 SameSite=Lax 来防止 CSRF 攻击。不过,设置了 HttpOnly 后,前端就无法通过 JavaScript 读取这个 cookie 了,这在某些情况下可能是个问题。
一个常见的做法是使用双重提交模式来解决 CSRF 问题。具体来说,服务器生成一个 CSRF token,并将其作为 cookie 和表单字段发送给客户端。当客户端提交请求时,服务器会验证这两个 token 是否一致,从而确保请求的合法性。
至于如何在前端获取 Access Token,通常的做法是让后端在需要验证用户身份的接口中,通过验证 cookie 来决定是否允许请求,而不是直接将 token 发送到前端。这样可以避免前端直接暴露 token 的风险。
举个例子,如果你的 API 需要认证,你可以这样设置 cookie:
然后在每次发起请求时,浏览器会自动将这个 cookie 发送到服务器,无需手动附加 token。
希望这些信息对你有帮助。
localStorage 确实有 XSS 风险,因为任何能执行你页面 JS 的漏洞都能直接读走 token。但说实话,cookie 方案搞对了比 localStorage 安全得多。
核心在于:token 存 cookie 的话,设成 HttpOnly + SameSite,浏览器会自动帮你发送,根本不需要前端去读。CSRF 的问题不是 cookie 的锅,是你后端没有做 CSRF 防护。
推荐的做法是这样的:
后端设置两个 cookie,一个是 token(HttpOnly + SameSite=Strict),另一个是 CSRF token(不用 HttpOnly,前端要读)。登录时后端同时返回这两个东西,前端把 CSRF token 存 localStorage 或者内存里,每次发请求时:
后端验证两点:cookie 里的 token 是不是有效的,以及请求头里的 CSRF token 是不是匹配。这样 XSS 读不走 token(HttpOnly 挡着),CSRF 也攻击不了(没有匹配的 CSRF token)。
如果你们后端不想改,那简单方案就是 localStorage + 每次请求用 Authorization 头:
这种方式CSRF 风险确实存在,因为浏览器会自动带 cookie,但至少 token 本身不会被 XSS 直接偷走。要完全安全还是得用第一种方案。
总的来说,业务敏感度高的话,别省那点功夫,老老实实做 cookie + CSRF token 这套。