You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SimpleJWT认证时React端缺失部分Cookie但Django端可正常获取

问题原因
  • 核心原因是HttpOnly Cookie属性限制:你在后端设置access_token时显式指定了httponly=True,Django默认的sessionid也默认开启了SESSION_COOKIE_HTTPONLY配置。HttpOnly属性的设计初衷就是禁止前端JavaScript读取Cookie,避免XSS攻击窃取敏感身份凭证,因此这类Cookie只会被浏览器自动附加在请求中发送给后端,前端JS无法直接读取,所以你调用cookies.getAll()时看不到这两个字段。
  • 额外排查点:如果前后端属于跨域部署(域名/端口/协议不一致),还需要确认跨域配置正确,否则即使关闭HttpOnly前端也可能无法读取Cookie。
解决方案

根据你的实际业务需求选择对应方案即可:

场景1:前端不需要主动读取敏感Cookie(推荐)

这是符合安全规范的正常现象,不需要修改Cookie的HttpOnly配置:

  • 前端发请求时只需给请求库配置携带凭证即可,axios配置示例:
const request = axios.create({
  withCredentials: true
})

fetch配置示例:

fetch(url, {
  credentials: 'include'
})

配置后浏览器会自动把access_token和sessionid附加到请求中发送给后端,后端可正常读取校验,同时避免了XSS攻击偷取Token的风险。

场景2:确实需要前端读取access_token/sessionid

可按需关闭对应Cookie的HttpOnly属性,注意该操作会提升XSS攻击风险,需做好前端XSS防护:

  1. 修改access_token的设置代码,把httponly=True改为httponly=False:
res.set_cookie("access_token", access_token, max_age=settings.SIMPLE_JWT.get('ACCESS_TOKEN_LIFETIME').total_seconds(),samesite='Lax',secure=False, httponly=False)
  1. 如果需要读取sessionid,在Django的settings.py中添加配置:
SESSION_COOKIE_HTTPONLY = False
  1. 跨域部署额外补充配置:
    • Django的settings.py中开启凭证允许:CORS_ALLOW_CREDENTIALS = True
    • 不要使用CORS_ALLOW_ALL_ORIGINS = True,需显式指定前端地址:CORS_ALLOWED_ORIGINS = ["http://localhost:3000"](替换为你的前端实际访问地址)

内容的提问来源于stack exchange,提问作者Samuel Grosser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:27:02