HTTP 的無狀態(tài)
HTTP協(xié)議是無狀態(tài)的,這與HTTP協(xié)議本來的目的是相符的,客戶端只需要簡單的向服務(wù)器請(qǐng)求下載某些文件大渤,無論是客戶端還是服務(wù)器都沒有必要紀(jì)錄彼此過去的行為,每一次請(qǐng)求之間都是獨(dú)立的,好比一個(gè)顧客和一個(gè)自動(dòng)售貨機(jī)或者一個(gè)普通的(非會(huì)員制)大賣場之間的關(guān)系一樣绒障。 但是如果能夠提供一些按需生成的動(dòng)態(tài)信息會(huì)使web變得更加有用,就萌發(fā)了cookie 和session 等客戶端與服務(wù)器之間保持狀態(tài)的解決方案捍歪。
Session -- 創(chuàng)建户辱,保存在服務(wù)器中的會(huì)話
- 當(dāng)用戶打開某個(gè)web應(yīng)用時(shí),便與web服務(wù)器產(chǎn)生一個(gè)session糙臼。服務(wù)器使用session把用戶的信息臨時(shí)保存在了服務(wù)器上庐镐, 存放于內(nèi)存。
- session是由服務(wù)器創(chuàng)建的变逃,跟瀏覽器沒有半毛錢關(guān)系必逆,瀏覽器只是拿到一個(gè)session 的 ID。
- session是消耗服務(wù)器內(nèi)存的揽乱,所以要合理使用session名眉。
缺陷:如果web服務(wù)器做了負(fù)載均衡,那么下一個(gè)操作請(qǐng)求到了另一臺(tái)服務(wù)器的時(shí)候session會(huì)丟失凰棉。
Cookie -- 服務(wù)器上生成损拢,保存于客戶端
- cookie由服務(wù)器生成,發(fā)送給瀏覽器撒犀,瀏覽器把cookie以kv形式保存到某個(gè)目錄下的文本文件內(nèi)福压,下一次請(qǐng)求同一網(wǎng)站時(shí)會(huì)把該cookie發(fā)送給服務(wù)器。
- 一個(gè)cookie的設(shè)置以及發(fā)送過程分為以下四步:
客戶端發(fā)送一個(gè)http請(qǐng)求到服務(wù)器端
服務(wù)器端發(fā)送一個(gè)http響應(yīng)到客戶端或舞,其中包含Set-Cookie頭部
客戶端發(fā)送一個(gè)http請(qǐng)求到服務(wù)器端隧膏,其中包含Cookie頭部
服務(wù)器端發(fā)送一個(gè)http響應(yīng)到客戶端 - 局限:由于cookie是存在客戶端上的,所以瀏覽器加入了一些限制確保cookie不會(huì)被惡意使用嚷那,同時(shí)不會(huì)占據(jù)太多磁盤空間胞枕,所以每個(gè)域的cookie數(shù)量是有限的 ; cookie 不是很安全 魏宽, 別人可以利用儲(chǔ)存的本地的cookie 腐泻。
Token -- 驗(yàn)證用戶身份的令牌
- 唯一的 决乎,比較安全
- token 驗(yàn)證流程 :
客戶端使用用戶名跟密碼請(qǐng)求登錄。
服務(wù)端收到請(qǐng)求派桩,去驗(yàn)證用戶名與密碼构诚。
驗(yàn)證成功后,服務(wù)端會(huì)簽發(fā)一個(gè) Token铆惑,再把這個(gè) Token 發(fā)送給客戶端范嘱。
客戶端收到 Token 以后可以把它存儲(chǔ)起來。
客戶端每次向服務(wù)端請(qǐng)求資源的時(shí)候需要帶著服務(wù)端簽發(fā)的 Token
服務(wù)端收到請(qǐng)求员魏,然后去驗(yàn)證客戶端請(qǐng)求里面帶著的 Token丑蛤,如果驗(yàn)證成功,就向客戶端返回請(qǐng)求的數(shù)據(jù)撕阎。
cookie 和session
- cookie數(shù)據(jù)存放在客戶的瀏覽器上受裹,session數(shù)據(jù)放在服務(wù)器上。
- cookie不是很安全虏束,考慮到安全應(yīng)當(dāng)使用session棉饶。
- session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多镇匀,會(huì)比較占用服務(wù)器的性能考慮到減輕服務(wù)器性能方面照藻,應(yīng)當(dāng)使用cookie。
- 單個(gè)cookie保存的數(shù)據(jù)不能超過4K汗侵,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie幸缕。
- 將登陸信息等重要信息存放為session,其他信息如果需要保留,可以放在cookie中
6 . 由于采用服務(wù)器端保持狀態(tài)的方案在客戶端也需要保存一個(gè)標(biāo)識(shí)晃择,所以session機(jī)制可能需要借助于cookie機(jī)制來達(dá)到保存標(biāo)識(shí)的目的冀值,但實(shí)際上它還有其他選擇 --由于cookie可以被人為的禁止也物,必須有其他機(jī)制以便在cookie被禁止時(shí)仍然能夠把session id傳遞回服務(wù)器.
token 和session
- session只提供一種簡單的認(rèn)證宫屠,即有此 session ID ,即認(rèn)為有此 User的全部權(quán)力 滑蚯; token Token是唯一的浪蹂。提供的是認(rèn)證 和 授權(quán) ,認(rèn)證是針對(duì)用戶告材,授權(quán)是針對(duì)app坤次, 不可以轉(zhuǎn)移到其它 app上,也不可以轉(zhuǎn)到其它 用戶上斥赋。
- 所以,如果用戶數(shù)據(jù)可能需要和第三方共享缰猴,或者允許第三方調(diào)用 API 接口,用 token 疤剑。如果只是自己的網(wǎng)站滑绒,自己的 app闷堡,用session也可以。