1.背景
http是無(wú)狀態(tài)鏈接(無(wú)狀態(tài)是指服務(wù)器不知道請(qǐng)求具體來(lái)自于哪個(gè)用戶廷痘,因而不能隨便去操作數(shù)據(jù)庫(kù))蠕搜,而cookies,session和token就是在這個(gè)背景下提出來(lái)的锯玛。三者都是用來(lái)保存用戶的相關(guān)信息的(如用戶標(biāo)志uid...)栅迄、過(guò)期時(shí)間等遭商,隨著客戶端的請(qǐng)求發(fā)送到服務(wù)端用于身份校驗(yàn)邪乍。
2.組成,使用磷杏,有效期溜畅,優(yōu)缺點(diǎn)
1. cookies:由服務(wù)器生成,在客戶端以key-value形式保存用戶信息
組成:下圖就是Chrome瀏覽器中簡(jiǎn)書(shū)網(wǎng)頁(yè)下的cookies(按F12打開(kāi)瀏覽器調(diào)試功能)
主要是由Name(名字极祸,相當(dāng)于key) + Value(值慈格,即當(dāng)前用戶信息) + Domian(域名) + Path(路徑) + Expires/Max-Age(過(guò)期時(shí)間) + Size(大小)
使用:用于響應(yīng)頭和請(qǐng)求頭中:由服務(wù)器在響應(yīng)頭中設(shè)置遥金,客戶端保存浴捆,并在發(fā)送請(qǐng)求時(shí)請(qǐng)求頭中帶上cookie
有效期:如果有設(shè)置過(guò)期時(shí)間,那么只要時(shí)間還沒(méi)過(guò)期稿械,即使關(guān)閉瀏覽器cookies也還會(huì)存在选泻,反之,會(huì)在瀏覽器關(guān)閉時(shí)消失
優(yōu)缺點(diǎn):優(yōu)點(diǎn)是可以保存客戶相關(guān)信息和狀態(tài)溜哮,這對(duì)于無(wú)狀態(tài)的http請(qǐng)求來(lái)說(shuō)是很重要的(但也不是不可或缺滔金,cookie是通過(guò)http請(qǐng)求報(bào)文head部分中的色解,而在http請(qǐng)求報(bào)文中茂嗓,數(shù)據(jù)除了可以通過(guò)head傳遞餐茵,也可以通過(guò)url或請(qǐng)求體傳遞)因?yàn)橛煽蛻舳吮4妫梢员蝗诵薷氖鑫以趥鬟f過(guò)程中容易被人攔截(一些重要信息需要通過(guò)加密傳輸忿族,而用session則可以把用戶相關(guān)信息和狀態(tài)保存在服務(wù)器,所以能避免信息外泄的問(wèn)題)蝌矛,具有安全隱患道批;且在某些瀏覽器上能保存的cookies數(shù)量和大小有限制;還有就是不支持跨域訪問(wèn)(Token可解決這個(gè)問(wèn)題)
2. session:在服務(wù)端生成入撒,以key-value形式保存用戶信息
組成:session保存在服務(wù)器內(nèi)存中隆豹,維持一個(gè)hash表保存用戶相關(guān)信息(也是key-value形式)
使用:一個(gè)用戶對(duì)應(yīng)一個(gè)session,每個(gè)session都有它獨(dú)一無(wú)二的sessionid茅逮,sessionid隨響應(yīng)頭set-cookie保存到客戶端的cookies中璃赡。客戶端發(fā)送請(qǐng)求時(shí)帶上cookies献雅,服務(wù)端從cookies中拿到sessioid碉考,然后根據(jù)sessionid從內(nèi)存中找到對(duì)應(yīng)用戶的session獲取相關(guān)用戶信息
有效期:session默認(rèn)30分鐘超時(shí),即如果在30分鐘內(nèi)session沒(méi)有被訪問(wèn)過(guò)挺身,那么就失效了侯谁。
優(yōu)缺點(diǎn):能夠解決cookies的安全隱患,但因?yàn)楸4嬖诜?wù)器內(nèi)存中章钾,當(dāng)同時(shí)訪問(wèn)的用戶很多時(shí)內(nèi)存占用爭(zhēng)奪墙贱,性能會(huì)受到影響
3. token:訪問(wèn)令牌--> 一個(gè)服務(wù)端生成的獨(dú)一無(wú)二的字符串
組成:登錄時(shí)由服務(wù)端生成,一般組成形式:uuid(用戶唯一身份標(biāo)志)+time(時(shí)間戳)+sign(簽名=uuid+time+salt根據(jù)hash算法生成的字符串)+[常用的固定參數(shù)(可選)]
使用:服務(wù)端生成后隨http響應(yīng)保存在客戶端的cookies或local storage中贱傀,隨客戶端請(qǐng)求發(fā)送至服務(wù)端嫩痰,用于單點(diǎn)登錄的身份驗(yàn)證,防止跨站點(diǎn)請(qǐng)求偽造等
有效期:根據(jù)token中的時(shí)間戳跟當(dāng)前時(shí)間對(duì)比計(jì)算窍箍,看過(guò)期與否串纺,有效期默認(rèn)7天,用戶退出時(shí)直接銷毀token(???)
優(yōu)缺點(diǎn):支持跨域訪問(wèn)椰棘,防止信息外泄纺棺,可以在多個(gè)服務(wù)間共享。且不像session存儲(chǔ)于服務(wù)器內(nèi)存中邪狞,不影響服務(wù)器的性能祷蝌,但是需要額外的時(shí)間開(kāi)銷(cpu需要每次去校驗(yàn)傳過(guò)來(lái)的token是否有效(保存在服務(wù)器內(nèi)存中性能是不是會(huì)更好,還是說(shuō)有多種實(shí)現(xiàn)方案帆卓,自己衡量巨朦?米丘??))
token實(shí)現(xiàn)方案的討論