CORS (跨来源资源共享)安全功能
跨来源资源共享 (CORS) 是开放互联网的重要组成部分。换言之,没有CORS的支持,任何互联网框架都不会是完整的。
参考蒙梭·侯赛因的html5rocks.com introduces CORS very effectively教学内容:
互联网服务接口API就好像编织这张大网用的丝和线一样,但是使用过程中资源跨域传输可能会有些困难,特别是这些跨域请求受限于如 JSON-P 或者设置代理服务器等技术 —— JSON-P有安全隐患,而代理服务器的设置和维护会比较复杂。
跨来源资源共享(CORS)是一个W3C标准,允许从浏览器进行跨域访问,在XMLHttpRequest基础上实现。该标准允许程序员处理资源时,采用与同区域请求相同的方式。
CORS的使用方法很简单。假设网站“张三.com”有一些数据需要“李四.com”获取,那么传统方式下受限于浏览器的“会话目标网站的唯一性限制”,这种方式是不可能被允许的。但是,如果有了CORS的支持,“张三.com”可以增加一些特殊的响应头数据,以允许“李四.com”进行访问。
如本示范内容所示,CORS支持需要服务器和客户端之间协同。如果您是前端工程师则不需要理会这些细节。本文剩下的内容是展示客户机如何实现跨来源请求,并且服务器如何进行配置以支持CORS。
Perfect 会话 模块包括了CORS配置支持,使得您的服务函数接口API可以根据需要允许或者禁止此类资源共享。
如果您的工程软件配置文件 Package.Swift 包括了 Perfect Sessions 会话管理,或者任何带有数据源驱动的应用实现,则您的工程已经包括CORS支持;但是请注意,默认情况下该支持处于 关闭 状态。
相关例子
配置
// 总开关;默认为关闭。 SessionConfig.CORS.enabled = true // 允许进行跨来源资源共享的主机清单。 // 如果希望不限制任何主机访问,则只需要保留一个通配符元素“*”即可。 SessionConfig.CORS.acceptableHostnames = ["*"] // 否则如果需要追加特定域名 SessionConfig.CORS.acceptableHostnames.append("http://www.test-cors.org") // 在域名中的开始和结束可以使用通配符 SessionConfig.CORS.acceptableHostnames.append("*.example.com") SessionConfig.CORS.acceptableHostnames.append("http://www.domain.*") // 允许使用的方法列表 public var methods: [HTTPMethod] = [.get, .post, .put] // 允许的自定义头数据 public var customHeaders = [String]() // Access-Control-Allow-Credentials 是否允许访问机密信息 // 默认情况下标准 CORS 请求不会发送或者设置任何cookies。 // 如果希望允许在跨域请求中使用cookies,则请将此处设置为真。 public var withCredentials = false // 内容缓冲时限,单位时秒 // 默认为0,也就是关闭内容缓冲 public var maxAge = 3600
当一个 CORS 请求发到服务器后,如果选项配置不匹配任何允许的主机,则该配置会提醒浏览器不要接受这种资源。
如果服务器决定产生 CORS 头数据,则下列头数据会追加到响应内容:
// 允许的 HTTP 方法。 // 由上述配置数组生成的内容: Access-Control-Allow-Methods: GET, POST, PUT // 如果来源是被认可的,则来源会被自动回应给请求者 // (即使配置为通配符 *) Access-Control-Allow-Origin: http://www.test-cors.org // 如果服务器允许cookies Access-Control-Allow-Credentials: true // 允许在服务器上设置缓冲(有效期为1个小时) Access-Control-Max-Age: 3600
可以参考以下工具来验证 CORS 冠名和响应结果http://www.test-cors.org