fetch中{credentials: 'include'}的作用及跨域请求Cookie发送规则问询
一、{credentials: 'include'}的作用
咱们先把这个配置的作用掰扯清楚:
- 默认情况下,fetch发起跨域请求时,是不会携带任何凭证信息的——这里的凭证包括Cookie、HTTP认证信息(比如Basic Auth的账号密码),还有客户端SSL证书这类。
- 如果你设置了
credentials: 'include',那不管是同域还是跨域请求,都会把符合规则的凭证信息一起发送给目标服务器;同时,也允许接收服务器返回的Cookie(不过这里有个关键前提:服务器必须在响应头里设置Access-Control-Allow-Credentials: true,而且Access-Control-Allow-Origin不能设为*,得指定具体的请求源,不然浏览器会直接拦截这个响应,不让你的代码拿到结果)。 - 补充下,fetch还有另外两个可选值:
'same-origin'(默认值,只有同域请求才带凭证)和'omit'(不管同域还是跨域都不带凭证)。
二、跨域请求时的Cookie发送逻辑
你问的从site.com向other.com发起跨域请求时,Cookie的发送规则其实很清晰:
- 浏览器只会把属于目标域(也就是
other.com)的Cookie发送给other.com的服务器——这些Cookie是之前other.com在用户访问时设置的,并且符合Cookie的domain和path规则(比如Cookie的domain是other.com或者其子域,路径也匹配当前请求的路径)。 site.com自己的Cookie绝对不会被发送到other.com,这是浏览器的Cookie同源策略在起作用,目的是保护用户的隐私和安全,防止A域的Cookie被意外发送到B域。
举个简单例子:假设你之前访问过other.com,它给你设置了一个名为user_session的Cookie,domain是other.com。当你在site.com的页面用带credentials: 'include'的fetch请求other.com的API时,这个user_sessionCookie就会被带上;而site.com自己的Cookie(比如site_auth)则会留在浏览器里,不会被发送出去。
内容的提问来源于stack exchange,提问作者haloboy777
相关产品推荐
相关产品推荐

