Cookie與Session詳解讀書(shū)筆記爽蝴,從概念迅皇、操作、應(yīng)用酵颁、注意事項(xiàng)以及區(qū)別等幾方面詳細(xì)闡述兩者的基礎(chǔ)知識(shí)嫉你,它們都是針對(duì)HTTP協(xié)議的局限性而提出的一種保持客戶端和服務(wù)器間保持會(huì)話連接狀態(tài)的機(jī)制。躏惋。
<small>來(lái)源 《PHP核心技術(shù)與最佳實(shí)踐》 列旭松 陳文 著
一幽污、Cookie詳解
Cookie在遠(yuǎn)程瀏覽器端存儲(chǔ)數(shù)據(jù)并以此跟蹤和識(shí)別用戶的機(jī)制。從實(shí)現(xiàn)上說(shuō)其掂,Cookie是存儲(chǔ)在客戶端上的一小段數(shù)據(jù)油挥,瀏覽器(即客戶端)通過(guò)HTTP協(xié)議和服務(wù)器端進(jìn)行Cookie交互。
Cooke獨(dú)立于語(yǔ)言存在,嚴(yán)格地說(shuō)深寥,Cookie并不是由PHP攘乒、Java等語(yǔ)言實(shí)現(xiàn)的,而是由這些語(yǔ)言對(duì)Cookie進(jìn)行間接操作惋鹅,即發(fā)送HTTP指令则酝,瀏覽器收到指令便操作Cookie并返回給服務(wù)器。因此闰集,Cookie是由瀏覽器實(shí)現(xiàn)和管理的沽讹。舉例說(shuō),PHP并沒(méi)有真正設(shè)置過(guò)Cookie武鲁,只是發(fā)出指令讓瀏覽器來(lái)做這件事爽雄。PHP中可以使用setcookie() 或 setrawcookie() 函數(shù)設(shè)置Cookie。setcookie()最后一個(gè)參數(shù)HttpOnly設(shè)置了后沐鼠,JavaScript就無(wú)法讀取到這個(gè)Cookie挚瘟。
設(shè)置Cookie時(shí)需注意:①函數(shù)有返回值,false失敗饲梭,true成功乘盖,成功僅供參考,不代表客戶端一定能接收到憔涉;②PHP設(shè)置的Cookie不能立即生效订框,要等下一個(gè)頁(yè)面才能看到(Cookie從服務(wù)器傳給瀏覽器,下個(gè)頁(yè)面瀏覽器才能把設(shè)置的Cookie傳回給服務(wù)器)兜叨;如果是JavaScript設(shè)置的穿扳,是立即生效的;③Cookie沒(méi)有顯示的刪除函數(shù)国旷,可以設(shè)置expire過(guò)期時(shí)間纵揍,自動(dòng)觸發(fā)瀏覽器的刪除機(jī)制。
Cookie是HTTP頭的一部分议街,即現(xiàn)發(fā)送或請(qǐng)求Cookie泽谨,才是data域;setcookie()等函數(shù)必須在數(shù)據(jù)之前調(diào)用特漩,這和header() 函數(shù)是相同的吧雹。不過(guò)也可以使用輸出緩沖函數(shù)延遲腳本的輸出,知道設(shè)置好所有Cookie和其他HTTP標(biāo)頭涂身。
Cookie通常用來(lái)存儲(chǔ)一些不是很敏感的信息雄卷,或者進(jìn)行登錄控制,也可用來(lái)記住用戶名蛤售、記住免密碼登錄丁鹉、防止刷票等妒潭。每個(gè)域名下允許的Cookie是有限制的,根據(jù)瀏覽器這個(gè)限制也不同揣钦。Cookie不是越多越好雳灾,它會(huì)增加寬帶,增加流量消耗冯凹,所以不要濫用Cookie谎亩;不要把Cookie當(dāng)作客戶端的存儲(chǔ)器來(lái)用。一個(gè)域名的每個(gè)Cookie限制以4千字節(jié)(KB)鍵值對(duì)的形式存儲(chǔ)宇姚。
還有一種Cookie是Flash創(chuàng)建的匈庭,成為Flash Shard Object,又稱Flash Cookie浑劳,即使清空瀏覽器所有隱私數(shù)據(jù)阱持,這類頑固的Cookie還會(huì)存在硬盤(pán)上,因?yàn)樗皇蹻lash管理魔熏,很多網(wǎng)站采用這種技術(shù)識(shí)別用戶紊选。
Cookie跨域,主要是為了統(tǒng)一應(yīng)用平臺(tái)道逗,實(shí)現(xiàn)單點(diǎn)登錄;需使用P3P協(xié)議(Platform for Privacy Preferences)献烦,通過(guò)P3P使用戶自己可以指定瀏覽器的隱私策略滓窍,達(dá)到存儲(chǔ)第三方Cookie的目的,只需要在響應(yīng)用戶請(qǐng)求時(shí)巩那,在HTTP的頭信息中增加關(guān)于P3P的配置信息就可以了吏夯。Cookie跨域涉及兩個(gè)不同的應(yīng)用,習(xí)慣上稱為第一方和第三方即横。第三方通常是來(lái)自別人的廣告噪生、或Iframe別的網(wǎng)站的URL,這些第三方網(wǎng)站可能使用的Cookie东囚。
二跺嗽、Session詳解
Session即會(huì)話,指一種持續(xù)性的页藻、雙向的連接桨嫁。Session與Cookie在本質(zhì)上沒(méi)有區(qū)別,都是針對(duì)HTTP協(xié)議的局限性而提出的一種保持客戶端和服務(wù)器間保持會(huì)話連接狀態(tài)的機(jī)制份帐。Session也是一個(gè)通用的標(biāo)準(zhǔn)璃吧,但在不同的語(yǔ)言中實(shí)現(xiàn)有所不同。針對(duì)Web網(wǎng)站來(lái)說(shuō)废境,Session指用戶在瀏覽某個(gè)網(wǎng)站時(shí)畜挨,從進(jìn)入網(wǎng)站到瀏覽器關(guān)閉這段時(shí)間內(nèi)的會(huì)話筒繁。由此可知,Session實(shí)際上是一個(gè)特定的時(shí)間概念巴元。
使用Session可以在網(wǎng)站的上下文不同頁(yè)面間傳遞變量毡咏、用戶身份認(rèn)證、程序狀態(tài)記錄等务冕。常見(jiàn)的形式就是配合Cookie使用血当,實(shí)現(xiàn)保存用戶登錄狀態(tài)功能。和Cookie一樣禀忆,session_start() 必須在程序最開(kāi)始執(zhí)行臊旭,前面不能有任何輸出內(nèi)容,否則會(huì)出現(xiàn)警告箩退。PHP的Session默認(rèn)通過(guò)文件的方式實(shí)現(xiàn)离熏,即存儲(chǔ)在服務(wù)器端的Session文件,每個(gè)Session一個(gè)文件戴涝。
Session通過(guò)一個(gè)稱為PHPSESSID的Cookie和服務(wù)器聯(lián)系滋戳。Session是通過(guò)sessionID判斷客戶端用戶的,即Session文件的文件名啥刻。sessionID實(shí)際上是在客戶端和服務(wù)端之間通過(guò)HTTP Request 和 HTTP Response傳來(lái)傳去奸鸯。sessionID按照一定的算法生成,必須包含在 HTTP Request 里面可帽,保證唯一性和隨機(jī)性娄涩,以確保Session的安全。如果沒(méi)有設(shè)置 Session 的生成周期映跟, sessionID存儲(chǔ)在內(nèi)存中蓄拣,關(guān)閉瀏覽器后該ID自動(dòng)注銷;重新請(qǐng)求該頁(yè)面努隙,會(huì)重新注冊(cè)一個(gè)sessionID球恤。如果客戶端沒(méi)有禁用Cookie,Cookie在啟動(dòng)Session回話的時(shí)候扮演的是存儲(chǔ)sessionID 和 Session 生存期的角色荸镊。Session過(guò)期后咽斧,PHP會(huì)對(duì)其進(jìn)行回收。
假設(shè)客戶端禁用Cookie躬存,可以通過(guò)URL或者隱藏表單傳遞sessionID收厨;php.ini中把session.use_trans_sid 設(shè)成1,那么連接后就會(huì)自己加Session的ID优构。
Session以文件的形式存放在本地硬盤(pán)的一個(gè)目錄中诵叁,當(dāng)比較多時(shí),磁盤(pán)讀取文件就會(huì)比較慢钦椭,因此把Session分目錄存放拧额。
對(duì)于訪問(wèn)量大的站點(diǎn)碑诉,用默認(rèn)的Session存儲(chǔ)方式并不適合,較優(yōu)的方法是用Data Base存取Session侥锦。在大流量的網(wǎng)站中进栽,Session入庫(kù)存在效率不高、占據(jù)數(shù)據(jù)庫(kù)connection資源等問(wèn)題恭垦。針對(duì)這種情況快毛,可以使用Memcached、Redis等Key-Value數(shù)據(jù)存儲(chǔ)方案實(shí)現(xiàn)高并發(fā)番挺、大流量的Session存儲(chǔ)唠帝。
三、Cookie與Session問(wèn)答
- Cookie運(yùn)行在客戶端玄柏,Session運(yùn)行在服務(wù)端襟衰,對(duì)嗎?
A:不完全正確粪摘。Cookie是運(yùn)行在客戶端瀑晒,有客戶端進(jìn)行管理;Session雖然是運(yùn)行在服務(wù)器端徘意,但是sessionID作為一個(gè)Cookie是存儲(chǔ)在客戶端的苔悦。
2. 瀏覽器禁止Cookie,Cookie就不能用了椎咧,但Session不會(huì)受瀏覽器影響玖详,對(duì)嗎?
A:錯(cuò)邑退。瀏覽器禁止Cookie,Cookie確實(shí)不能用了劳澄,Session會(huì)受瀏覽器端的影響地技。很簡(jiǎn)單的實(shí)驗(yàn),在登錄一個(gè)網(wǎng)站后秒拔,清空瀏覽器的Cookie和隱私數(shù)據(jù)莫矗,單機(jī)后臺(tái)的連接,就會(huì)因?yàn)閬G失Cookie而退出砂缩。當(dāng)然作谚,有辦法通過(guò)URL傳遞Session。
3. 瀏覽器關(guān)閉后庵芭,Cookie和Session都消失了妹懒,對(duì)嗎?
A:錯(cuò)双吆。存儲(chǔ)在內(nèi)存中額Cookie確實(shí)會(huì)隨著瀏覽器的關(guān)閉而消失眨唬,但存儲(chǔ)在硬盤(pán)上的不會(huì)会前。更頑固的是Flash Cookie,不過(guò)現(xiàn)在很多系統(tǒng)優(yōu)化軟件和新版瀏覽器都已經(jīng)支持刪除Flash Cookie匾竿。百度采用了這樣的技術(shù)記憶用戶:Session在瀏覽器關(guān)閉后也不會(huì)消失瓦宜,除非正常退出,代碼中使用了顯示的unset刪除Session岭妖。否則Session可能被回收临庇,也有可能永遠(yuǎn)殘留在系統(tǒng)中。
4. Session 比 Cookie 更安全嗎昵慌? 不應(yīng)該大量使用Cookie嗎假夺?
A:錯(cuò)誤。Cookie確實(shí)可能存在一些不安全因素废离,但和JavaScript一樣侄泽,即使突破前端驗(yàn)證,還有后端保障安全蜻韭。一切都還要看設(shè)計(jì)悼尾,尤其是涉及提權(quán)的時(shí)候,特別需要注意肖方。通常情況下闺魏,Cookie和Session是綁定的,獲得Cookie就相當(dāng)于獲得了Session俯画,客戶端把劫持的Cookie原封不動(dòng)地傳給服務(wù)器析桥,服務(wù)器收到后,原封不動(dòng)地驗(yàn)證Session艰垂,若Session存在泡仗,就實(shí)現(xiàn)了Cookie和Session的綁定過(guò)程。因此猜憎,不存在Session比Cookie更安全這種說(shuō)法娩怎。如果說(shuō)不安全,也是由于代碼不安全胰柑,錯(cuò)誤地把用作身份驗(yàn)證的Cookie作為權(quán)限驗(yàn)證來(lái)使用截亦。
5. Session是創(chuàng)建在服務(wù)器上的,應(yīng)該少用Session而多用Cookie柬讨,對(duì)嗎崩瓤?
A:錯(cuò)。Cookie可以提高用戶體驗(yàn)踩官,但會(huì)加大網(wǎng)絡(luò)之間的數(shù)據(jù)傳輸量却桶,應(yīng)盡量在Cookie中僅保存必要的數(shù)據(jù)。
6. 如果把別人機(jī)器上的Cookie文件復(fù)制到我的電腦上(假設(shè)使用相同的瀏覽器)蔗牡,是不是能夠登錄別人的帳號(hào)呢肾扰?如何防范畴嘶?
A:是的。這屬于Cookie劫持的一種做法集晚。要避免這種情況窗悯,需要在Cookie中針對(duì)IP、UA等加上特殊的校驗(yàn)信息偷拔,然后和服務(wù)器端進(jìn)行比對(duì)蒋院。
7. 在IE瀏覽器下登錄某網(wǎng)站,換成Firefox瀏覽器是否仍然是未登錄狀態(tài)莲绰?使用IE登錄了騰訊網(wǎng)站后欺旧,為什么使用Firefox能保持登錄狀態(tài)?
A:不同瀏覽器使用不同的Cookie管理機(jī)制蛤签,無(wú)法實(shí)現(xiàn)公用Cookie辞友。如果使用IE登錄騰訊網(wǎng)站,使用Firefox也能登錄震肮,這是由于在安裝騰訊QQ軟件時(shí)称龙,你的電腦上同時(shí)安裝了針對(duì)這兩個(gè)瀏覽器的插件,可以識(shí)別本地已登錄QQ號(hào)碼進(jìn)而自動(dòng)登錄戳晌。本質(zhì)上鲫尊,不屬于共用Cookie的范疇。
<small>原文 : http://www.cnblogs.com/gamir/p/4307849.html