Session + Cookie 知識收集!
cookie機制採用的是在客戶端保持狀態的方案。它是在使用者端的會話狀態的存貯機制,他需要使用者開啟客戶端的cookie支援。cookie的作用就是為了解決HTTP協議無狀態的缺陷所作的努力.
而 session機制採用的是一種在客戶端與伺服器之間保持狀態的解決方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要儲存一個標識, 所以session機制可能需要藉助於cookie機制來達到儲存標識的目的。而session提供了方便管理全域性變數的方式
session是針對每一個使用者的,變數的值儲存在伺服器上,用一個sessionID來區分是哪個使用者session變數,這個值是通過使用者的瀏覽器在訪問的時候返回給伺服器,當客戶禁用cookie時,這個值也可能設定為由get來返回給伺服器。
就安全性來說:當你訪問一個使用session 的站點,同時在自己機子上建立一個cookie,建議在伺服器端的SESSION機制更安全些.因為它不會任意讀取客戶儲存的資訊。
cookie機制。正統的cookie分發是通過擴充套件HTTP協議來實現的,伺服器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端指令碼如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由瀏覽器按照一定的原則在後臺自動傳送給伺服器的。瀏覽器檢查所有儲存的cookie,如果某個cookie所宣告的作用範圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上傳送給伺服器。
cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用範圍。若不設定過期時間,則表示這個cookie的生命期為瀏覽器會話期間,關閉瀏覽器視窗,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。
會話cookie一般不儲存在硬碟上而是儲存在記憶體裡,當然這種行為並不是規範規定的。若設定了過期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie仍然有效直到超過設定的過期時間。儲存在硬碟上的cookie可以在不同的瀏
覽器程式間共享,比如兩個IE視窗。而對於儲存在記憶體裡的cookie,不同的瀏覽器有不同的處理方式session機制。session機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表的結構(也可能就是使用雜湊表)來儲存資訊。
當程式需要為某個客戶端的請求建立一個session時,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識(稱為session id),如果已包含則說明以前已經為此客戶端建立過session,伺服器就按照session id把這個session檢索出來
使用(檢索不到,會新建一個),如果客戶端請求不包含session id,則為此客戶端建立一個session並且生成一個與此session相關聯的session id,session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個session id將被在本次響應
中返回給客戶端儲存。儲存這個session id的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識傳送給伺服器。一般這個cookie的名字都是類似於SEEESIONID,而。比如weblogic對於web應用程式生成的 cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。
由於cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞迴伺服器。經常被使 用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面,附加方式也有兩種,一種是作為URL路徑的附加資訊,表現形式為 http://...../xxx;jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764.另一種是作為查詢字串附加在URL後面,表現形式為http://...../xxx?sessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
這兩種方式對於使用者來說是沒有區別的,只是伺服器在解析的時候處理的方式不同,採用第一種方式也有利於把session id的資訊和正常程式引數區分開來。為了在整個互動過程中始終保持狀態,就必須在每個客戶端可能請求的路徑後面都包含這個session id。
另一種技術叫做表單隱藏欄位。就是伺服器會自動修改表單,新增一個隱藏欄位,以便在表單提交時能夠把session id傳遞迴伺服器。比如下面的表單
<form name="testform" action="/xxx">
<input type="text">
</form>
在被傳遞給客戶端之前將被改寫成
<form name="testform" action="/xxx">
<input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
<input type="text">
</form>
這種技術現在已較少應用,筆者接觸過的很古老的iPlanet6(SunONE應用伺服器的前身)就使用了這種技術。實際上這種技術可以簡單的用對action應用URL重寫來代替。
在談論session機制的時候,常常聽到這樣一種誤解“只要關閉瀏覽器,session就消失了”。其實可以想象一下會員卡的例子, 除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是一樣的,除非程式通知伺服器刪除一個session,否則服 務器會一直保留,程式一般都是在使用者做log off的時候發個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知伺服器它將要關閉,因此 伺服器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來儲存session id,而關閉瀏 覽器後這個 session id就消失了,再次連線伺服器時也就無法找到原來的session。如果伺服器設定的cookie被儲存到硬碟上,或者使用某種手段改寫 瀏覽器發出的HTTP請求頭,把原來的session id傳送給伺服器,則再次開啟瀏覽器仍然能夠找到原來的session。
恰恰是由於關閉瀏覽器不會導致session被刪除,迫使伺服器為seesion設定了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,伺服器就可以認為客戶端已經停止了活動,才會把session刪除以節省儲存空間。
http是無狀態的協議,客戶每次讀取web頁面時,伺服器都開啟新的會話,而且伺服器也不會自動維護客戶的上下文資訊, 那麼要怎麼才能實現網上商店中的購物車呢,session就是一種儲存上下文資訊的機制,它是針對每一個使用者的,變數的值儲存在伺服器端,通過 SessionID來區分不同的客戶,session是以cookie或URL重寫為基礎的,預設使用cookie來實現,系統會創造一個名為 JSESSIONID的輸出cookie,我們叫做session cookie,以區別persistent cookies,也就是我們通常所說的cookie,注意session cookie是儲存於瀏覽器記憶體中的,並不是寫到硬碟上的,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但 是當我們把瀏覽器的cookie禁止後,web伺服器會採用URL重寫的方式傳遞Sessionid,我們就可以在位址列看到 sessionid=KWJHUG6JJM65HS2K6之類的字串。
明白了原理,我們就可以很容易的分辨出 persistent cookies和session cookie的區別了,網上那些關於兩者安全性的討論也就一目瞭然了,session cookie針對某一次會話而言,會話結束session cookie也就隨著消失了,而persistent cookie只是存在於客戶端硬碟上的一段文字(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站指令碼攻擊,自然不如 session cookie安全了。
通常session cookie是不能跨視窗使用的,當你新開了一個瀏覽器視窗進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們資訊共享的目的就達不到 了,此時我們可以先把sessionid儲存在persistent cookie中,然後在新視窗中讀出來,就可以得到上一個視窗SessionID了,這樣通過session cookie和persistent cookie的結合我們就實現了跨視窗的session tracking(會話跟蹤)。
在一些web開發的書中,往 往只是簡單的把Session和cookie作為兩種並列的http傳送資訊的方式,session cookies位於伺服器端,persistent cookie位於客戶端,可是session又是以cookie為基礎的,明白的兩者之間的聯絡和區別,我們就不難選擇合適的技術來開發web service了。
cookie與session的區別是, cookie資料儲存在客戶端,session資料儲存在伺服器端。簡單的說, 當你登入一個網站的時候,如果web伺服器端使用的是session,那麼所有的資料都儲存在伺服器上面,客戶端每次請求伺服器的時候會傳送當前會話的 sessionid,伺服器根據當前sessionid判斷相應的使用者資料標誌,以確定使用者是否登入,或具有某種許可權。由於資料是儲存在伺服器上面,所以 你不能偽造,但是如果你能夠獲取某個登入使用者的sessionid,用特殊的瀏覽器偽造該使用者的請求也是能夠成功的。sessionid是伺服器和客戶端 連結時候隨機分配的,一般來說是不會有重複,但如果有大量的併發請求,也不是沒有重複的可能性,我曾經就遇到過一次。登入某個網站,開始顯示的是自己的信 息,等一段時間超時了,一重新整理,居然顯示了別人的資訊。
如果瀏覽器 使用的是 cookie,那麼所有的資料都儲存在瀏覽器端,比如你登入以後,伺服器設定了 cookie使用者名稱(username),那麼,當你再次請求 伺服器的時候,瀏覽器會將username一塊傳送給伺服器,這些變數有一定的特殊標記。伺服器會解釋為 cookie變數。所以只要不關閉瀏覽器,那 麼 cookie變數便一直是有效的,所以能夠保證長時間不掉線。如果你能夠截獲某個使用者的 cookie變數,然後偽造一個資料包傳送過去,那麼伺服器 還是認為你是合法的。所以,使用 cookie被攻擊的可能性比較大。如果設定了的有效時間,那麼它會將 cookie儲存在客戶端的硬碟上,下次再訪問 該網站的時候,瀏覽器先檢查有沒有 cookie,如果有的話,就讀取該 cookie,然後傳送給伺服器。如果你在機器上面儲存了某個論 壇 cookie,有效期是一年,如果有人入侵你的機器,將你的 cookie拷走,然後放在他的瀏覽器的目錄下面,那麼他登入該網站的時候就是用你的 的身份登入的。所以 cookie是可以偽造的。當然,偽造的時候需要主意,直接copy cookie檔案到 cookie目錄,瀏覽器是不認的, 他有一個index.dat檔案,儲存了 cookie檔案的建立時間,以及是否有修改,所以你必須先要有該網站的 cookie檔案,並且要從保證時間 上騙過瀏覽器,曾經在學校的vbb論壇上面做過試驗,copy別人的 cookie登入,冒用了別人的名義發帖子,完全沒有問題。
cookie 和session 的區別
1、cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session
3、session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能
考慮到減輕伺服器效能方面,應當使用COOKIE
4、單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能3K。
5、所以個人建議:
將登陸資訊等重要資訊存放為SESSION
其他資訊如果需要保留,可以放在COOKIE中
比喻:
Cookie:
發給顧客一張卡片,上面記錄著消費的數量,一般還有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以後的消費相聯絡起來。這種做法就是在客戶端保持狀態。 【卡上記錄所有資訊,而店家只認卡不認人。】
Session:
發給顧客一張會員卡,除了卡號之外什麼資訊也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裡的紀錄本上找到這個卡號對應的紀錄新增一些消費資訊。這種做法就是在伺服器端保持狀態。 【只記使用者ID,而ID的詳細記錄放在店家的資料庫裡;每次憑ID檢索伺服器的記錄。】
【 這裡用一個形象的比喻來解釋session的工作方式。假設 Web Server是一個商場的存包處,HTTP Request是一個顧客,第一次來到存包處,管理員把顧客的物品存放在某一個櫃子裡面(這個櫃子就 相當於Session),然後把一個號碼牌交給這個顧客,作為取包憑證(這個號碼牌就是Session ID)。顧客(HTTP Request)下一次 來的時候,就要把號碼牌(Session ID)交給存包處(Web Server)的管理員。管理員根據號碼牌(Session ID)找到相應的櫃子 (Session),根據顧客(HTTP Request)的請求,Web Server可以取出、更換、新增櫃子(Session)中的物 品,Web Server也可以讓顧客(HTTP Request)的號碼牌和號碼牌對應的櫃子(Session)失效。顧客 (HTTP Request)的忘性很大,管理員在顧客回去的時候(HTTP Response)都要重新提醒顧客記住自己的號碼牌 (Session ID)。這樣,顧客(HTTP Request)下次來的時候,就又帶著號碼牌回來了。 我們可以看到,Session ID實際上是 在客戶端和服務端之間通過HTTP Request和HTTP Response傳來傳去的。】
為什麼登陸後,只要不關閉瀏覽器,session就能一直存在?當然session的資料是儲存在伺服器上的,但伺服器是怎麼識別這些資料都是誰的呢?
答 案是sessionid,每一個瀏覽者都唯一的sessionid,這就很好的區分了不同瀏覽者的不同session了.
sessionid是怎麼產生 的?
應該是第一次訪問伺服器的時候隨即生成的.假如是111,然後他的登陸資訊是true,伺服器就知道sessionid為111已經登陸了,這些資訊 都存在了伺服器上了.
但當瀏覽者繼續操作的時候,也就是開啟該系統的另一個頁面的時候sessionid怎麼辦?如何傳遞?
開啟另一個頁面的時候其實相當 於重新訪問系統,如果沒有特殊的處理機制,系統會再次重新分配一個sessionid的,這樣的話就失去意義了~!所以sessionid在第一次訪問後 應該存在了客戶端.
能寸哪呢?
當然,只能寸在cookie中了,這就是為什麼關閉cookie,session就失去作用了
找到這麼個例子來描述cookie session的關係再恰當不過了
一家咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案:
1、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎麼對待了。這種做法就是協議本身支援狀態。
2、發給顧客一張卡片,上面記錄著消費的數量,一般還有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以後的消費相聯絡起來。這種做法就是在客戶端保持狀態。
3、發給顧客一張會員卡,除了卡號之外什麼資訊也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裡的紀錄本上找到這個卡號對應的紀錄新增一些消費資訊。這種做法就是在伺服器端保持狀態。
第 一種情況暫時不考慮.看第二種情況,卡片無疑就是cookie了,所有的資料如果都存在卡片上是不安全的,也是容易遺失的(卡片被修改了?卡片遺失了?這 都是有可能的).所以才用了第三種情況.客戶除了個會員號再什麼資訊也沒有,這是最安全的,但這個會員號必須是客戶自己知道的!也就是cookie中必須 儲存的.