关于cookie domain中的点前缀
今天同事遇到一個問題,大概描述如下:
瀏覽器已經接收指令,之前在一級域名下存儲了相關的信息。這里為了簡化問題,假設我們有兩個應用A和B,域名分別為:a.b.com和c.a.b.com。(顯然B是A的一個子域)。
上面的描述就是:在.b.com這個一級域名下,我們已經成功寫入了一個cookie,假設為:b=level1。
在正常用戶的瀏覽行為中,應用A會向自己的域下寫入a=level2(domain:a.b.com)。
在A正常的頁面中,有些場景會有異步的請求發出到B應用的頁面(用于獲取數據),合理的一種想法是: 發送到B應用的請求,應該攜帶著上面的b=level1,a=level2這兩個cookie信息到B應用的服務器去才對。但是,實際的情況是,b=level1被如愿攜帶上來,但是a=level2這個信息卻被丟棄了!(確切的說是沒有跟著request一起被發送到B的服務端)。
為啥?在訪問子域應用時,不是父域名下的cookie都應該被攜帶上來嗎?就像上面的b=level1那樣?
其實,關于這點,在cookie的RFC規范中,并沒有太明顯的說明,至少我沒有看到,即使又看了一遍RFC6265中關于Domain Matching的描述也是如此。
但實際的使用過程中,某個域下的cookie如果希望能夠被他的子域具有可見性(即可以讀取),必須要注意的一點是,應該保證這個cookie在被Set的時候,應該以"."開頭。回到上面的例子,之所以a=level2這個cookie沒有在用戶瀏覽器請求B應用時被攜帶到B的server端,就是因為a=level2這個cookie的domain不是.a.b.com,而是a.b.com。
事實上,上面例子中的A應用,在向自己的域名下寫入a=level2這個cookie時,壓根就沒有顯式的設置domain這個屬性,這樣一來,瀏覽器接受到這個Set Cookie的請求時,就會以默認以當前應用的域名作為cookie的domain。(不過據說某些版本的Firefox到是會自作聰明的在當前域名的前面自動加上一個點,這個待驗證!)
這一個小點的區別,還是很容易被忽略的,不過產生的瀏覽行為還是有細微差別的。(涉及到cookie是否上傳,是否占用網絡流量等)
PS:關于上面說到的那個問題,stackoverflow上的這個有個截圖,看著說明就直觀很多了。
總結
以上是生活随笔為你收集整理的关于cookie domain中的点前缀的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正确使用cookie中的domain
- 下一篇: 解决IE10以下对象不支持“bind“属