天天看點

[浏覽器系列] : 用戶端本地存儲

用戶端存儲

在目前的現代浏覽器中主要有以下幾種存儲方案

1.cookie

2.localStorage

3.sessionStorage

4.indexDB

Cookie

Cokkie 定義

Cookie 是用戶端存儲資料的選項之一,它主要用于用戶端存儲會話資訊。

它是由伺服器在響應 HTTP 請求時,通過發送 Set-Cookie HTTP 頭部包含的會話資訊。

浏覽器将會話資訊存儲起來,并在之後的每一個請求中攜帶Cookie 資料傳回給 伺服器,來做唯一辨別通信。

Cookie 限制

Cookie 是與特定域綁定的。這個限制可以保證隻對指定的接受者開放,不能被其它人通路。

Cookie 通常 遵循的限制規則:

    1. 不能超過300個Cookie
    1. 每個Cookie 不能超過4096 位元組
    1. 每個域不能超過 20 個 Cookie
    1. 每個域不能超過 81920 位元組

    如果 Cookie 總數超過了 單個域的 上限,浏覽器會删除之前的Cookie。

    不同浏覽器表現不一樣

  • IE 和 Opera 會按照最近最少使用的原則删除之前的Cookie.
  • Firefoxs 随機删除之前的 Cookie

如果建立的Cookie 位元組超過了最大限制,則Cookie 會被删除。

Cookie 構成

名稱 屬性
名稱 [ name ] cookie 唯一辨別名稱,不區分大小寫,建議小寫。
值 [ value ] 存儲在 cookie 字元串值
域 [ Domain] cookie 有效域的通路。
路徑 [Path=PATH] 指定哪些路由路徑必須包含cookie 才可以通路
過期時間 [Expres=DATE] 表示cookie 什麼時候被删除。預設情況下(不設定過期時間),浏覽器在關閉時,cookie都會删除
安全标 [Secure ] 設定之後,隻在使用SSL安全連結情況下才會把cookie 發送給伺服器。
讀取cookie [HttpOnly] 設定後隻能在伺服器上讀取,不能再通過JavaScript讀取Cookie

缺點

  • 容量問題:有上限,最大隻能有 4KB
  • 性能問題:同一個域名下的所有請求,都會攜帶 Cookie,某些請求(a,img,link等标簽發出的請求)可能不需要此cookie,會加大傳輸的頭部,損耗一定時空開銷
  • 安全問題:用戶端可以通過一定手段(腳本,devtools,本地存儲的檔案,修改host檔案)擷取到,存在XSS,CSRF等安全問題

解決安全問題的方案

  • 減短cookie的有效時間
  • 添加HttpOnly屬性:防止本地腳本讀取cookie
  • 服務端對傳送的cookie加密
  • 添加Secure屬性:使用https協定傳輸
  • 設定samesite屬性為需要的值:嚴格卡控cookie的攜帶範圍

Web Stronge

Web Stronge 的出現 主要是解決 cookie 的問題,存儲不需要頻繁發送服務端的資料。

它提供了 跨會話 持久化存儲大量資料的機制。

Web Stronge 中 定義了兩個對象

localStronge 永久存儲
sessionStronge 會話存儲

Stronge 提供的 方法

clear( ): 删除所有制

getItem( ): 擷取指定name 值

removeItem( ) : 删除給定 name 鍵值對

setItem( ) : 設定給定name 值

優點

  • 存儲容量大:不同浏覽器,存儲容量可以達到 5-10M,針對一個域名
  • 存儲于用戶端,不會服務端發生通信

缺點

  • 隻能存儲字元串,JSON對象需要轉換為json string 存儲
  • 隻适用于存儲少量簡單資料
  • localStorage需要手動删除

sessionStronge

sessionStronge 對象隻存儲會話資料,當頁面關閉時,意味着會話結束,那麼資料會清空。當頁面 重新整理 / 崩潰 時,資料還會儲存在浏覽器中,

使用 sessionStronge

// 設定會話key-value
// 屬性存儲資料
sessionStorage.name = '前端自學社群'
// 方法存儲資料
sessionStorage.setItem('title', '測試') 
                       
                       
// 擷取指定name值
sessionStorage.getItem('name')



// 删除會話資料
// 删除所有sessionStronge
sessionStorage.clear
// 删除指定key
sessionStorage.removeItem('name')
                          
                          
// 擷取sessionStronge 個數
sessionStorage.length
           

複制

localStronge

本地資料持久化,永久的儲存在浏覽器中,除非主動删除。

由于它 是 Stronge 的執行個體, 它擁有 Stronge 所有的方法,用法和 sessionStronge 一樣。

IndexedDB

運作在浏覽器上的非關系型資料庫

依舊受同源政策限制

學習資源

本文将不講述了,日常開發用的少。
  • [使用 IndexedDB] : https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API/Using_IndexedDB
  • [浏覽器資料庫 IndexedDB 入門教程] : http://www.ruanyifeng.com/blog/2018/07/indexeddb.html

參考

  • 《JavaScript 進階程式設計第四版》
  • MDN 資源
[浏覽器系列] : 用戶端本地存儲