HTTP是基于TCP來實(shí)現(xiàn)的,而單獨(dú)拿出一個(gè)TCP連接,服務(wù)器也沒辦法確定這個(gè)TCP連接是哪個(gè)客戶端發(fā)起的(一個(gè)IP可以有多個(gè)客戶端)。所以,當(dāng)服務(wù)器需要知道連接發(fā)起的客戶端時(shí),就需要客戶端來主動(dòng)告訴服務(wù)器自己是誰(shuí)。這動(dòng)作聽上去很簡(jiǎn)單,但是客戶端只是瀏覽器而已。瀏覽器如果要告訴服務(wù)器自己是誰(shuí)就必須先記住自己是誰(shuí)。如果沒有這個(gè)記憶功能,自己都不知道自己是誰(shuí)那服務(wù)器就更無法確定。所以,這時(shí)候就需要引入儲(chǔ)存數(shù)據(jù)的功能。
在Cookie被提出以前,HTTP只是用來做簡(jiǎn)單的HTML數(shù)據(jù)傳輸用的。自從有了Cookie之后,HTTP是腰不酸了腿不疼了,一口氣上五樓不費(fèi)勁兒。以至于普及到現(xiàn)在這種程度。Cookie的作用就是讓客戶端擁有記憶的能力,訪問服務(wù)器是可以對(duì)服務(wù)器做個(gè)自我介紹。客戶端上Cookie也不會(huì)平白無故的就出現(xiàn)了,通常是在訪問了服務(wù)器之后服務(wù)器給客戶端設(shè)置的。Cookie是在HTTP頭中傳輸?shù)?,如果非要糾結(jié)這個(gè),我們就去找個(gè)HTTP頭來圍觀下。下面這個(gè)是一個(gè)“未經(jīng)人事”的客戶端去訪問百度之后得到的HTTP響應(yīng)頭。
HTTP/1.1 200 OK
Date: Wed, 05 Dec 2012 13:56:32 GMT
Server: BWS/1.0
Content-Length: 4015
Content-Type: text/html;charset=gbk
Cache-Control: private
Expires: Wed, 05 Dec 2012 13:56:32 GMT
Content-Encoding: gzip
Set-Cookie: BAIDUID=07EBE84757CE914EF14ABF072B76405E:FG=1; expires=Wed, 05-Dec-42 13:56:32 GMT; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Connection: Keep-Alive
其它部分無視掉,只看倒數(shù)第三行的Set-Cookie,這就是服務(wù)器傳輸給客戶端的Cookie。客戶端收到這個(gè)之后就會(huì)分析這個(gè)Cookie。Cookie其實(shí)不像我們想的那么簡(jiǎn)單,一個(gè)Cookie包含著許多信息。比如上面百度傳過來的Cookie就由4個(gè)部分組成。第一個(gè)是名稱=值,這是Cookie最基本的東西它是一個(gè)Cookie必須的,沒有它后面對(duì)這個(gè)Cookie設(shè)置的參數(shù)也就沒意義了。接著是:過期時(shí)間、路徑、域名。Cookie是保存在本地的,也就是說即使關(guān)閉了瀏覽器Cookie也不會(huì)消失,但是這樣就會(huì)讓Cookie的數(shù)量只加不減而產(chǎn)生冗余,所以Cookie是有時(shí)效性的。Cookie在客戶端只會(huì)被保存到過期時(shí)間為止,超過那個(gè)時(shí)間就會(huì)刪除掉。如果服務(wù)器設(shè)置Cookie的時(shí)候沒定義過期時(shí)間,那么這個(gè)Cookie就會(huì)在瀏覽器關(guān)閉時(shí)被刪除。Cookie的作用域未必是一個(gè)域名,也可以是域名下的某個(gè)目錄,所以需要用路徑來指定哪個(gè)頁(yè)面,百度使用了“/”說明是在首頁(yè)上的。首頁(yè)上的Cookie才是整個(gè)域名都可以使用的。最后還可以指定域名,這是因?yàn)?,域名通常還包含子域,每個(gè)子域都是單獨(dú)的一個(gè)域。而Cookie是不能被跨域訪問的,這是當(dāng)然。想想看,要是可以跨域訪問會(huì)有什么后果(那我訪問的XXX網(wǎng)站不全被你們知道了←_←)。百度這個(gè)Cookie是被設(shè)置到根域上的,和路徑一樣的道理,根域的Cookie在所有子域都是可以被使用的。這個(gè)域名和路徑也不是必要參數(shù),如果服務(wù)器沒定義就會(huì)使用當(dāng)前頁(yè)面的域名和路徑。
像Cookie這樣在網(wǎng)絡(luò)上傳來傳去的東西當(dāng)然不安全,如果保存用戶的機(jī)密信息也這樣肆無忌憚就很容易泄漏。所以我們的前輩們想出了一個(gè)辦法,那就是把機(jī)密信息留在服務(wù)器不傳給客戶端,只給客戶端留下一串標(biāo)識(shí)符。這個(gè)方法就是我們耳熟能詳?shù)腟ession了,服務(wù)器傳給客戶端的標(biāo)識(shí)符就稱為SessionID。就像上面百度那個(gè)例子一樣,BAIDUID的值我們是無法從中獲取到什么信息的。客戶端可以通過這個(gè)標(biāo)識(shí)符告訴服務(wù)器哪一方機(jī)密信息是屬于它的,需要做的處理都在服務(wù)器上完成,這樣安全性就大大增加?,F(xiàn)在主流的后端開發(fā)語(yǔ)言都支持Session,但是他們的支持方式和支持程度各不相同。不過有一個(gè)共同點(diǎn),Session在服務(wù)器上保存的用戶數(shù)據(jù)也是有時(shí)效性的,過了某個(gè)時(shí)間這個(gè)Session保存的數(shù)據(jù)就會(huì)失效。一般把這個(gè)Session保存的數(shù)據(jù)的失效時(shí)間和SessionID的失效時(shí)間設(shè)置成一樣的。但是服務(wù)器是開發(fā)者自己來配置的,偶爾也會(huì)不同。這種情況它倆中任何一個(gè)過了失效時(shí)間都意味著這個(gè)Session失效。所以,談?wù)揝ession失效時(shí)間的時(shí)候是使用SessionID和Session在服務(wù)器端保存的數(shù)據(jù)失效時(shí)間中較小的那一個(gè)。
雖然Session的安全性比Cookie高許多,但是這還是不夠安全,因?yàn)閯e人可以竊取用戶的SessionID冒充客戶端向服務(wù)器請(qǐng)求一些機(jī)密信息。這就是傳說中的XSS漏洞。前面說的Cookie禁止跨域問題就是因?yàn)檫@個(gè)。不僅是Cookie禁止跨域,除了一些特定的HTML標(biāo)簽外,客戶端上的Web程序都是禁止跨域的。因?yàn)?,只要不允許跨域,Cookie就不會(huì)在訪問別的網(wǎng)站時(shí)泄漏。當(dāng)然,如果你的電腦本身中毒了,那就真沒辦法了。瀏覽器對(duì)跨域的限制這么嚴(yán)格當(dāng)然也會(huì)帶來一些其它問題,所以跨域這個(gè)東西本身在Web前端中也是一個(gè)值得研究的課題,這里就不細(xì)說了。
新聞名稱:Cookie和Session的作用
文章鏈接:http://muchs.cn/news13/310113.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、定制開發(fā)、品牌網(wǎng)站制作、標(biāo)簽優(yōu)化、商城網(wǎng)站、做網(wǎng)站
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源:
創(chuàng)新互聯(lián)