如何在客户端安全存储API Token,防止用户查看访问?
针对Django+React项目的API Token安全存储方案
首先明确核心原则:API Token绝对不能存放在前端可访问的位置(meta标签、sessionStorage、localStorage都不行),这些地方用户通过页面审查或JS控制台就能轻易获取,对于处理敏感客户信息的项目来说风险极高,XSS攻击会直接窃取Token导致数据泄露。
结合你的技术栈,推荐两个最靠谱的方案:
方案一:使用Django原生会话认证(HttpOnly Cookie)—— 优先选择
这是最贴合Django生态、安全性最高的方案,完全不需要前端持有API Token:
- 后端配置(settings.py):
确保开启以下配置,让会话Cookie具备安全属性:SESSION_COOKIE_HTTPONLY = True # 禁止JS读取Cookie,防范XSS攻击 SESSION_COOKIE_SECURE = True # 仅在HTTPS协议下传输Cookie SESSION_COOKIE_SAMESITE = 'Lax' # 防止CSRF攻击,也可根据需求设为'Strict' - 后端逻辑:用户登录后,Django自动创建会话并设置上述安全Cookie,无需手动生成独立API Token。所有业务API视图用
@login_required装饰器保护,后端通过会话自动验证用户身份。 - 前端React调整:
发起请求时,让浏览器自动带上会话Cookie。如果用axios,可全局配置:
你之前获取CSRF Token的代码可以保留,请求时把CSRF Token放在import axios from 'axios'; axios.defaults.withCredentials = true;X-CSRFToken请求头里,和原有逻辑一致即可。
这种方式下,认证信息存储在HttpOnly Cookie中,前端JS无法读取,用户也看不到,彻底避免Token泄露风险。
方案二:后端代理API请求(若必须使用独立API Token)
如果你的数据接口是第三方服务,必须用独立Token调用,那把Token完全留在后端,前端通过Django代理请求:
- 后端Django编写代理视图:
import requests from django.http import JsonResponse from django.contrib.auth.decorators import login_required @login_required def proxy_api(request): # 从后端配置或服务器端会话中取出API Token(绝对不要传给前端) api_token = request.session.get('api_token') # 调用目标API,在后端内部带上Token response = requests.get( 'https://目标API地址', headers={'Authorization': f'Bearer {api_token}'} ) # 将第三方API的结果返回给前端 return JsonResponse(response.json(), status=response.status_code) - 前端React只和自己的Django后端通信,不用知道API Token的存在,请求路径改为代理视图的URL即可。
这种方式下Token完全隔离在后端,前端没有任何机会接触到,安全性拉满。
内容的提问来源于stack exchange,提问作者Miguel G
相关产品推荐
相关产品推荐

