title: cookie & session &localStorage 分別是什么损痰?
tags: cookie & session &localStorage 分別是什么土至?
notebook: 零散知識
Cookie是什么?
-
Cookie
是瀏覽器訪問服務(wù)器后啡浊,服務(wù)器傳給瀏覽器的一段數(shù)據(jù) - 瀏覽器需要保存這段數(shù)據(jù)觅够,不得輕易刪除。
- 此后每次瀏覽器訪問該服務(wù)器巷嚣,都必須帶上這段數(shù)據(jù)喘先。
為什么需要Cookie?
因為HTTP協(xié)議是無狀態(tài)的廷粒,對于一個瀏覽器發(fā)出的多次請求窘拯,WEB服務(wù)器無法區(qū)分 是不是來源于同一個瀏覽器。所以坝茎,需要額外的數(shù)據(jù)用于維護會話涤姊。 Cookie 正是這樣的一段隨HTTP請求一起被傳遞的額外數(shù)據(jù)
Cookie能做什么?
Cookie只是一段文本嗤放,所以它只能保存字符串思喊。而且瀏覽器對它有大小限制以及 它會隨著每次請求被發(fā)送到服務(wù)器,所以應(yīng)該保證它不要太大次酌。 Cookie的內(nèi)容也是明文保存的搔涝,有些瀏覽器提供界面修改,所以和措, 不適合保存重要的或者涉及隱私的內(nèi)容。
Cookie 的限制蜕煌。
大多數(shù)瀏覽器支持最大為 4096 字節(jié)的 Cookie派阱。由于這限制了 Cookie 的大小,最好用 Cookie 來存儲少量數(shù)據(jù)斜纪,或者存儲用戶 ID 之類的標識符贫母。用戶 ID 隨后便可用于標識用戶,以及從數(shù)據(jù)庫或其他數(shù)據(jù)源中讀取用戶信息盒刚。 瀏覽器還限制站點可以在用戶計算機上存儲的 Cookie 的數(shù)量腺劣。大多數(shù)瀏覽器只允許每個站點存儲 20 個 Cookie;如果試圖存儲更多 Cookie因块,則最舊的 Cookie 便會被丟棄橘原。有些瀏覽器還會對它們將接受的來自所有站點的 Cookie 總數(shù)作出絕對限制,通常為 300 個。
如何使用 Cookie
Cookie 一般有兩個作用
- 第一個作用是識別用戶身份趾断。
比如用戶 A 用瀏覽器訪問了 a.com拒名,那么 a.com 的服務(wù)器就會立刻給 A 返回一段數(shù)據(jù)「uid=1」(這就是 Cookie)。當 A 再次訪問 a.com 的其他頁面時芋酌,就會附帶上「uid=1」這段數(shù)據(jù)增显。
同理,用戶 B 用瀏覽器訪問 a.com 時脐帝,a.com 發(fā)現(xiàn) B 沒有附帶 uid 數(shù)據(jù)同云,就給 B 分配了一個新的 uid,為2堵腹,然后返回給 B 一段數(shù)據(jù)「uid=2」炸站。B 之后訪問 a.com 的時候,就會一直帶上「uid=2」這段數(shù)據(jù)秸滴。
借此武契,a.com 的服務(wù)器就能區(qū)分 A 和 B 兩個用戶了。
- 第二個作用是記錄歷史荡含。
假設(shè) a.com 是一個購物網(wǎng)站咒唆,當 A 在上面將商品 A1 、A2 加入購物車時释液,JS 可以改寫 Cookie,改為「uid=1; cart=A1,A2」误债,表示購物車里有 A1 和 A2 兩樣商品了。
這樣一來寝蹈,當用戶關(guān)閉網(wǎng)頁,過三天再打開網(wǎng)頁的時候箫老,依然可以看到 A1封字、A2 躺在購物車里,因為瀏覽器并不會無緣無故地刪除這個 Cookie耍鬓。
借此,就達到里記錄用戶操作歷史的目的了笆制。
session是什么
當一個用戶打開淘寶登錄后,刷新瀏覽器仍然展示登錄狀態(tài)涣达。服務(wù)器如何分辨這次發(fā)起請求的用戶是剛才登錄過的用戶呢在辆?這里就使用了session保存狀態(tài)证薇。用戶在輸入用戶名密碼提交給服務(wù)端,服務(wù)端驗證通過后會創(chuàng)建一個session用于記錄用戶的相關(guān)信息开缎,這個 session 可保存在服務(wù)器內(nèi)存中,也可保存在數(shù)據(jù)庫中俺泣。
- 創(chuàng)建session后完残,會把關(guān)聯(lián)的session_id 通過setCookie 添加到http響應(yīng)頭部中。
- 瀏覽器在加載頁面時發(fā)現(xiàn)響應(yīng)頭部有 set-cookie字段谨设,就把這個cookie 種到瀏覽器指定域名下。
- 當下次刷新頁面時扎拣,發(fā)送的請求會帶上這條cookie, 服務(wù)端在接收到后根據(jù)這個session_id來識別用戶二蓝。
cookie 是存儲在瀏覽器里的一小段「數(shù)據(jù)」,而session是一種讓服務(wù)器能識別某個用戶的「機制」踊跟,session 在實現(xiàn)的過程中需要使用cookie鸥诽。 二者不是同一維度的東西。
cookie 雖然很方便牡借,但是使用 cookie 有一個很大的弊端,cookie 中的所有數(shù)據(jù)在客戶端就可以被修改地回,數(shù)據(jù)非常容易被偽造俊鱼,那么一些重要的數(shù)據(jù)就不能存放在 cookie 中了,而且如果 cookie 中數(shù)據(jù)字段太多會影響傳輸效率并闲。為了解決這些問題谷羞,就產(chǎn)生了 session帝火,session 中的數(shù)據(jù)是保留在服務(wù)器端的。
session 的運作通過一個 session_id
來進行犀填。session_id
通常是存放在客戶端的 cookie 中,比如在 express 中图贸,默認是 connect.sid 這個字段,當請求到來時疏日,服務(wù)端檢查 cookie 中保存的 session_id
并通過這個 session_id
與服務(wù)器端的 session data 關(guān)聯(lián)起來撒汉,進行數(shù)據(jù)的保存和修改
這意思就是說,當你瀏覽一個網(wǎng)頁時睬辐,服務(wù)端隨機產(chǎn)生一個 1024 比特長的字符串,然后存在你 cookie 中的 connect.sid 字段中侵俗。當你下次訪問時瓣喊,cookie 會帶有這個字符串,然后瀏覽器就知道你是上次訪問過的某某某藻三,然后從服務(wù)器的存儲中取出上次記錄在你身上的數(shù)據(jù)。由于字符串是隨機產(chǎn)生的熄求,而且位數(shù)足夠多逗概,所以也不擔(dān)心有人能夠偽造。偽造成功的概率比坐在家里編程時被鄰居家的狗突然闖入并咬死的幾率還低逾苫。
localStorage 是什么
- localStorage HTML5本地存儲web storage特性的API之一,用于將大量數(shù)據(jù)(最大5M)保存在瀏覽器中瑟押,保存后數(shù)據(jù)永遠存在不會失效過期,除非用 js手動清除星掰。
- 不參與網(wǎng)絡(luò)傳輸嫩舟。
- 一般用于性能優(yōu)化怀偷,可以保存圖片、js椎工、css、html 模板镰绎、大量數(shù)據(jù)木西。
- localstorage在隱私模式下不可讀取
- localstorage本質(zhì)是在讀寫文件,數(shù)據(jù)多的話會比較卡(firefox會一次性將數(shù)據(jù)導(dǎo)入內(nèi)存八千,想想就覺得嚇人啊)
- localstorage不能被爬蟲爬取照皆,不要用它完全取代URL傳參
localstorage的使用
基礎(chǔ)知識
localstorage存儲對象分為兩種:
- sessionStrage: session即會話的意思沸停,在這里的session是指用戶瀏覽某個網(wǎng)站時,從進入網(wǎng)站到關(guān)閉網(wǎng)站這個時間段愤钾,session對象的有效期就只有這么長。
- localStorage: 將數(shù)據(jù)保存在客戶端硬件設(shè)備上杂瘸,不管它是什么伙菊,意思就是下次打開計算機時候數(shù)據(jù)還在。
兩者區(qū)別就是一個作為臨時保存镜硕,一個長期保存。