cors 的基本概念
CORS(Cross-Origin Resource Sharing,跨域资源共享)是一种用于让浏览器绕过同源策略限制,实现跨域访问资源的机制。在浏览器端,JavaScript 的跨域请求必须要经过浏览器的同源策略限制,即只能向同一域名下的服务器发送请求,而不能向其它域名的服务器发送请求。CORS 提供了一种通过在服务端设置响应头的方式来实现浏览器端跨域请求的机制。
基本概念有哪些?
-
预检请求(Preflight Request):在实际请求之前,浏览器会发送一个预检请求OPTIONS,来确认服务端是否接受实际请求。
-
简单请求(Simple Request):满足以下条件的请求为简单请求:请求方法为GET、HEAD或POST;HTTP头信息不超出Accept、Accept-Language、Content-Language、Content-Type、Last-Event-ID、DPR、Save-Data、Viewport-Width、Width;Content-Type的值仅限于text/plain、multipart/form-data、application/x-www-form-urlencoded。
-
非简单请求(Non-simple Request):不满足简单请求条件的请求。
-
CORS安全规则(CORS Safelisting Rules):指的是CORS中服务端响应的Access-Control-Allow-Origin,指定是否允许跨域请求的源。
-
withCredentials:指的是XMLHttpRequest中的一个属性,用于在请求中携带cookie信息。
-
暴露Header(Exposed Headers):在CORS响应中,Access-Control-Expose-Headers头用于暴露哪些响应头给客户端使用。
-
存储 Cookies(Cookie Storage):跨域请求中,浏览器默认不会发送cookie信息,需要在服务端设置Access-Control-Allow-Credentials和客户端设置withCredentials为true才能实现。
-
跨域请求中的安全问题(CORS Security Issues):CORS的出现,引入了一些安全问题,例如CSRF、XSS等,需要在开发中做好防范措施。
如何实现跨域请求?
在 HTTP 请求中,使用了 CORS 标准头部来告诉浏览器该请求是跨域请求,并且在服务端设置 Access-Control-Allow-Origin 头部来允许指定的域名访问资源。
客户端 CORS 标准头部有以下几个:
- Origin:表示请求来自哪个域名。
- Access-Control-Request-Method:表示请求的方法类型(比如 GET、POST 等)。
- Access-Control-Request-Headers:表示请求头中的额外信息(比如 Content-Type 等)。
服务端返回的响应头部有以下几个:
- Access-Control-Allow-Origin:表示允许的域名访问该资源,可以设置为 * 表示任何域名都可以访问。
- Access-Control-Allow-Credentials:表示是否允许浏览器携带 Cookie 和认证信息等,默认为 false。
- Access-Control-Allow-Methods:表示允许的请求方法类型。
- Access-Control-Allow-Headers:表示允许的请求头中的额外信息。
通过在服务端设置这些头部,可以实现跨域请求的授权和安全验证。
预检请求 作用是啥?
预检请求(Preflight Request)是CORS中的一种特殊请求,主要用于在实际请求之前,增加一次HTTP查询请求,以检查实际请求是否可以被服务器接受。
在CORS中,有些HTTP请求是简单请求(Simple Request),比如GET和POST请求,可以直接发送。而对于一些复杂请求,比如请求方法为PUT、DELETE、PATCH等,或者Content-Type类型为application/json、application/xml等,会在发送真正请求之前,增加一次HTTP查询请求,以便服务器能够知道是否允许该请求。这个查询请求就是预检请求,用来查询服务器是否支持该请求,并给出支持的条件。
预检请求中包含了一些额外的HTTP头信息,比如Origin、Access-Control-Request-Method、Access-Control-Request-Headers等,这些信息告诉服务器实际请求中会包含哪些信息,并请求服务器在实际请求中是否能够接受这些信息。
服务器接收到预检请求后,会根据请求头中的信息来判断是否允许实际请求。如果允许,会在响应头中加入一些额外的信息,比如Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等,告诉浏览器实际请求可以被接受。如果不允许,则不会发送实际请求,而是直接返回一个错误响应。
如何避免 cors 中的一些安全问题?
在CORS中有一些安全问题,例如CSRF(跨站点请求伪造)攻击和CORS劫持。以下是避免这些问题的一些方法:
-
CSRF攻击:使用CSRF令牌来验证请求,这样只有在正确的来源站点上发出的请求才会被视为有效请求。
-
CORS劫持:在响应中添加Access-Control-Allow-Origin标头,并设置为信任的站点。另外,也可以使用Content-Security-Policy标头来限制JavaScript的执行。
-
永远不要在CORS请求中使用敏感凭据(例如Cookie和HTTP身份验证信息)。
-
限制跨域请求的范围,只允许特定的来源站点。
-
在服务器上使用防火墙和其他安全措施来保护应用程序,例如SSL / TLS加密,HTTP Strict Transport Security(HSTS)等。
总之,应该采取适当的安全措施来防止CORS相关的安全问题。