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的兼容性,
本文來自博客園,作者:beckyye,轉載請注明原文鏈接:https://www.cnblogs.com/halftonine/p/16966407.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/539525.html
標籤:其他
下一篇:約瑟夫環問題
