简单请求与复杂请求的跨域区别 跨域的cookie携带问题

一、简单请求与复杂请求 跨域问题

什么是简单请求

  • 请求方式为GET、HEAD、POST时的请求;
  • 认为设置规范集合之内的首部字段,如Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/Width;
  • Content-Type 的值仅限于下列三者之一,即application/x-www-form-urlencoded、multipart/form-data、text/plain;
  • 请求中的任意 XMLHttpRequestUpload对象均没有注册任何事件监听器;
  • 请求中没有使用 ReadableStream对象。

什么是复杂请求

  • 请求方式为PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH;
  • 人为设置了以下集合之外首部字段,即简单请求外的字段;
  • Content-Type 的值不属于下列之一,即application/x-www-form-urlencoded、multipart/form-data、text/plain。

简单请求跨域

请求头属性

  • Origin Origin和Referer的区别是,Origin包含协议、域名、端口,不包含路径,Referer包含路径

响应头属性

  • Access-Control-Allow-Origin: '*' // 或者指定域名
  • Access-Control-Allow-Credentials: 可选,是否允许携带cookie

请求次数

  • 1次

复杂请求跨域

请求头属性

  • Origin:必须
  • Access-Control-Request-Methods: 必须,指定cors可以使用哪些http方法
  • Access-Control-Request-Headers: 可选,指定cors可以额外发送的头信息

响应头属性

  • Access-Control-Allow-Origin: 必须
  • Access-Control-Allow-Methods: 必须
  • Access-Control-Allow-Headers: 当请求头有Access-Control-Request-Headers时必须,否则可选
  • Access-Control-Allow-Credentials: 可选,是否允许携带cookie
  • Access-Control-Max-Age: 可选

请求次数

  • 2次,第一次是预检请求OPTIONS。预检请求用于检测是否跨域,如果跨域就不发二次请求了。因为即使不允许跨域,浏览器没有处理响应,请求也是会被服务器处理从而造成影响的

二、跨域时cookie携带问题

无论是简单请求还是复杂请求,跨域时携带cookie都需要Access-Control-Allow-Credentials为true才可以携带cookie信息

除此之外,cookie的携带还被set-cookie所限制,在处理跨域请求cookie携带问题时,这些都是需要综合考虑的

set-cookie的一些限制

secure
对于https, 如果设置了secure=true,那么cookie只能通过https请求发送
并且现在http请求不允许设置secure属性

Domain
可以访问该cookie的域名,默认为origin
如设置了google.com, 那么向谷歌发请求时就能够携带这个cookie
Domain默认包含二级域名,常用于和子域名共享用户信息

Path
指令了哪些路径可以访问cookie, 模糊匹配

SameSite

  • null, 即浏览器会在同站、跨站的情况下发送cookie
  • Strict, 浏览器只会在同站时发送cookie
  • Lax
    同站发送cookie,跨站大多数情况下禁止获取cookie, 跨站只会在导航时发送cookie(如a.href链接、预加载、GET表单), 而img.src, script.src都不会发送cookie;设置了Strict或Lax以后,基本就
    杜绝了 CSRF 攻击。当然,前提是用户浏览器支持 SameSite 属性。 SameSite属性的默认SameSite=Lax 【该操作适用于2019年2月4号谷歌发布Chrome 80稳定版之后的版本】
posted @ 2022-06-23 23:07  IslandZzzz  阅读(642)  评论(0编辑  收藏  举报