分享一個關於Cookie做的實驗結果

豐臣正一發表於2020-08-24

實驗本身是很枯燥的,我儘量把它講的有趣些。

起因

去網上搜了下關於Cookie的介紹,看了好幾篇都長得很一樣,閹割一下內容不外乎說是"不同瀏覽器限制cookie數不同,大致在30-50這個範圍,(字首)瀏覽器允許Cookie多達4KB左右,包括名、值、等號"。

我還在上學那會兒,包括後面畢業後工作一段時間,我也沒有特別去關注過這個話題,基本上如果面試官問到我了,也就把網上知道的這些講了一下。

今年的遭遇給了我思考的時間特別多,最近我又重新去仔細讀了下樓上那句話,我發現我讀不懂了,第一個,我看的資料並不是特別權威的,也都是網上的部落格帖子,對瀏覽器限制30-50個這個範圍產生了一個質疑,是真的嗎?第二個是允許多達4KB左右,就很迷糊,到底是一個域名下所有的Cookie加起來的值是4KB左右,還是說單獨的Cookie的一個Name所表示的資訊它可以是4KB左右,這讓我很迷啊。

行,那我們接下來就做個關於Cookie的實驗,去驗證一些東西。

因為這只是一個實驗,所有這裡筆者不會講Cookie的使用和作用以及其他介紹。大致理一下,我們要驗證的一些點如下:

  • 單個域名下瀏覽器Cookie限制個數為多少?
  • 瀏覽器Cookie單個Value值可以允許多大?

經過

建模

在開始實驗之前,我們先建個模型,大致這個實驗它要怎麼展開,上圖。

起初筆者是提供了一個手動擋的模型,你可以試著輸入name和value,然後點選按鈕Add Cookie,它就會把這條記錄寫到Cookie裡面,為了便於對照,筆者又讀取了cookie的資訊同步了一份到網頁上,看著直觀點。由於我們要記錄Cookie數,這裡筆者簡單粗暴地把它設定在網頁可視內容的右上角,那個冒紅的地方。再後來筆者想偷點懶,就實現了一個隨機生成Cookie的手動擋模型Add Random Cookie。後續的所有實驗結果也都是在這個基礎上得出來的。

寫好程式後,筆者首先在Chrome最新版瀏覽器測試了下。發現的規律是,當Cookie的個數達到180個後,再增加就會降到150個,就是說180是它的上限,到了以後它自動清掉了30個選手。

這裡有個問題是,筆者當時也是直接隨機了兩次分別塞到name和value上面。通過觀察,我們很難發現到達上限以後它刪除的規律是怎麼樣的,是刪除最前面的30個,還是後面的30個,還是隨機的呢?

好,我們改一下,我們的肉眼對數字會敏感一些,那我們就把它的value全部換成數字去看看。

可以看到它是刪除了最前面的30個cookie記錄。

筆者在自己的手機裡,通過開啟小米內建瀏覽器的結果也是和這個一樣的。

接下來我們測下在火狐瀏覽器的情況,筆者電腦上火狐瀏覽器的版本還是比較低的,沒有升級到最新版,因為48.0.2這個版本它可以直接手動安裝一些xpi外掛,筆者就是在這個版本安裝上了firebug和一起其他外掛。

通過觀察,我們可以看到,在火狐瀏覽器中,它的規律是當cookie的個數達到150個以後,它會刪除最開始的Cookie,空出位置留個新新增的Cookie,它的上限是150個,後續再新增一個Cookie記錄就刪除最前面的cookie記錄空出位置留給後面新增的。

到這裡,筆者將相關的Cookie資訊整理成檔案,隨機兩個的結果是6KB左右,隨機一個加阿拉伯的結果是3KB左右。看到這裡,我們猜也能猜到了,最開始說的4KB限制,應該是指Cookie設定的一條記錄。

當然,我們學理科是很嚴謹的,我們通過實驗去看看結果吧。

筆者寫了個測試程式,經過測試,在Chrome瀏覽器端的條件下發現,大約是4KB的樣子。

結果

結論

因為瀏覽器的種類和版本都很多,所有在寫結果之前,筆者會在前面加上“在一定條件下”。看著像句屁話,但它真的很有用,給你後面的話加了一條保險槓的效果。就好比文科作文寫“XXX萬歲”。

在一定條件下,基於Webkit核心的瀏覽器,Cookie呈現如下規律,當單個域名下Cookie數到達180個的時候,再次新增會刪除最開始的30個Cookie里路,然後從150的基數依次往上增加直至180個後,瀏覽器會迴圈前面的操作。

在一定條件下,基於gecko核心的瀏覽器,Cookie呈現如下規律,當單個域名下Cookie數到達150個後,再次新增它會刪除最前面的Cookie記錄以騰出位置給新增的Cookie記錄。

在一定條件下,Cookie單條記錄的Value值允許大小近似於4KB。

最後

最後,附上實驗相關地址:https://zhengjiangtao.cn/show/zj/cookie.html

有興趣的同學也可以看下我打基礎寫的其他網頁,它的專案地址是:https://zhengjiangtao.cn/show

知識共享許可協議
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

相關文章