为何Django Rest Framework中POST请求需将CSRF令牌置于请求体而非请求头?
Django Rest Framework中CSRF令牌不同位置的原因
源于Django原生CSRF机制的设计
Django的CSRF防护最初是为传统表单提交场景打造的。当你用Django模板生成表单时,框架会自动插入一个名为csrfmiddlewaretoken的隐藏输入字段,表单以POST方式提交时,这个字段会随请求体一起发送,Django的CSRF中间件默认会从请求体读取这个键来验证令牌。DRF作为Django的扩展,继承了这个行为,所以表单式的POST提交必须遵循这个规则。适配AJAX请求的场景
对于PUT、DELETE这类非POST请求,开发者通常用AJAX发送。AJAX请求在请求头里添加字段比构造表单数据放入请求体更便捷,而且前端框架也更容易实现从Cookie中读取CSRF令牌后放到请求头里。Django的CSRF中间件后续适配了这种场景,支持从X-CSRFToken请求头读取令牌,DRF自然沿用了这个适配方案,所以这类请求用请求头的方式成了常规做法。两种方式其实兼容
其实DRF并没有强制POST请求只能用请求体的csrfmiddlewaretoken——如果用AJAX发送POST请求,把令牌放在X-CSRFToken请求头里同样有效。只是传统表单提交的POST只能用请求体方式,大家慢慢把这种情况作为POST的默认做法,非POST请求统一用请求头,这样区分开更清晰。
内容的提问来源于stack exchange,提问作者rsommerard
相关产品推荐
相关产品推荐

