跳转到主要内容

标签(标签)

资源精选(342) Go开发(108) Go语言(103) Go(99) angular(82) LLM(75) 大语言模型(63) 人工智能(53) 前端开发(50) LangChain(43) golang(43) 机器学习(39) Go工程师(38) Go程序员(38) Go开发者(36) React(33) Go基础(29) Python(24) Vue(22) Web开发(20) Web技术(19) 精选资源(19) 深度学习(19) Java(18) ChatGTP(17) Cookie(16) android(16) 前端框架(13) JavaScript(13) Next.js(12) 安卓(11) typescript(10) 资料精选(10) NLP(10) 第三方Cookie(9) Redwoodjs(9) LLMOps(9) Go语言中级开发(9) 自然语言处理(9) 聊天机器人(9) PostgreSQL(9) 区块链(9) mlops(9) 安全(9) 全栈开发(8) ChatGPT(8) OpenAI(8) Linux(8) AI(8) GraphQL(8) iOS(8) 软件架构(7) Go语言高级开发(7) AWS(7) C++(7) 数据科学(7) whisper(6) Prisma(6) 隐私保护(6) RAG(6) JSON(6) DevOps(6) 数据可视化(6) wasm(6) 计算机视觉(6) 算法(6) Rust(6) 微服务(6) 隐私沙盒(5) FedCM(5) 语音识别(5) Angular开发(5) 快速应用开发(5) 提示工程(5) Agent(5) LLaMA(5) 低代码开发(5) Go测试(5) gorm(5) REST API(5) 推荐系统(5) WebAssembly(5) GameDev(5) CMS(5) CSS(5) machine-learning(5) 机器人(5) 游戏开发(5) Blockchain(5) Web安全(5) Kotlin(5) 低代码平台(5) 机器学习资源(5) Go资源(5) Nodejs(5) PHP(5) Swift(5) 智能体(4) devin(4) Blitz(4) javascript框架(4) Redwood(4) GDPR(4) 生成式人工智能(4) Angular16(4) Alpaca(4) SAML(4) JWT(4) JSON处理(4) Go并发(4) kafka(4) 移动开发(4) 移动应用(4) security(4) 隐私(4) spring-boot(4) 物联网(4) nextjs(4) 网络安全(4) API(4) Ruby(4) 信息安全(4) flutter(4) 专家智能体(3) Chrome(3) CHIPS(3) 3PC(3) SSE(3) 人工智能软件工程师(3) LLM Agent(3) Remix(3) Ubuntu(3) GPT4All(3) 软件开发(3) 问答系统(3) 开发工具(3) 最佳实践(3) RxJS(3) SSR(3) Node.js(3) Dolly(3) 移动应用开发(3) 编程语言(3) 低代码(3) IAM(3) Web框架(3) CORS(3) 基准测试(3) Go语言数据库开发(3) Oauth2(3) 并发(3) 主题(3) Theme(3) earth(3) nginx(3) 软件工程(3) azure(3) keycloak(3) 生产力工具(3) gpt3(3) 工作流(3) C(3) jupyter(3) 认证(3) prometheus(3) GAN(3) Spring(3) 逆向工程(3) 应用安全(3) Docker(3) Django(3) R(3) .NET(3) 大数据(3) Hacking(3) 渗透测试(3) C++资源(3) Mac(3) 微信小程序(3) Python资源(3) JHipster(3) 大型语言模型(2) 语言模型(2) 可穿戴设备(2) JDK(2) SQL(2) Apache(2) Hashicorp Vault(2) Spring Cloud Vault(2) Go语言Web开发(2) Go测试工程师(2) WebSocket(2) 容器化(2) AES(2) 加密(2) 输入验证(2) ORM(2) Fiber(2) Postgres(2) Gorilla Mux(2) Go数据库开发(2) 模块(2) 泛型(2) 指针(2) HTTP(2) PostgreSQL开发(2) Vault(2) K8s(2) Spring boot(2) R语言(2) 深度学习资源(2) 半监督学习(2) semi-supervised-learning(2) architecture(2) 普罗米修斯(2) 嵌入模型(2) productivity(2) 编码(2) Qt(2) 前端(2) Rust语言(2) NeRF(2) 神经辐射场(2) 元宇宙(2) CPP(2) 数据分析(2) spark(2) 流处理(2) Ionic(2) 人体姿势估计(2) human-pose-estimation(2) 视频处理(2) deep-learning(2) kotlin语言(2) kotlin开发(2) burp(2) Chatbot(2) npm(2) quantum(2) OCR(2) 游戏(2) game(2) 内容管理系统(2) MySQL(2) python-books(2) pentest(2) opengl(2) IDE(2) 漏洞赏金(2) Web(2) 知识图谱(2) PyTorch(2) 数据库(2) reverse-engineering(2) 数据工程(2) swift开发(2) rest(2) robotics(2) ios-animation(2) 知识蒸馏(2) 安卓开发(2) nestjs(2) solidity(2) 爬虫(2) 面试(2) 容器(2) C++精选(2) 人工智能资源(2) Machine Learning(2) 备忘单(2) 编程书籍(2) angular资源(2) 速查表(2) cheatsheets(2) SecOps(2) mlops资源(2) R资源(2) DDD(2) 架构设计模式(2) 量化(2) Hacking资源(2) 强化学习(2) flask(2) 设计(2) 性能(2) Sysadmin(2) 系统管理员(2) Java资源(2) 机器学习精选(2) android资源(2) android-UI(2) Mac资源(2) iOS资源(2) Vue资源(2) flutter资源(2) JavaScript精选(2) JavaScript资源(2) Rust开发(2) deeplearning(2) RAD(2)

category

浏览器的同源策略阻止从不同的源读取资源。这种机制阻止恶意网站读取其他网站的数据,但也阻止合法使用。

现代web应用程序通常希望从不同的来源获取资源,例如,从不同的域检索JSON数据,或将另一个网站的图像加载到<canvas>元素中。这些可以是公共资源,任何人都可以阅读,但同源政策阻止了它们的使用。开发人员历来使用诸如JSONP之类的变通方法。

跨来源资源共享(CORS)以标准化的方式解决了这个问题。启用CORS可以让服务器告诉浏览器它可以使用一个额外的原点。

资源请求是如何在网络上工作的?


请求和响应
图示客户端请求和服务器响应。
浏览器和服务器可以使用超文本传输协议(HTTP)在网络上交换数据。HTTP定义了请求者和响应者之间的通信规则,包括获取资源所需的信息。

HTTP头协商客户端和服务器之间的消息交换,并用于确定访问权限。浏览器的请求和服务器的响应消息都分为头和正文。

头信息


有关消息的信息,例如消息的类型或消息的编码。报头可以包括表示为键值对的各种信息。请求标头和响应标头包含不同的信息。

示例请求标头

Accept: text/html
Cookie: Version=1


这个标题相当于说“我想接收HTML作为响应。这是我的一个cookie。”

样本响应标头

Content-Encoding: gzip
Cache-Control: no-store


这个头相当于说“这个响应中的数据是用gzip编码的。不要缓存这个。”

注意:标题不能包含注释。


身体


信息本身。这可以是纯文本、图像二进制、JSON、HTML或许多其他格式。

CORS是如何工作的?


同源策略告诉浏览器阻止交叉源请求。当您需要来自不同来源的公共资源时,资源提供服务器告诉浏览器发送请求的来源可以访问其资源。浏览器会记住这一点,并允许该资源的跨来源资源共享。

步骤1:客户端(浏览器)请求


当浏览器发出跨原点请求时,浏览器会添加一个具有当前Origin 方案、主机和端口)的Origin 标头。

步骤2:服务器响应


当服务器看到此标头并希望允许访问时,它会将Access-Control-Allow-Origin标头添加到指定请求来源的响应中(或*以允许任何来源)

步骤3:浏览器接收响应


当浏览器看到此响应带有适当的Access-Control-Allow-Origin标头时,它会与客户端站点共享响应数据。

与CORS共享凭据


出于隐私原因,CORS通常用于匿名请求(anonymous requests),其中请求者没有被识别。如果你想在使用CORS时发送cookie,它可以识别发送者,你需要在请求和响应中添加额外的头。

请求


将凭据:“include”添加到提取选项中,如下例所示。这包括带有以下请求的cookie:

fetch('https://example.com', {
  mode: 'cors',
  credentials: 'include'
})


应答


Access-Control-Allow-Origin必须设置为特定来源(不使用通配符*),并且访问控制允许凭据必须设置为true。

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true


复杂HTTP调用的预处理请求


当web应用程序发出复杂的HTTP请求时,浏览器会在请求链的开头添加一个飞行前请求。

CORS规范对复杂请求的定义如下:

  • 使用GET、POST或HEAD以外的方法的请求。
  • 包含Accept、Accept Language或Content Language以外的标头的请求。
  • 具有内容类型标头而非application/x-www-form-urlencoded、multipart/form-data或text/plain的请求。


浏览器会自动创建任何必要的飞行前请求,并在实际请求消息之前发送。飞行前请求是OPTIONS请求,如以下示例所示:

OPTIONS /data HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: DELETE


在服务器端,接收请求的应用程序用有关应用程序从该来源接受的方法的信息来响应飞行前请求:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, DELETE, HEAD, OPTIONS


服务器响应还可以包括Access Control Max Age标头,以指定缓存飞行前结果的持续时间(以秒为单位)。这允许客户端发送多个复杂的请求,而无需重复飞行前请求。

文章链接