1. cookie
可以籠統的將cookie
分為兩類: 會話cookie
和持久cookie
。會話cookie
是一種臨時cookie
。使用者退出瀏覽器時,會話cookie
就被刪除了。持久cookie
的生存時間更長一些,他們儲存在硬碟上,瀏覽器退出時他們仍然存在。
會話cookie
和持久cookie
之間唯一的區別就是他們的過期時間。如果設定了Discard引數,或者沒有設定Expires
或Max-Age
引數來說明擴充套件的過期時間,這個cookie
就是一個會話cookie
1.1 限制
cookie
在性質上是繫結在特定的域名下的。當設定了一個cookie
後,在給它建立他的域名傳送請求時,都會包含這個cookie
,這個限制確保了儲存在cookie
中的資訊只能讓批准的接受者訪問,而無法被其他域返回。
由於cookie
是存在客戶端計算機上的,還加入了一些限制確保cookie
不會被惡意使用。同時不會佔據太多磁碟空間,每個域的cookie
總數是有限制的。當超過單個域名之後還要設定cookie
,瀏覽器就會清除以前設定的cookie
。
對於cookie
瀏覽器的尺寸也是有限制,大多數瀏覽器為4kb。
1.2 cookie的構成
rfc中定義了瀏覽器存放每個cookie時應該包括這些欄位:
- name,value: 由cookie正文指定
- expriry-time: 根據cookie中的expries和Max-age指定cookie的使用期限
- domain,path: 分別由cookie中的domain和path指定
- creation-time, last-access-time: 由瀏覽器自行獲得
- persistent-flag: 持久化標記,在expirty-time未知的情況下為false
- secure-only-flag: 在Cookie中包含secure屬性時為true,表示這個cookie僅僅在https環境下才能使用
- http-only-flag: 在Cookie中包含httponly屬性時為true,表示這個cookie不允許通過JS讀寫
- host-only-flag: 在Cookie中不包含Domain屬性,或者Domain屬性為空,或者Domain不合法(不等於頁面URL中的Domain部分,也不是頁面Domain的大域)時為true。如果為true時間,只有域名完全相等才可以繼續後續流程,反之符合域規則的域名都可以進入後續流程。
1.3 JavaScript中的cookie
通過document.cookie
來操作cookie
,由於經過URL
編碼,所以需要通過encodeURIComponent
編碼,decodeURIComponent
解碼。
1.4 cookie,安全性和隱私
在實際的應用場景中,Cookie做的最多一件事就是保持身份認證的服務端狀態,所以一旦洩露,服務端將無法判斷這個身份是使用者本人。要避免這種問題可以有以下這幾種方法
- 設定
httponly
: 不允許js去操作cookie - 設定
secure
: 僅僅在https環境下才能啟用 - 使用簽名
cookie
: 防止篡改 - 設定
expriseIn
和Max-Age
: 設定有效期限
2. web儲存機制
web storage的目的是克服由cookie帶來的一些限制,當資料需要被嚴格控制在客戶端上,無需持續的將資料發回伺服器。web storage的兩個主要目的是:
- 提供一種在cookie之外儲存會話資料的途徑
- 提供一種儲存大量可以跨會話存在資料的機制
2.1 Storage型別
Storage型別提供最大的儲存空間(因瀏覽器而異)來儲存名值對兒。Storage的例項有以下方法:
- clear(): 刪除所有值
- getItem(name): 根據指定的名字name獲取對應的值
- key(index): 獲得index位置處的值的名字
- removeItem(name, value): 刪除由name指定的名值對兒
- setItem(name, value): 為指定的name設定一個對應的值
2.2 sessionStorage和localStorage
web Storage包含以下兩種機制
sessionStorage
: 為每一個給定的源維持一個獨立的儲存區域,該儲存區域在頁面會話期間可用(即只要瀏覽器處於開啟狀態,包括頁面載入和回恢復)localStorage
: 同樣的功能,但是在瀏覽器關閉,然後重新開啟後資料仍然存在。
對於sessionStorage
和localStorage
的儲存容量,大多數瀏覽器是5MB
區別
- 傳輸限制:
cookie
的資料可以在客戶端和服務端互相傳送,而localStorage
和seesionStorage
只能在客戶端儲存 - 儲存限制:
cookie
在每個域名下只能有20個cookie,每個cookie不能超過4kb,否則會把之前設定的cookie替代掉。而sessionStorage
和localStorage
則會儲存5MB左右,不過當超過限制時,超限的值不會被定義 - 時間限制:
cookie
可以通過設定exprise
和Max-Age
來控制有效期,而localStorage
只有使用者才能清空,否則一直儲存在瀏覽器中,sessionStorage
則會儲存到瀏覽器關閉頁面 - 作用域限制:
sessionStorage
不在不同的瀏覽器頁面中共享,即使是同一個頁面;localStorage
在所有同源視窗中都是共享的;cookie
也是在所有同源視窗中都是共享的。(可以設定host-only-flag來只讓特定域名下才可以訪問)