CORS(Cross-Origin Resource Sharing,跨源资源共享)

126 阅读3分钟

CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种安全机制,用于限制一个源(origin)上的网页脚本如何与另一个源上的资源进行交互。这是为了防止恶意网站从另一个不同的源获取或设置数据,即所谓的跨站请求伪造(CSRF)攻击。

CORS的基本原理

当一个Web应用尝试从不同于自身来源的URL请求数据时,浏览器的安全策略会阻止这种请求,除非服务器明确允许这样做。CORS机制允许服务器指定哪些源可以访问其资源。

CORS响应头

为了支持CORS,服务器需要在其HTTP响应中包含特定的头部信息。以下是几个关键的CORS响应头:

  • Access-Control-Allow-Origin:指定了哪些源可以访问资源。它可以是一个具体的源(例如http://example.com),也可以是通配符*,表示任何源都可以访问。
  • Access-Control-Allow-Methods:指定了客户端可以使用的HTTP方法列表。
  • Access-Control-Allow-Headers:指定了客户端可以在请求中发送的自定义头部字段。
  • Access-Control-Allow-Credentials:如果设置为true,则允许请求携带身份认证信息(如cookies、HTTP认证信息)。
  • Access-Control-Max-Age:预检请求的有效期,单位为秒。在此期间,相同的请求不需要再次发送预检请求。

CORS请求类型

CORS请求分为简单请求(Simple Request)和预检请求(Preflight Request)。

简单请求

当请求满足以下条件时,被认为是简单请求:

  • 请求方法是GETHEAD 或者 POST
  • 如果是POST请求,那么Content-Type的值仅限于以下几个类型:application/x-www-form-urlencodedmultipart/form-datatext/plain
  • 请求头限于以下几种:AcceptAccept-LanguageContent-Language,以及任何不包含自定义头部字段的Content-Type

预检请求

对于不满足简单请求条件的请求,浏览器会先发送一个OPTIONS请求(预检请求)来确认服务器是否允许实际的请求。预检请求包含了实际请求的信息,比如请求方法和请求头。

示例代码

下面是一个简单的示例,展示如何在服务器端设置CORS响应头:

Node.js 使用Express框架设置CORS

const express = require('express');
const app = express();

app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*"); // 或者指定某个源
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  res.header("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
  next();
});

app.get('/api/data', (req, res) => {
  res.json({ message: 'Here is the data.' });
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

处理CORS错误

当遇到CORS相关的错误时,常见的解决办法包括检查服务器端的响应头设置是否正确,以及确保请求的源(origin)被服务器所接受。如果是在开发环境中遇到问题,可以考虑使用代理服务器来绕过浏览器的同源策略。

希望这些信息对你理解CORS有所帮助!如果有具体的技术问题或需要进一步的帮助,请随时提问。