CORS中的POST/GET与PUT/DELETE区别

3
我刚读了这个链接:Same-Origin Policy:
同源策略允许使用GET和POST方法进行跨源HTTP请求,但禁止使用PUT和DELETE方法进行跨源请求。PUT和DELETE方法有什么特别之处?为什么会被阻止?无论如何,在POST方法中可以执行更新/删除操作。
在CORS中,如果POST请求使用xml/json而不是application/x-www-form-urlencoded,为什么需要预检请求?
请解释为什么某些动词的处理方式与其他动词不同。
1个回答

3

基本区别在于由用户导航网页触发的请求和由脚本触发的请求。这种区别根植于Web历史,基于早期浏览器认为安全和不安全的内容。所有浏览器都试图保持向后兼容性,以避免违反依赖于那些早期事实标准的服务器的期望。

用户浏览网页时会生成哪种请求?基本上是由表单提交触发的GET请求和POST请求。浏览器始终允许这种跨域请求,因此它们认为服务器设计时考虑到了这种请求。但是,这并不包括例如由脚本添加的自定义标头的POSTS。(有关请求何时安全或不安全的精确定义,请参见Fetch规范。)

请查看我在这里的答案,了解CORS如何使用预检请求来维护与同源策略的向后兼容性的更多详细信息。


你知道现在的浏览器允许你进行跨域的POST/GET请求,但是如果服务器没有返回Access-Control-Allow-Origin: * 或 Access-Control-Allow-Origin: <origin>,那么你就无法查看响应内容了?我猜旧版本的浏览器,在CORS出现之前,可能允许你查看响应内容吧? 你知道在CORS出现之前,Chrome的最后一个版本是哪个吗?我想做个实验,看看是否能够查看跨域GET/POST的响应内容。 - undefined
2
@DavidKlempfner:不,早期的CORS浏览器不允许脚本查看跨域请求的响应。这基本上就是同源策略的定义。CORS严格来说是为了放宽限制,使之前无法实现的功能成为可能。 - undefined
我正在阅读https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS,它说:“这意味着使用这些API的Web应用程序只能请求来自加载该应用程序的同一来源的资源。”这不准确吗?请求仍然可以被发出/执行,只是你无法查看响应而已? - undefined
@DavidKlempfner MDN文章中的完整文本如下:“出于安全原因,浏览器限制了由脚本发起的跨域HTTP请求。例如,XMLHttpRequest和Fetch API遵循同源策略。这意味着使用这些API的Web应用程序只能从加载应用程序的同一来源请求资源,除非来自其他来源的响应包含正确的CORS标头。” — 这是准确的。 - undefined
@DavidKlempfner:这取决于请求的类型。对于“简单”的GETPOST,请求将被发送,但是脚本无法在没有正确的CORS响应头的情况下读取响应。对于其他类型的请求,除非服务器通过预检机制首先选择加入,否则请求本身将不会被发送。链接到的同源策略页面详细描述了此问题。 - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接