title: cookie & session &localStorage 分別是什么?
tags: cookie & session &localStorage 分別是什么?
notebook: 零散知識(shí)
Cookie是什么?
-
Cookie是瀏覽器訪問(wèn)服務(wù)器后,服務(wù)器傳給瀏覽器的一段數(shù)據(jù) - 瀏覽器需要保存這段數(shù)據(jù),不得輕易刪除。
- 此后每次瀏覽器訪問(wèn)該服務(wù)器,都必須帶上這段數(shù)據(jù)。
為什么需要Cookie?
因?yàn)镠TTP協(xié)議是無(wú)狀態(tài)的,對(duì)于一個(gè)瀏覽器發(fā)出的多次請(qǐng)求,WEB服務(wù)器無(wú)法區(qū)分 是不是來(lái)源于同一個(gè)瀏覽器。所以,需要額外的數(shù)據(jù)用于維護(hù)會(huì)話。 Cookie 正是這樣的一段隨HTTP請(qǐng)求一起被傳遞的額外數(shù)據(jù)
Cookie能做什么?
Cookie只是一段文本,所以它只能保存字符串。而且瀏覽器對(duì)它有大小限制以及 它會(huì)隨著每次請(qǐng)求被發(fā)送到服務(wù)器,所以應(yīng)該保證它不要太大。 Cookie的內(nèi)容也是明文保存的,有些瀏覽器提供界面修改,所以, 不適合保存重要的或者涉及隱私的內(nèi)容。
Cookie 的限制。
大多數(shù)瀏覽器支持最大為 4096 字節(jié)的 Cookie。由于這限制了 Cookie 的大小,最好用 Cookie 來(lái)存儲(chǔ)少量數(shù)據(jù),或者存儲(chǔ)用戶(hù) ID 之類(lèi)的標(biāo)識(shí)符。用戶(hù) ID 隨后便可用于標(biāo)識(shí)用戶(hù),以及從數(shù)據(jù)庫(kù)或其他數(shù)據(jù)源中讀取用戶(hù)信息。 瀏覽器還限制站點(diǎn)可以在用戶(hù)計(jì)算機(jī)上存儲(chǔ)的 Cookie 的數(shù)量。大多數(shù)瀏覽器只允許每個(gè)站點(diǎn)存儲(chǔ) 20 個(gè) Cookie;如果試圖存儲(chǔ)更多 Cookie,則最舊的 Cookie 便會(huì)被丟棄。有些瀏覽器還會(huì)對(duì)它們將接受的來(lái)自所有站點(diǎn)的 Cookie 總數(shù)作出絕對(duì)限制,通常為 300 個(gè)。
如何使用 Cookie
Cookie 一般有兩個(gè)作用
- 第一個(gè)作用是識(shí)別用戶(hù)身份。
比如用戶(hù) A 用瀏覽器訪問(wèn)了 a.com,那么 a.com 的服務(wù)器就會(huì)立刻給 A 返回一段數(shù)據(jù)「uid=1」(這就是 Cookie)。當(dāng) A 再次訪問(wèn) a.com 的其他頁(yè)面時(shí),就會(huì)附帶上「uid=1」這段數(shù)據(jù)。
同理,用戶(hù) B 用瀏覽器訪問(wèn) a.com 時(shí),a.com 發(fā)現(xiàn) B 沒(méi)有附帶 uid 數(shù)據(jù),就給 B 分配了一個(gè)新的 uid,為2,然后返回給 B 一段數(shù)據(jù)「uid=2」。B 之后訪問(wèn) a.com 的時(shí)候,就會(huì)一直帶上「uid=2」這段數(shù)據(jù)。
借此,a.com 的服務(wù)器就能區(qū)分 A 和 B 兩個(gè)用戶(hù)了。
- 第二個(gè)作用是記錄歷史。
假設(shè) a.com 是一個(gè)購(gòu)物網(wǎng)站,當(dāng) A 在上面將商品 A1 、A2 加入購(gòu)物車(chē)時(shí),JS 可以改寫(xiě) Cookie,改為「uid=1; cart=A1,A2」,表示購(gòu)物車(chē)?yán)镉?A1 和 A2 兩樣商品了。
這樣一來(lái),當(dāng)用戶(hù)關(guān)閉網(wǎng)頁(yè),過(guò)三天再打開(kāi)網(wǎng)頁(yè)的時(shí)候,依然可以看到 A1、A2 躺在購(gòu)物車(chē)?yán)?,因?yàn)闉g覽器并不會(huì)無(wú)緣無(wú)故地刪除這個(gè) Cookie。
借此,就達(dá)到里記錄用戶(hù)操作歷史的目的了。
session是什么
當(dāng)一個(gè)用戶(hù)打開(kāi)淘寶登錄后,刷新瀏覽器仍然展示登錄狀態(tài)。服務(wù)器如何分辨這次發(fā)起請(qǐng)求的用戶(hù)是剛才登錄過(guò)的用戶(hù)呢?這里就使用了session保存狀態(tài)。用戶(hù)在輸入用戶(hù)名密碼提交給服務(wù)端,服務(wù)端驗(yàn)證通過(guò)后會(huì)創(chuàng)建一個(gè)session用于記錄用戶(hù)的相關(guān)信息,這個(gè) session 可保存在服務(wù)器內(nèi)存中,也可保存在數(shù)據(jù)庫(kù)中。
- 創(chuàng)建session后,會(huì)把關(guān)聯(lián)的session_id 通過(guò)setCookie 添加到http響應(yīng)頭部中。
- 瀏覽器在加載頁(yè)面時(shí)發(fā)現(xiàn)響應(yīng)頭部有 set-cookie字段,就把這個(gè)cookie 種到瀏覽器指定域名下。
- 當(dāng)下次刷新頁(yè)面時(shí),發(fā)送的請(qǐng)求會(huì)帶上這條cookie, 服務(wù)端在接收到后根據(jù)這個(gè)session_id來(lái)識(shí)別用戶(hù)。
cookie 是存儲(chǔ)在瀏覽器里的一小段「數(shù)據(jù)」,而session是一種讓服務(wù)器能識(shí)別某個(gè)用戶(hù)的「機(jī)制」,session 在實(shí)現(xiàn)的過(guò)程中需要使用cookie。 二者不是同一維度的東西。
cookie 雖然很方便,但是使用 cookie 有一個(gè)很大的弊端,cookie 中的所有數(shù)據(jù)在客戶(hù)端就可以被修改,數(shù)據(jù)非常容易被偽造,那么一些重要的數(shù)據(jù)就不能存放在 cookie 中了,而且如果 cookie 中數(shù)據(jù)字段太多會(huì)影響傳輸效率。為了解決這些問(wèn)題,就產(chǎn)生了 session,session 中的數(shù)據(jù)是保留在服務(wù)器端的。
session 的運(yùn)作通過(guò)一個(gè) session_id 來(lái)進(jìn)行。session_id 通常是存放在客戶(hù)端的 cookie 中,比如在 express 中,默認(rèn)是 connect.sid 這個(gè)字段,當(dāng)請(qǐng)求到來(lái)時(shí),服務(wù)端檢查 cookie 中保存的 session_id 并通過(guò)這個(gè) session_id 與服務(wù)器端的 session data 關(guān)聯(lián)起來(lái),進(jìn)行數(shù)據(jù)的保存和修改
這意思就是說(shuō),當(dāng)你瀏覽一個(gè)網(wǎng)頁(yè)時(shí),服務(wù)端隨機(jī)產(chǎn)生一個(gè) 1024 比特長(zhǎng)的字符串,然后存在你 cookie 中的 connect.sid 字段中。當(dāng)你下次訪問(wèn)時(shí),cookie 會(huì)帶有這個(gè)字符串,然后瀏覽器就知道你是上次訪問(wèn)過(guò)的某某某,然后從服務(wù)器的存儲(chǔ)中取出上次記錄在你身上的數(shù)據(jù)。由于字符串是隨機(jī)產(chǎn)生的,而且位數(shù)足夠多,所以也不擔(dān)心有人能夠偽造。偽造成功的概率比坐在家里編程時(shí)被鄰居家的狗突然闖入并咬死的幾率還低。
localStorage 是什么
- localStorage HTML5本地存儲(chǔ)web storage特性的API之一,用于將大量數(shù)據(jù)(最大5M)保存在瀏覽器中,保存后數(shù)據(jù)永遠(yuǎn)存在不會(huì)失效過(guò)期,除非用 js手動(dòng)清除。
- 不參與網(wǎng)絡(luò)傳輸。
- 一般用于性能優(yōu)化,可以保存圖片、js、css、html 模板、大量數(shù)據(jù)。
- localstorage在隱私模式下不可讀取
- localstorage本質(zhì)是在讀寫(xiě)文件,數(shù)據(jù)多的話會(huì)比較卡(firefox會(huì)一次性將數(shù)據(jù)導(dǎo)入內(nèi)存,想想就覺(jué)得嚇人?。?/li>
- localstorage不能被爬蟲(chóng)爬取,不要用它完全取代URL傳參
localstorage的使用
基礎(chǔ)知識(shí)
localstorage存儲(chǔ)對(duì)象分為兩種:
- sessionStrage: session即會(huì)話的意思,在這里的session是指用戶(hù)瀏覽某個(gè)網(wǎng)站時(shí),從進(jìn)入網(wǎng)站到關(guān)閉網(wǎng)站這個(gè)時(shí)間段,session對(duì)象的有效期就只有這么長(zhǎng)。
- localStorage: 將數(shù)據(jù)保存在客戶(hù)端硬件設(shè)備上,不管它是什么,意思就是下次打開(kāi)計(jì)算機(jī)時(shí)候數(shù)據(jù)還在。
兩者區(qū)別就是一個(gè)作為臨時(shí)保存,一個(gè)長(zhǎng)期保存。