DRF默认配置会要求较严x-CSRFTOKEN的原因分析

Django REST framework(DRF)默认对 CSRF 保护机制的处理相对严格,尤其是在使用基于 SessionAuthentication 的认证方式时,会强制校验 X-CSRFToken 请求头。下面是 DRF 默认要求较严 X-CSRFToken 的原因分析:



🔐 一、CSRF 机制的作用

**CSRF(跨站请求伪造)**是一种攻击方式,攻击者诱导用户在已认证网站中执行未授权操作。例如:

  • 用户登录了网站 A
  • 攻击者诱导用户访问恶意网站 B,后台提交请求到 A
  • 因为用户已登录,A 的后端会认为这是合法请求

所以,Django 的 CSRF 机制要求:

  • 所有 非安全请求(POST、PUT、DELETE 等)都必须带上有效的 CSRF token
  • 客户端需将 token 以 X-CSRFToken 头部发送回来


🚧 二、DRF 默认行为:SessionAuthentication + CSRF

认证方式是否检查 CSRF Token说明
SessionAuthentication(默认)✅ 检查 X-CSRFToken为了防止会话劫持
TokenAuthentication / JWTAuthentication❌ 不检查 CSRF不依赖浏览器 Cookie,不易受 CSRF 攻击

📌 原因

DRF 默认使用 SessionAuthentication 是为了兼容 Django 的认证体系(比如 admin 界面、session 登录等),但这也意味着:

  • 请求会使用浏览器中的 Cookie 自动携带 sessionid
  • 若不校验 CSRF,就容易被跨站调用滥用

因此 DRF 要求你在客户端请求时设置:

X-CSRFToken: <csrftoken>

并且这个 token 必须和用户登录时 Django 设置的 CSRF cookie 一致。



🔄 三、开发中常见问题

✅ 情况一:使用 DRF 浏览器接口(Browsable API)

浏览器会自动携带 session cookie,但你必须:

  • 已登录(设置了 sessionid)
  • 在请求头中带上 X-CSRFToken(DRF 会自动处理)

否则报错:

403 Forbidden
CSRF Failed: CSRF token missing or incorrect.

⚠️ 情况二:前端 axios/fetch 请求 POST 接口

你需要:

  1. 从 cookie 中提取 csrftoken
  2. 设置请求头:
headers: {
  'X-CSRFToken': csrftoken
}


🛠 四、绕过或放宽策略的方法(仅开发调试用)

方法一:使用 TokenAuthentication 替代 SessionAuthentication

修改 settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
}

这样不再依赖 session,也不会触发 CSRF 校验。

方法二:手动禁用 CSRF 校验(不推荐,除非你非常确定)

你可以在视图函数中添加:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
@api_view(['POST'])
def your_view(request):
    ...

或者对基于类的视图使用:

from django.utils.decorators import method_decorator

@method_decorator(csrf_exempt, name='dispatch')
class YourView(APIView):
    ...


✅ 推荐实践(生产)

场景认证方式是否需要 CSRF
内网后端服务间调用Token / JWT❌ 不需要
Web 页面 + Session 登录SessionAuthentication✅ 必须校验 CSRF
单页应用(SPA)JWT(Header 认证)❌ 不需要
表单提交(用户登录后)SessionAuthentication✅ 需要


✅ 总结

  • DRF 默认使用 SessionAuthentication,会强制校验 CSRF Token,是为了保障 基于 session 的 Web 应用安全。
  • 如果你开发的是 API-only 服务,推荐使用 TokenAuthentication 或 JWTAuthentication,避免与 CSRF 校验耦合。
  • 对于浏览器端 Web 应用,一定要设置 X-CSRFToken 请求头,否则会触发 403。

如你有特定的请求代码或场景需要诊断,我也可以帮你具体定位 CSRF 校验失败的原因。

文章标签:

评论(0)