获取API;为什么要使用;没有cors“;如果响应是不透明的,则选择模式?

获取API;为什么要使用;没有cors“;如果响应是不透明的,则选择模式?,cors,fetch,fetch-api,Cors,Fetch,Fetch Api,我阅读和阅读。前者仅解释了“无cors”与“相同来源”的对比;后者建议“no cors”没有用处,因为响应不透明(Javascript无法读取/执行任何有用的操作): 基本上,你永远都不想在实践中使用“无cors”模式- 除了在一些非常有限的情况下。这是因为什么设置模式: “没有cors”实际上对浏览器说的是,“阻止我的前端 查看响应主体内容时使用的JavaScript代码 在大多数情况下,这是显而易见的 真的不是你想要的 有人能告诉在这些“有限情况”中,我们希望使用“无cors”(即使响应不透

我阅读和阅读。前者仅解释了“无cors”与“相同来源”的对比;后者建议“no cors”没有用处,因为响应不透明(Javascript无法读取/执行任何有用的操作):

基本上,你永远都不想在实践中使用“无cors”模式- 除了在一些非常有限的情况下。这是因为什么设置模式: “没有cors”实际上对浏览器说的是,“阻止我的前端 查看响应主体内容时使用的JavaScript代码 在大多数情况下,这是显而易见的 真的不是你想要的

有人能告诉在这些“有限情况”中,我们希望使用“无cors”(即使响应不透明)的例子是什么吗?

我能想到的唯一情况是一种单向沟通;如果客户端向服务器发送GET或POST就足够了,那么服务器就可以跟踪请求的发生;(例如,增加请求计数器)

…那么,响应为不透明响应就足够了;i、 e.客户端只需要知道请求是否成功(状态200),不需要任何有效负载响应


我的想法是一个有效的例子吗?有人能推荐“无cors”使用的其他可能性/用例/示例吗?

请记住,cors设置不会阻止请求到达服务器-这就是身份验证和CSRF的用途。相反,它会阻止页面读取响应。请求仍然是:

  • 从页面发送
  • 浏览器添加
    原点
    标题
  • 它仍然由服务器处理(通常情况下,CORS与此无关,尽管可能还有其他安全机制)
  • 当返回时,浏览器会检查响应标题中是否有
    访问控制允许源代码
    。如果它与浏览器认为的
    原点相匹配
    ,那么浏览器会让页面看到请求的结果
  • 这是关键-同源策略和CORS设置不允许协作浏览器中的页面看到响应

    注意还有一个步骤0。上面是一个选项“飞行前检查”,用于检查如果请求通过,页面是否可以看到结果?如果没有,那么他们认为发送请求没有什么意义——但这是一个假设

    现在来回答这个问题
    模式:没有COR执行两件事:

  • 它说我不需要看到结果
  • 所以它不发送飞行前的支票
  • 在我脑海中,我想我可以用它来做些什么(其中一些是邪恶的)
    • 我不需要看到响应的任何时候,比如日志记录、跟踪或黑客攻击;当前端代码本质上是
      try{const notNeeded=fetch(…)}catch{console.log('hough luck,doe notNeeded')}
    • 任何时候,我都希望通过不发送飞行前检查,尽可能快地将数据发送到服务器。当我真的需要数据的时候,我总是可以发送一个GET和CORS来读取数据
    提醒 CORS执行上述操作。它不会执行以下操作:

    • 阻止服务器处理请求-这就是身份验证和CSRF预防的目的
    • 停止欺骗源标题-这仅适用于协作浏览器。作为攻击者,您通常无法访问用户正在使用的浏览器。由于报头可以被伪造,服务器不应该为了安全而使用其中的数据。(这就是为什么在通过CURL/Postman/失眠等工具测试浏览器API时,需要检查CORS头是否通过,因为它们接受所有响应,并且从不应用CORS策略。)

    请参见第页的答案。主要情况是:(1)当您只想对资源进行缓存时,(2)当您想将资源用作文档中
    元素的内容时(这是因为这些元素允许跨源嵌入资源)。至于缓存的情况,如中所述,在实践中,适用于这种情况的场景是当您使用服务人员时,在这种情况下,相关的特定API是缓存存储API。谢谢;另一个答案很好,但您在这里的澄清/总结很有帮助且具体。跳过飞行前
    OPTION
    请求是一个显著的差异!感谢您指出这一点。