华为云APIG跨域资源共享方案


 

## 浏览器的同源策略

浏览器的同源策略是一种安全机制,旨在保护用户的信息安全和隐私。它限制了一个网页的脚本只能与来自同一源的资源进行交互,即同源策略要求页面中加载的所有资源(包括脚本、样式表、图片等)必须来自相同的**域名、协议、端口**。

同源策略的存在是基于以下安全考虑:

* 保护用户隐私: 同源策略防止来自不同源的脚本获取用户敏感信息,比如 Cookie、LocalStorage 和 SessionStorage 等。

* 防止跨站请求伪造(CSRF): 如果不限制跨域请求,恶意网站就可以利用用户的登录状态发起对其他网站的请求,从而导致 CSRF 攻击。

* 防止跨站脚本攻击(XSS): 同源策略可以防止恶意网站将恶意脚本注入到另一个域上的页面中,从而避免对用户的攻击。

* 保护服务器的数据安全: 同源策略可以保护服务器的数据不被其他域的恶意脚本盗取或篡改。

虽然同源策略在保护用户安全和隐私方面非常重要,但同时它也会对一些合法的跨域资源请求造成限制,这就需要使用 CORS 等机制来安全地实现跨域资源共享。


 

## 跨域资源共享

跨域资源共享(Cross-Origin Resource Sharing,简称CORS)是一种机制,允许在一个网页应用程序中请求来自另一个域的资源,即允许在一个域上使用其他域的资源。CORS的出现是为了解决网页应用程序对其他域资源的访问受到同源策略(Same-Origin Policy)限制的问题。

同源策略是浏览器安全模型的一部分,它限制了来自不同源(域、协议或端口)的页面之间的交互。这个策略的目的是防止恶意网站利用用户登录状态、cookie 等敏感信息。虽然这在安全上是有益的,但对于某些情况下需要跨域资源访问的网页应用程序来说,这会成为一个障碍。

跨域资源共享通过在服务器端添加一些特殊的 HTTP 头部,允许浏览器绕过同源策略的限制,从而允许跨域请求。通过配置 CORS,服务器可以告诉浏览器哪些源是被允许访问资源的,以及允许的 HTTP 方法。

主要原因包括:

* 分布式架构:现代网络应用程序通常采用分布式架构,可能需要从不同的服务器获取资源,而不仅限于同一个域。

* 共享资源:某些资源可能在不同的域上,并且需要被其他域的应用程序使用。例如,图像、视频或 API。

* 合作开发:跨域资源共享也可以促进不同团队之间的合作开发,允许他们在不同的域上进行开发并共享资源。

总的来说,CORS 是为了提高 Web 应用程序的灵活性和互操作性,同时仍然保持了足够的安全性。


 

## 和跨域资源共享相关的HTTP标头字段

跨源资源共享标准新增了一组 HTTP 标头字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。分为两类:响应头字段,请求头字段。

### 响应头字段

* Access-Control-Allow-Origin

语义:通知浏览器可以允许正式请求发向哪些源(origin)。

语法:

```shell

Access-Control-Allow-Origin: * # 通配符,允许所有源

Access-Control-Allow-Origin: <origin> # 只能为单个源,不能为多个

Access-Control-Allow-Origin: null # 可以为null

```

* Access-Control-Allow-Methods

语义: preflight request(预检请求)的返回响应头字段,定义正式请求可以向跨域服务器发送哪些请求头方法

语法:

```shell

Access-Control-Allow-Methods: <method>, <method>, ... # 逗号隔开

```

* Access-Control-Allow-Headers

语义: preflight request(预检请求)的返回响应头字段,定义正式请求可以向跨域服务器发送哪些请求头字段

语法:

```shell

Access-Control-Allow-Headers: <header-name>[, <header-name>]* # 逗号隔开

Access-Control-Allow-Headers: * # 可以为通配符,支持正式请求传任何头字段

```

>

>tips: Accept、Accept-Language、Content-Language、Content-Type(只限于解析后的值为 application/x-www-form-urlencoded、multipart/form-data 或 text/plain 三种 MIME 类型),不需要在这个首部特意列出,默认会添加。

>

* Access-Control-Max-Age

语义:表示preflight request (预检请求)的返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息)可以被缓存多久

语法:

```shell

Access-Control-Max-Age: <delta-seconds> # 单位为秒

```

>

>tips: <delta-seconds>,根据浏览器版本不同,缓存时间不同,在 Firefox 中,上限是 24 小时 (即 86400 秒)。 在 Chromium v76 之前, 上限是 10 分钟(即 600 秒)。 从 Chromium v76 开始,上限是 2 小时(即 7200 秒)。 Chromium 同时规定了一个默认值 5 秒。 如果值为 -1,表示禁用缓存,则每次请求前都需要使用 OPTIONS 预检请求。

>

* Access-Control-Allow-Credentials

语义:用于在请求要求包含 credentials(Request.credentials 的值为 include)时,告知浏览器是否可以将对请求的响应暴露给前端 JavaScript 代码。 浏览器仅在响应标头 Access-Control-Allow-Credentials 的值为 true 的情况下将响应暴露给前端的 JavaScript 代码。

Credentials 可以是 cookies、authorization headers 或 TLS client certificates。

语法:

```shell

Access-Control-Allow-Credentials: true

```

>

>tips: 跨域后端响应的Access-Control-Allow-Credentials header 与前端请求的XHR 或 Fetch request中都要配置,浏览器才会允许正式请求携带credentials到跨域端

>

* Access-Control-Expose-Headers

语义: 如果跨域服务器设置返回该字段,正式请求会收到该响应字段,允许服务器指示哪些正式请求的响应标头可以暴露给浏览器中运行的js脚本

语法:

```shell

Access-Control-Expose-Headers: [<header-name>[, <header-name>]*] # 逗号分隔

Access-Control-Expose-Headers: * # 通配符,指示浏览器允许js脚本读取所有响应头

```

### 请求头字段

* Access-Control-Request-Headers

语义: preflight request(预检请求)中,用于通知服务器在正式请求中会采用哪些请求头。

语法:

```shell

Access-Control-Request-Headers: <header-name>, <header-name>, ...

```

* Access-Control-Request-Method

语义: preflight request(预检请求)中,用于通知服务器在正式请求中会采用哪种 HTTP 方法。因为预检请求所使用的方法总是 OPTIONS ,与实际请求所使用的方法不一样,所以这个请求头是必要的。

语法:

```shell

Access-Control-Request-Method: <method>

```

## 简单请求和非简单请求

浏览器跨域之前的请求可以分为**简单请求**和**非简单请求**两种,简单请求实现浏览器跨域仅需要一次request-response,非简单请求实现浏览器跨域需要两次request-response(含有预检请求的跨域请求都是非简单请求)

### 简单请求

满足如下两个条件

* 方法为 GET, HEAD, POST 其中一种,

* 除了被浏览器自动设置的请求头

Accept, Accept-Language, Content-Language, Content-Type(只允许如下三种:text/plain, multipart/form-data, application/x-www-form-urlencoded),Range(只允许简单的范围标头值 如 bytes=256- 或 bytes=127-255)

### 非简单请求

不满足简单请求的条件,都是非简单请求


 

## 演示

以华为云APIG提供的跨域资源共享方案为例,来展示实现跨域的细节,待补充



 

```js

var xhr = new XMLHttpRequest();

xhr.open('GET', 'https://example.com/api/data', true);

xhr.withCredentials = true; // withCredentials 标志设置为 true,从而向服务器发送 Cookies

// 发送请求

xhr.send();

// 处理响应

xhr.onload = function () {

if (xhr.status === 200) {

// 打印响应头

for (var key in xhr.getAllResponseHeaders()) {

console.log(key + ': ' + xhr.getResponseHeader(key));

}

// 打印响应体

console.log(xhr.responseText);

} else {

console.error('请求失败。 返回状态为 ' + xhr.status);

}

};

// 处理网络错误

xhr.onerror = function () {

console.error('网络错误');

};

```


 

##### 参考文档

[CORS官方文档](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS)

[华为云apig官方文档](https://support.huaweicloud.com/usermanual-apig/apig-ug-0002.html

)


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751620.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python之万花尺

1、使用模块 import sys, random, argparse import numpy as np import math import turtle import random from PIL import Image from datetime import datetime from math import gcd 依次使用pip下载即可 2、代码 import sys, random, argparse import numpy as np imp…

通俗易懂的Python循环讲解

循环用于重复执行一些程序块。从上一讲的选择结构&#xff0c;我们已经看到了如何用缩进来表示程序块的隶属关系。循环也会用到类似的写法。 for循环 for循环需要预先设定好循环的次数(n)&#xff0c;然后执行隶属于for的语句n次。 基本构造是 for 元素 in 序列: statemen…

【设计模式】Java 设计模式之装饰者模式(Decorator)

装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许用户通过在一个对象上动态地添加一些职责来增强其功能。这种模式将对象的核心职责与装饰功能分开&#xff0c;使得用户可以在运行时根据需要添加或删除装饰功能。 一、装饰者模式概…

进程间通信——匿名管道

匿名管道代码实现&#xff1a; #include <iostream> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/wait.h> #include <string> using namespace std; int main() {int fd[2…

云原生 IaaS 服务:构建下一代云计算基础设施

随着云计算技术的不断演进&#xff0c;云原生成为了现代应用开发和部署的主流趋势。在当今这个快速变化的数字化时代&#xff0c;企业越来越需要灵活、可伸缩、自动化的基础设施来支持他们的业务需求。而云原生 IaaS&#xff08;Infrastructure as a Service&#xff09;服务则…

python--scrapy 保存数据到 mongodb

第一步&#xff0c;settings.py添加 ITEM_PIPELINES {# scrapy_runklist.pipelines.ScrapyRunklistPipeline: 300,scrapy_runklist.pipelines.ScrapyWeiBoPipeline: 300, }# mongodb配置 MONGO_HOST "127.0.0.1" # 主机IP MONGO_PORT 27017 # 端口号 MONGO_DB …

2023蓝桥杯省赛真题分糖果 |枚举+DFS

题目链接&#xff1a; 2.分糖果 - 蓝桥云课 (lanqiao.cn) 说明&#xff1a; 虽然这道题并不是很难&#xff0c;思维上也不是特别难&#xff0c;数据小直接暴力就可以得到。但是还是需要注意一些细节&#xff0c;比如DFS的递归终止的条件的处理&#xff0c;当K>7的时候就要…

【TypeScript系列】声明合并

声明合并 介绍 TypeScript中有些独特的概念可以在类型层面上描述JavaScript对象的模型。 这其中尤其独特的一个例子是“声明合并”的概念。 理解了这个概念,将有助于操作现有的JavaScript代码。 同时,也会有助于理解更多高级抽象的概念。 对本文件来讲,“声明合并”是指编…

html--宠物

文章目录 htmljscss html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>CodePen - Spaceworm</title><script> window.requestAnimFrame (function() {return (window.requestAnimat…

程序员如何规划职业赛道?

在快速发展的信息技术时代&#xff0c;程序员作为数字世界的构建者&#xff0c;面临着前所未有的职业选择和发展机会。选择合适的职业赛道&#xff0c;不仅关乎个人职业发展的高度和速度&#xff0c;更影响着个人职业生涯的满意度和幸福感。本文将从自我评估与兴趣探索、市场需…

MySQL的启停登陆与退出

启动和停用MySQL服务 sudo /usr/local/mysql/support-files/mysql.server startsudo /usr/local/mysql/support-files/mysql.server stop登陆MySQL 1. mysql -uroot -p密码 2. mysql -h127.0.0.1 -uroot -p目标密码 3. mysql --host127.0.0.1 --userroot --password目标密码退…

[HDCTF 2023]enc

32位 这里后面运行这个程序居然要 Visual Studio&#xff0c;不然运行不了 IDA打开&#xff0c;直接锁定main函数 看见v9&#xff0c;四个32位&#xff0c;就想到了tea加密 、 标准tea from ctypes import * #tea def decrypt(v, k):v0 c_uint32(v[0])v1 c_uint32(v[1])…

代码随想录阅读笔记-字符串【反转字符串】

题目 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印…

未来已来:科技驱动的教育变革

我们的基础教育数百年来一成不变。学生们齐聚在一个物理空间&#xff0c;听老师现场授课。每节课时长和节奏几乎一致&#xff0c;严格按照课表进行。老师就像“讲台上的圣人”。这种模式千篇一律&#xff0c;并不适用于所有人。学生遇到不懂的问题&#xff0c;只能自己摸索或者…

Linux查看硬件型号详细信息

1.查看CPU &#xff08;1&#xff09;使用cat /proc/cpuinfo或lscpu &#xff08;2&#xff09;使用dmidecode -i processor Dmidecode 这款软件允许你在 Linux 系统下获取有关硬件方面的信息。Dmidecode 遵循 SMBIOS/DMI 标准&#xff0c;其输出的信息包括 BIOS、系统、主板、…

UE4_调试工具_绘制调试球体

学习笔记&#xff0c;仅供参考&#xff01; 效果&#xff1a; 步骤&#xff1a; 睁开眼睛就是该变量在此蓝图的实例上可公开编辑。 勾选效果&#xff1a;

【Linux】进程与可执行程序的关系fork创建子进程写实拷贝的理解

一、进程与可执行程序之间关系的理解 系统会将此时在系统运行的进程的各种属性都以文件的形式给你保存在系统的proc目录下。运行一个程序的时候&#xff0c;本质就是把磁盘中的程序拷贝到内存中&#xff0c;当一个进程运行起来的时候&#xff0c;它本质已经和磁盘中的可执行程序…

基于springboot和mysql实现的在线考试系统

1.项目介绍 一个在线考试系统&#xff0c;考生可以注册&#xff0c;成为本平台的一个用户&#xff0c;然后进行考试&#xff0c;考完生成成绩&#xff0c;同时用户可以查询自己考试的试卷&#xff0c;可以查看试卷解析。 升级改版 新增出卷人角色&#xff0c;主要职责是进入…

滴滴 Flink 指标系统的架构设计与实践

毫不夸张地说&#xff0c;Flink 指标是洞察 Flink 任务健康状况的关键工具&#xff0c;它们如同 Flink 任务的眼睛一般至关重要。简而言之&#xff0c;这些指标可以被理解为滴滴数据开发平台实时运维系统的数据图谱。在实时计算领域&#xff0c;Flink 指标扮演着举足轻重的角色…

【C++】了解一下编码

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. ASCII编码3. unicode4. GBK5. 类型转换 1. 前言 看到string里面还有Template instantiations&#xff1a; string其实是basic_string<char>&#xff0c;它还是一个模板。 再看看wstring&#xff1…