你應該知道的前端--儲存

SGAMER-rain發表於2018-04-15

1. cookie

可以籠統的將cookie分為兩類: 會話cookie和持久cookie。會話cookie是一種臨時cookie。使用者退出瀏覽器時,會話cookie就被刪除了。持久cookie的生存時間更長一些,他們儲存在硬碟上,瀏覽器退出時他們仍然存在。

會話cookie和持久cookie之間唯一的區別就是他們的過期時間。如果設定了Discard引數,或者沒有設定ExpiresMax-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: 防止篡改
  • 設定expriseInMax-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: 同樣的功能,但是在瀏覽器關閉,然後重新開啟後資料仍然存在。

對於sessionStoragelocalStorage的儲存容量,大多數瀏覽器是5MB

區別

  1. 傳輸限制: cookie的資料可以在客戶端和服務端互相傳送,而localStorageseesionStorage只能在客戶端儲存
  2. 儲存限制: cookie在每個域名下只能有20個cookie,每個cookie不能超過4kb,否則會把之前設定的cookie替代掉。而sessionStoragelocalStorage則會儲存5MB左右,不過當超過限制時,超限的值不會被定義
  3. 時間限制: cookie可以通過設定expriseMax-Age來控制有效期,而localStorage只有使用者才能清空,否則一直儲存在瀏覽器中,sessionStorage則會儲存到瀏覽器關閉頁面
  4. 作用域限制: sessionStorage不在不同的瀏覽器頁面中共享,即使是同一個頁面;localStorage 在所有同源視窗中都是共享的;cookie也是在所有同源視窗中都是共享的。(可以設定host-only-flag來只讓特定域名下才可以訪問)

相關文章