为何默认CORS模式下浏览器未省略Authorization请求头?
你遇到的核心误解是:CORS的credentials选项控制的是浏览器自动注入的凭证,而非开发者手动添加的请求头。
1. credentials: omit的实际作用
credentials: omit(默认模式)的规则是:浏览器不会自动发送用户代理层面的凭证,比如:
- 自动携带的Cookie
- 浏览器弹窗提示后输入的HTTP Basic Auth凭证
- TLS客户端证书
但它不会阻止开发者手动在请求头中添加的Authorization头——只要该请求头通过了预检请求的校验(你的后端设置了allowedHeaders = {"authorization"},所以预检通过),浏览器就会正常发送这个手动设置的头。
2. 关于mode: no-cors的行为
当设置mode: no-cors时,浏览器会强制请求遵循「简单跨域请求」规则,只允许发送简单请求头(包括Accept、Accept-Language、Content-Language、Content-Type等)。Authorization不属于简单请求头,所以会被浏览器自动移除,这是符合规则的。
3. credentials: include时被拦截的原因
当设置credentials: include时,浏览器会认为这是一个带凭证的跨域请求,此时要求后端的Access-Control-Allow-Origin不能是通配符*——而你的后端正好设置了origins = "*",所以浏览器触发了CORS拦截,这完全符合你已知的CORS核心规则。
验证方法
如果想测试credentials: omit是否真的会省略自动凭证,可以做以下操作:
- 在后端设置需要验证Cookie的接口
- 在前端不手动设置任何头,而是先在同域下设置Cookie,再发起跨域请求
- 此时
credentials: omit模式下,Cookie不会被携带;credentials: include模式下才会携带(同时需要后端修改Access-Control-Allow-Origin为具体域名并设置Access-Control-Allow-Credentials = true)
内容的提问来源于stack exchange,提问作者egimaben
相关产品推荐
相关产品推荐

