存在理由?
http是無(wú)狀態(tài)的,不會(huì)記住之前的操作,無(wú)法保持登錄狀態(tài)->登錄后的操作需要繼續(xù)登錄
實(shí)現(xiàn)機(jī)制:
1)session+cookie:用戶登錄時(shí),服務(wù)器會(huì)在服務(wù)器端創(chuàng)建一個(gè)session用于記錄用戶信息,并將session_id放在cookie里面返回給用戶,cookie會(huì)保留在瀏覽器里面,之后再向?yàn)g覽器發(fā)送請(qǐng)求時(shí)都要帶上這個(gè)cookie,服務(wù)器讀取cookie里面的session_id,然后查看當(dāng)前所有有效的session中是否有這個(gè)session_id,來(lái)進(jìn)行身份驗(yàn)證。
2)token:session需要存儲(chǔ)在服務(wù)器,龐大的用戶群將給服務(wù)器帶來(lái)巨大的負(fù)擔(dān),因此有了token。token同樣是由服務(wù)器發(fā)放,但是存儲(chǔ)在客戶端,通過(guò)對(duì)請(qǐng)求加密簽名的形式來(lái)進(jìn)行身份驗(yàn)證,服務(wù)器只需解密然后比對(duì)簽名
異同點(diǎn):
1)cookie和token都是存儲(chǔ)在客戶端,而session存儲(chǔ)在服務(wù)器
2)cookie和session都可進(jìn)行身份驗(yàn)證和會(huì)話跟蹤,但是token只能進(jìn)行身份驗(yàn)證。
3)session通過(guò)session_id驗(yàn)證身份,而token通過(guò)解密然后比對(duì)簽名
補(bǔ)充:
session基本上都是配合cookie使用的,但是token可以不使用cookie。因?yàn)閏ookie每次發(fā)送消息都需攜帶,增加了負(fù)擔(dān),因此如果只需進(jìn)行身份驗(yàn)證的話,token也可以存放在Redis或本地內(nèi)存,發(fā)送請(qǐng)求時(shí)再寫到請(qǐng)求頭就可以了。
如果只使用cookie進(jìn)行身份驗(yàn)證,那么每次發(fā)送請(qǐng)求都需要攜帶上用戶名、密碼等私密信息,很不安全。所以需要結(jié)合session,采用session_id進(jìn)行身份驗(yàn)證。