HTTP協(xié)議中Cookie和Session的區(qū)別是什么?
HTTP協(xié)議是一種無(wú)狀態(tài)協(xié)議,即每次服務(wù)端接收到客戶端的請(qǐng)求時(shí),都是一個(gè)全新的請(qǐng)求,服務(wù)器并不知道客戶端的歷史請(qǐng)求記錄。Cookie和Session都是用來(lái)跟蹤瀏覽器用戶身份的會(huì)話方式,目的就是為了彌補(bǔ)HTTP的無(wú)狀態(tài)特性。
Cookie是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù),它會(huì)在瀏覽器下次向同一服務(wù)器再發(fā)起請(qǐng)求時(shí)被攜帶。
Cookie中保存已經(jīng)登錄過(guò)的用戶信息,下次訪問(wèn)網(wǎng)站的時(shí)候,頁(yè)面可以自動(dòng)填寫(xiě)登錄的一些基本信息。通常,它用于告知服務(wù)端兩個(gè)請(qǐng)求是否來(lái)自于同一瀏覽器,如保持用戶的登錄狀態(tài)。此外,Cookie還能保存用戶首選項(xiàng),主題和其他設(shè)置信息。
Session的作用是通過(guò)服務(wù)端記錄用戶的狀態(tài)。一般我們會(huì)使用Cookie來(lái)管理Session,服務(wù)器第一次接收到請(qǐng)求時(shí),生成一個(gè)Session ID ,通過(guò)響應(yīng)頭的Set-Cookie命令設(shè)置Session ID字段,并向客戶端發(fā)送要求設(shè)置Cookie的響應(yīng)??蛻舳耸盏巾憫?yīng)后,在本機(jī)保存一個(gè)包含Session ID字段的Cookie信息,接下來(lái)客戶端每次向同一服務(wù)器發(fā)送請(qǐng)求時(shí),請(qǐng)求頭都會(huì)帶上包含該Session ID的Cookie,然后服務(wù)器通過(guò)讀取請(qǐng)求頭中的Cookie,獲取到此次請(qǐng)求的Session ID。
需要注意的是,如果客戶端禁用了Cookie,通過(guò)Cookie保存Session ID的方式就無(wú)法使用了,這時(shí)我們也可以把Session ID放在請(qǐng)求的URL里面,考慮到安全性,我們還可以對(duì)Session ID進(jìn)行加密。
整體上看,Cookie和Session存在5點(diǎn)區(qū)別:
1.存放位置不同,Cookie 數(shù)據(jù)保存在客戶端瀏覽器上,而Session 數(shù)據(jù)保存在服務(wù)器上。
2. 安全性不同,Cookie存放在本地瀏覽器上,可以對(duì)其進(jìn)行偽造從而進(jìn)行Cookie欺騙,所以相對(duì)來(lái)說(shuō),Session安全性更高。
3. 存儲(chǔ)數(shù)據(jù)大小不同,單個(gè)Cookie保存的數(shù)據(jù)不能超過(guò)4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)Cookie,而Session則存儲(chǔ)于服務(wù)端,瀏覽器對(duì)其沒(méi)有限制。
4. 數(shù)據(jù)類型不同, Cookie 只支持存儲(chǔ)字符串?dāng)?shù)據(jù),而 Session 可以存儲(chǔ)任意數(shù)據(jù)類型。
5. 有效期不同,Cookie 可設(shè)置為長(zhǎng)時(shí)間保持,比如我們經(jīng)常使用的自動(dòng)登錄功能,Session 一般生效時(shí)間較短,客戶端關(guān)閉或者 Session 超時(shí)都會(huì)失效。