django的csrf认证
django的csrf中间件会默认将request中的token进行比较
eg. 以POST reqeust举例
当为请求体为表单,中间件会将表单的csrfmiddlewaretoken与cookie的csrftoken值比较是否一致,不携带csrfmiddlewaretoken就会报错403
当请求体为json字符串,中间件会将请求头中的X-CSRFToken与cookie的csrftoken值比较是否一致,不携带csrfmiddlewaretoken就会报错403
前后端分离的项目中,如django+vue
- django为前端暴露专用接口生成csrf_token
- vue初始不携带cookie向没有被 @csrf_exempt 豁免的视图请求,得到set_cookie响应头
- 随后的同源请求都将携带这个csrf_token,如果非GET/HEAD请求还需要配置请求体/请求体的token内容,供后端校验
cookie的属性(GPT)
- SameSite
- strict:只有在完全同源请求中才会携带 cookie(比如从你自己的网站点击表单提交);即使从其他页面跳转过来也不会带 cookie。🚫 禁止所有“跨站”请求**
- Lax(默认):GET 请求可以跨站携带 cookie(比如从邮箱点链接访问你的网站),但 POST/PUT/DELETE 不会携带 cookie
- None:允许所有跨站请求都携带 cookie(包括 POST),但必须同时设置 Secure
- HttpOnly
设置为 HttpOnly 后,JavaScript 无法通过 document.cookie 访问该 cookie,例如 Vue 想从 cookie 里读 csrftoken 时,就不能加这个属性。 - Secure
只有在 HTTPS 连接下 cookie 才会被浏览器发送。(在生产环境建议 所有敏感 cookie 都加上 Secure)

浙公网安备 33010602011771号