腾讯一面:CORS为什么能保障安全?为什么只对复杂请求做预检?

腾讯一面:CORS为什么能保障安全?为什么只对复杂请求做预检?
最新回答
我不会写诗

2022-03-26 14:31:02

CORS为什么能保障安全?为什么只对复杂请求做预检?

CORS为什么能保障安全?

CORS(跨域资源共享)通过一系列机制来保障安全,主要目的是防止CSRF(跨站请求伪造)攻击。CSRF攻击的基本流程是:用户在登录了受害网站后,浏览器会保存用户的身份凭证(如cookie)。如果用户随后在同一浏览器中访问了黑客网站,黑客网站可以发起一个跨域请求到受害网站,浏览器会自动带上用户的身份凭证,导致受害网站服务器误以为是用户自己发起的请求,从而执行恶意操作。

CORS策略的心智模型是:所有跨域请求都是不安全的,浏览器需要带上请求的来源(origin)给服务器检验。服务器通过检查请求的来源,可以决定是否允许该跨域请求。如果请求的来源不在服务器的允许列表中,服务器可以拒绝该请求,从而防止CSRF攻击。

具体来说,CORS通过以下方式保障安全:

  • 请求带上来源:浏览器在发起跨域请求时,会自动在请求头中添加Origin字段,标识请求的来源。服务器可以通过检查这个字段来判断请求是否合法。
  • 响应头控制:服务器在响应跨域请求时,可以通过设置CORS响应头(如Access-Control-Allow-Origin)来指定允许哪些来源的请求。如果请求的来源不在允许的列表中,浏览器会拦截该请求的响应,从而防止CSRF攻击。

因此,CORS能保障安全的核心在于:通过请求带上来源和响应头控制,服务器可以验证请求的合法性,防止CSRF攻击。

为什么只对复杂请求做预检?

CORS将跨域请求分为简单请求和复杂请求两类,划分的依据是请求是否会产生副作用(即对服务器资源做出修改)。简单请求通常不会对服务器资源做出修改,而复杂请求则可能会。

对于简单请求,浏览器只会在请求头中添加Origin字段,然后直接发送请求到服务器。服务器在收到请求后,会检查请求的来源,并根据CORS策略决定是否允许该请求。如果允许,服务器会在响应头中添加相应的CORS响应头,浏览器会放行该请求的响应。

然而,对于复杂请求,由于可能会产生副作用,浏览器在发送真正请求之前,会先发送一个预检请求(OPTIONS请求)到服务器。预检请求中不包含请求体,但会包含请求的方法、头信息等。服务器在收到预检请求后,会根据CORS策略检查请求的方法和头信息是否合法。如果合法,服务器会在响应头中添加相应的CORS响应头,并允许浏览器发送真正的请求。如果不合法,服务器会拒绝预检请求,浏览器也不会发送真正的请求。

这样做的原因在于:复杂请求可能会产生副作用,如果直接允许跨域请求,可能会对服务器资源造成不可预测的影响。通过预检机制,服务器可以在不执行实际请求的情况下,先检查请求的合法性,从而避免潜在的安全风险。

综上所述,CORS只对复杂请求做预检的原因在于:复杂请求可能会产生副作用,通过预检机制可以确保请求的合法性,避免对服务器资源造成危害。而简单请求通常不会对服务器资源做出修改,即使发出危害也不大,因此不需要进行预检。