使用SimpleJWT认证时React端缺失部分Cookie但Django端可正常获取
问题原因
- 核心原因是
HttpOnlyCookie属性限制:你在后端设置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防护:
- 修改
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)
- 如果需要读取
sessionid,在Django的settings.py中添加配置:
SESSION_COOKIE_HTTPONLY = False
- 跨域部署额外补充配置:
- Django的
settings.py中开启凭证允许:CORS_ALLOW_CREDENTIALS = True - 不要使用
CORS_ALLOW_ALL_ORIGINS = True,需显式指定前端地址:CORS_ALLOWED_ORIGINS = ["http://localhost:3000"](替换为你的前端实际访问地址)
- Django的
内容的提问来源于stack exchange,提问作者Samuel Grosser
相关产品推荐
相关产品推荐

