cookie、session、web storage

beckyyyy發表於2022-12-15

cookie與session的區別

首先,使用cookie和session的目的都是為了跟蹤記錄使用者狀態,因為http協議是無狀態的協議,而某些場景服務端需要記錄使用者的狀態,如購物車,需要來識別具體的使用者,服務端就為特定的使用者建立特定的session,用於標識並跟蹤使用者;

其次,cookie和session都是會話技術,session儲存在服務端,cookie儲存在客戶端,服務端無法知道請求對應哪個session,依靠cookie來實現session的跟蹤。

所以在跟蹤使用者方面,cookie與session屬於互相配合的關係。瀏覽器第一次訪問伺服器會建立一個session物件,透過cookie返回到瀏覽器(服務端會在響應頭裡面新增一個Set-Cookie選項,瀏覽器收到這類響應後通常會儲存下Cookie,用於標識使用者)。

在使用限制方面,cookie可以在有效期內(setMaxAge()設定有效期或者預設關閉瀏覽器後就失效)儲存資訊,但是有大小限制(約5kB)以及瀏覽器對cookie的儲存有個數限制(每個域名可能30、50個),如果個數過多,會使header大小超過伺服器的處理限制;而session本身沒有大小限制,但是和伺服器的記憶體大小有關,session儲存在服務端上存在一段時間才會消失,所以session過多會增加伺服器的壓力。

在安全方面,cookie有安全隱患,透過攔截得到cookie後可以進行攻擊。

session可以認為是一個抽象概念,開發者為了實現中斷和繼續等操作,將user agent和server之間一對一的互動,抽象為“會話”,進而衍生出“會話狀態”,也就是session的概念。而cookie是一個實際存在的東西,http協議中定義在header中的欄位,可以認為是session的一種後端無狀態實現。

在使用方面,cookie除了可以跟蹤會話,也可以儲存使用者喜好或者儲存使用者名稱密碼等等,所以可以說cookie的用途更廣泛。

cookie和localStorage的區別

第一,兩者使用的出發目的不同,cookie最早是為了跟蹤記錄使用者狀態,用於客戶端和服務端的資訊傳遞,而localStorage的使用目的是為了在客戶端儲存一些簡單的資料。

第二,兩者的大小限制不同,cookie的限制比較小,大約是5kB,超過單個域名限制後,再設定cookie,瀏覽器會清除以前設定的cookie,而localStorage儲存的大小就相對較大,業界主流是5MB。

第三,兩者的儲存期限不同,localStorage理論上來說永久有效,即不主動清空的話就不會消失,但移動裝置的瀏覽器或者WebView中,可能會因為各種原因(退出app、網路切換、記憶體不足等原因)被清空;cookie就比較靈活,可以設定失效日期expires(GMT格式的時間),如果沒有設定expires,這樣的cookie稱為會話cookie,它存在記憶體中,當會話結束,也就是瀏覽器關閉時,該cookie就消失。

第四,網路傳輸方面,每次HTTP請求,會自動將同域名的cookie新增到request header的cookie欄位傳送至伺服器,但是可以設定Secure選項使cookie只在確保安全的請求中傳送,所以如果cookie內容太多,會增加網路開銷;localStorage的內容則不會被帶上。

第五,瀏覽器支援情況方面,IE7及以下版本不支援web storage,cookie相容性比較好。

第六,在操作方面,localStorage提供現有的API去訪問操作,cookie需要自己來封裝或者使用第三方庫;但是cookie既可以由服務端來設定,也可以由客戶端來設定,localStorage只能是客戶端來設定。

另外,因為cookie比較靈活,還可以設定domain、path、httpOnly,domain和path一起來限制cookie能被哪些URL訪問,即請求的URL是Domain或其子域、且URL的路徑是Path或子路徑,則可以訪問該cookie;如果某個cookie設定了httpOnly,客戶端就無法透過js程式碼去訪問這個cookie。

總體來說,cookie用途多一些,也更靈活,但儲存體積小,localStorage可以儲存較多內容。

cookie的優缺點

  • 缺點

    • 每個域名下的cookie個數有限
    • 儲存量太小,只有5kB
    • 每次HTTP請求都會傳送到伺服器,影響獲取資源的效率
    • 需要自己封裝獲取、設定、刪除cookie的方法
  • 優點

    • 比較靈活
    • 用途多

sessionStorage與localStorage

sessionStorage用於本地儲存一個會話中的資料,這些資料只有在同一個會話中的頁面才能訪問,並且當會話結束後,資料也隨之銷燬,所以sessionStorage僅僅是會話級別的儲存,而不是一種持久化的本地儲存。

localStorage是持久化的本地儲存,除非是透過JS刪除,或者手動清除快取,否則理論上資料不會過期。

使用場景區別

cookie由於體積小,並不適合專門用於儲存用途,主要還是適用於會話憑證。

localStorage和sessionStorage因為體積較大(業界主流為5MB),又主要以字串的形式儲存,更適合用於儲存客戶端的簡單資料。

sessionStorage的資料由於在會話結束後就會被銷燬,更適合對安全性要求較高的場景;也適用於儲存一些與當前會話關聯性較強的資料,比如記錄跳轉的路由資訊,在別的會話視窗就不適用,就可以儲存在sessionStorage中。

如果有更多大量複雜結構的資料需要存取訪問,可以考慮使用indexDB,但需要考慮indexDB的相容性。

相關文章