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)

  1. SameSite
  • strict:只有在完全同源请求中才会携带 cookie(比如从你自己的网站点击表单提交);即使从其他页面跳转过来也不会带 cookie。🚫 禁止所有“跨站”请求**
  • Lax(默认):GET 请求可以跨站携带 cookie(比如从邮箱点链接访问你的网站),但 POST/PUT/DELETE 不会携带 cookie
  • None:允许所有跨站请求都携带 cookie(包括 POST),但必须同时设置 Secure
  1. HttpOnly
    设置为 HttpOnly 后,JavaScript 无法通过 document.cookie 访问该 cookie,例如 Vue 想从 cookie 里读 csrftoken 时,就不能加这个属性。
  2. Secure
    只有在 HTTPS 连接下 cookie 才会被浏览器发送。(在生产环境建议 所有敏感 cookie 都加上 Secure)
posted @ 2025-04-13 14:30  leleleocc  阅读(17)  评论(0)    收藏  举报