简单请求与复杂请求的跨域区别 跨域的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稳定版之后的版本】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端