原文地址: github.com/yinxin630/b…
技術交流: fiora.suisuijiang.com/
這篇文章將解答以下疑問:
- 能設定或讀取子域的cookie嗎?
- 客戶端設定cookie與服務端設定cookie有什麼區別?
- 同域/跨域ajax請求到底會不會帶上cookie?
能設定或讀取子域的cookie嗎?
不行! 只能向當前域或者更高階域設定cookie
例如 client.com
不能向 a.client.com
設定cookie, 而 a.client.com
可以向 client.com
設定cookie
讀取cookie情況同上
客戶端設定cookie與服務端設定cookie有什麼區別?
無論是客戶端還是服務端, 都只能向自己的域或者更高階域設定cookie
例如 client.com
不能向 server.com
設定cookie, 同樣 server.com
也不能向 client.com
設定cookie
服務端可以設定 httpOnly: true
, 帶有該屬性的cookie客戶端無法讀取
客戶端只會帶上與請求同域的cookie, 例如 client.com/index.html
會帶上 client.com
的cookie,
server.com/app.js
會帶上 server.com
的cookie, 並且也會帶上httpOnly的cookie
但是, 如果是向服務端的ajax請求, 則不會帶上cookie, 詳情見第三個問題
同域/跨域ajax請求到底會不會帶上cookie?
這個問題與你發起ajax請求的方式有關
fetch在預設情況下, 不管是同域還是跨域ajax請求都不會帶上cookie, 只有當設定了 credentials
時才會帶上該ajax請求所在域的cookie, 服務端需要設定響應頭 Access-Control-Allow-Credentials: true
, 否則瀏覽器會因為安全限制而報錯, 拿不到響應
axios和jQuery在同域ajax請求時會帶上cookie, 跨域請求不會, 跨域請求需要設定 withCredentials
和服務端響應頭
fetch 設定 credentials
By default, fetch won't send or receive any cookies from the server, resulting in unauthenticated requests if the site relies on maintaining a user session (to send cookies, the credentials init option must be set). Since Aug 25, 2017. The spec changed the default credentials policy to same-origin. Firefox changed since 61.0b13.
使fetch帶上cookie
fetch(url, {
credentials: "include", // include, same-origin, omit
})
複製程式碼
- include: 跨域ajax帶上cookie
- same-origin: 僅同域ajax帶上cookie
- omit: 任何情況都不帶cookie
developer.mozilla.org/en-US/docs/…
axios 設定 withCredentials
//
withCredentials
indicates whether or not cross-site Access-Control requests, should be made using credentials // default: withCredentials: false
使axios帶上cookie
axios.get('http://server.com', {withCredentials: true})
複製程式碼
jQuery 設定 withCredentials
$.ajax({
method: 'get',
url: 'http://server.com',
xhrFields: {
withCredentials: true
}
})
複製程式碼