Stories

Detail Return Return

cookie、session、web storage - Stories Detail

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的兼容性。

user avatar dingtongya Avatar grewer Avatar yishidemeihao_5b9ce075877c9 Avatar 54r9rxzy Avatar dengzhanyong Avatar windseek Avatar doupifaner Avatar angular4 Avatar nut Avatar stephentian Avatar huanjinliu Avatar fangtangxiansheng Avatar
Favorites 15 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.