原文地址:Browser cookie restrictions
我一直在為我接下來的一本書做一些關於cookie的研究,在這個過程中我碰到了一些關於浏覽器處理cookie的有意思的事情。我從尋找浏覽器允許每個域保存的cookie個數開始。這個結果很有趣:
- 微軟表示,Internet Explorer 8增加了每個域可以保存的cookie個數至50個,不過我發現IE7也允許每個域保存50個cookie。當然,這可能是因為一個系統補丁增加的,而不是這個浏覽器版本一開始就是這樣,但是仍然超過了通常認為是20個的限制。
- Firefox允許每個域保存50個cookie。
- Opera允許每個域保存50個cookie。
- Safari/WebKit是這其中最有趣的,因為它似乎沒有明顯的限制,一直到Safari 3.1。我測試了一下設置10,000個cookie,結果它們全部設置成功而且還隨著Cookie頭部一起發送了。不過問題是,頭部的大小超過了限制,導致服務器不能處理,從而發生了錯誤。
因此,我們以前認為的浏覽器限制每個域的cookie數目為20的觀點不再正確。另一個有趣的不一致現象是:當設置了太多cookie時,浏覽器有什麼反應。出來Safari的異常之外,其它的都設置了上限個數的cookie,這裡有兩種方式:
- 當cookie數量達到限制以後,最近最少使用算法(LRU)自動踢除最老的cookie,以便可以給最新的cookie騰出空間。Internet Explorer和Opera使用這個方式。
- Firefox則有些奇怪:它似乎是隨機決定保存cookie,盡管最後一個cookie總是會保存。似乎看不出來它遵循了什麼規則。怎麼辦?(The takeaway? )在Firefox,中,不要從超過cookie的限制。
不同的浏覽器之間,cookie的總大小也不盡相同。這一點也比較有一點難以理解,不過這裡是我的一些測試結果:
- Firefox和Safari允許cookie最長為4097個字符,即cookie的名(name)和值(value)總共可以長達4096個字符,還有一個等號(=)。
- Opera則允許cookie最長為4096個字符,包括名(name)、值(value)和等號(=)。
- Internet Explorer允許cookie最長為4095個字符,包括名(name)、值(value)和等號(=)。
這裡要注意的是,這裡的測試都是使用的單字節字符;雙字節字符長度將會自然地記為2。在所有的浏覽器中,只要長度超過了限制的cookie都將被忽略,並且永遠不會被設置。
在做完這些測試以後,我得出的結論是傳統的對於cookie的限制(大多是從原始的cookie規范中得來的)的理解不再正確。我們在使用cookie時應該非常謹慎,並始終以最低限度使用。