Session 和 Cookies 有什么區(qū)別?
大家好,我是前端西瓜哥。
很多初學(xué)者會(huì)分不清 Session 和 Cookies 的區(qū)別,今天西瓜哥我就帶大家來(lái)掌握這兩個(gè)概念。
登錄網(wǎng)站的表象
你進(jìn)入網(wǎng)站的登錄頁(yè)面,輸入用戶(hù)名和密碼,點(diǎn)擊 “登錄” 按鈕,然后你就登錄成功了,然后就可以進(jìn)行需要登錄才能進(jìn)行的操作,比如給西瓜哥的文章點(diǎn)贊。
之后,你再打開(kāi)這個(gè)網(wǎng)站,就不用再輸入用戶(hù)名和密碼了。
?其實(shí)是因?yàn)槟闶褂昧艘粋€(gè) “看不見(jiàn)” 的 用戶(hù)憑證,它被緩存在當(dāng)前瀏覽器中,在它過(guò)期前你依舊是登錄狀態(tài)。
而當(dāng)你打開(kāi)另一個(gè)瀏覽器時(shí),或者用另一臺(tái)電腦打開(kāi)時(shí),你還是要走一遍登錄流程,才能拿到用戶(hù)憑證實(shí)現(xiàn)登錄狀態(tài)。
上面行為的底層到底發(fā)生了什么呢??
Session
當(dāng)用戶(hù)將用戶(hù)名和密碼發(fā)給服務(wù)端后,服務(wù)端會(huì)從用戶(hù)表中,驗(yàn)證用戶(hù)名是否匹配密碼。
user 用戶(hù)表大概如下:
user_id user_name password--------------------------------------- 1 前端西瓜哥 kksk456 2 watermelon ou114514
如果用戶(hù)名和密碼正確,就會(huì)生成一個(gè)隨機(jī)的 id 作為用戶(hù)的憑證,存放到一個(gè)映射表里,并讓這個(gè)隨機(jī) id 映射到對(duì)應(yīng)的用戶(hù) id。
我們可以將它存到數(shù)據(jù)庫(kù)中:
session_id user_id-----------------------kdj1231j 2
你也可以存到內(nèi)存、redis 之類(lèi)可以快速訪(fǎng)問(wèn)的存儲(chǔ)介質(zhì)中。
此外,session_id 在映射表中也不能有相同的值,否則會(huì)導(dǎo)致張三登錄拿到了李四的號(hào)。
這樣一個(gè)保存用戶(hù)憑證(session_id)到用戶(hù) id 的映射存儲(chǔ),就是所謂的 Session 了。
Session 的意思是會(huì)話(huà)的意思,可以記錄狀態(tài)。就像兩個(gè)人建立交談后,在交談的過(guò)程中我們知道雙方彼此,但一旦結(jié)束對(duì)話(huà),我們就形同陌路。
Cookies
session_id 創(chuàng)建好了,接下來(lái)就是要將這個(gè) sesson_id 傳給瀏覽器,讓瀏覽器把它保存起來(lái),并讓瀏覽器在之后的每次請(qǐng)求中都帶上這個(gè) session_id,好讓服務(wù)器識(shí)別用戶(hù)。
但瀏覽器的請(qǐng)求是基于 HTTP 協(xié)議的,這種協(xié)議的一個(gè)特點(diǎn)是 無(wú)狀態(tài)。即在協(xié)議的實(shí)現(xiàn)上,無(wú)法知道對(duì)方是誰(shuí),任意兩個(gè)請(qǐng)求都是獨(dú)立的,它不知道一個(gè)請(qǐng)求的發(fā)起人是否為之前某個(gè)請(qǐng)求的發(fā)起人。這樣的話(huà),我們就難以實(shí)現(xiàn)維持登錄狀態(tài)。
為了解決這個(gè)問(wèn)題,Cookies 出現(xiàn)了,它能夠?qū)⒎?wù)端返回的一些信息保存下來(lái),并在之后的請(qǐng)求中將其帶上。
服務(wù)端會(huì)在 HTTP 響應(yīng)頭字段中帶上 Set-Cookie 字段,會(huì)帶上我們需要設(shè)置的鍵值對(duì),以及其他信息(比如有效期),如下:
Set-Cookie: session_id=kdj1231j; Max-Age=10000000
瀏覽器接收到后,就會(huì)將其保存到瀏覽器中。之后的每次請(qǐng)求,瀏覽器都會(huì)在 HTTP 請(qǐng)求頭中帶上 session_id 信息:
Cookie: session_id=kdj1231j;
服務(wù)端會(huì)取出 session_id 去 session 映射表中去找。
如果存在,我們就取出其用戶(hù) id,基于這個(gè)用戶(hù) id 去獲取一些私人信息,比如你的銀行余額。
結(jié)尾
Session 是一個(gè) 用戶(hù)憑證(sesson_id) 映射到 用戶(hù)id 的一個(gè)映射表,用于通過(guò)用戶(hù)憑證識(shí)別用戶(hù)。
而 Cookies 則是 HTTP 協(xié)議中可以用來(lái)保存狀態(tài)的驚喜小甜點(diǎn),它能夠?qū)⒎?wù)器返回的一些數(shù)據(jù)保存下來(lái),在下一次請(qǐng)求中攜帶上。