WEB開發中的cookie與session

weixin_34185560發表於2015-11-20

會話控制

會話控制思想就是能夠在網站中跟蹤一個使用者,我們跟蹤使用者就可以做到對使用者的支援,並根據授權和使用者身份顯示不同內容、不同頁面。
HTTP是一個無狀態的協議,HTTP協議無法來維護兩個事務之間聯絡。當一個使用者在請求一個頁面後再請求另外其他頁面時,HTTP將無法告訴我們這兩個請求是來自同一個使用者。這是因為每一個HTTP的處理(一個請求和相應的回覆)都是相互獨立的,在HTTP中沒有持續狀態是非常穩定的,因為減少了很多額外的資訊互動。

HTTP中沒有持續狀態也使Web應用的發展出現了問題,因為我們想要“記住”使用者但是在請求中無法讓我們去區分不同客戶。
當靜態網站發展到動態網站時,我們需要面對維護某種狀態,出現了會話控制。PHP的會話是通過唯一的會話ID來驅動的,會話ID是一個加密的隨機數字。它可以儲存在使用者機器裡的Cookie中,或者通過URL在網路上傳遞。

會話ID就像一把鑰匙,允許我們註冊一些特定的變數,也稱為會話變數。這些變數的內容儲存在伺服器端。會話ID是客戶端唯一可見的資訊。如果在一次特定的網站連線中,客戶端可以通過Cookie或URL看到會話ID,那麼我們就可以訪問該會話儲存在伺服器上的會話變數。

Cookie和session都是可以暫時儲存在多個頁面中使用的變數,但是它們有本質的區別。

Cookie存放在客戶端瀏覽器中,session儲存在伺服器上。

Cookie介紹

Cookies現在經常被大家提到,那麼到底什麼是cookies,它有什麼作用呢?cookies是一種能夠讓網站伺服器把少量資料儲存到客戶端的硬碟或記憶體,或是從客戶端的硬碟讀取資料的一種技術。Cookies是當瀏覽某網站時,由WEB伺服器置於硬碟上的一個非常小的文字檔案,它可以記錄使用者ID、密碼、瀏覽過的網頁、停留的時間等資訊。當再次來到該網站時,網站通過讀取cookies,得知你的相關資訊,就可以做出相應的動作,如在頁面顯示歡迎你的標語,或者讓你不用輸入ID、密碼就直接登入等。

從本質上講,它可以看作是你的身份證。但cookie不能作為程式碼執行,也不會傳送病毒,且為你所專有,並只能由提供它的伺服器來讀取。儲存的資訊片斷以“名/值”對(name-valuepairs)的形式儲存,一個“名/值”對僅僅是一條命名的資料。一個網站只能取得它放在你的電腦中的資訊,它無法從其它的cookies檔案中取得資訊,也無法得到你的電腦上的其它任何東西。Cookies中的內容大多數經過了加密處理,因此一般使用者看來只是一些毫無意義的字母數字組合,只有伺服器的CGI處理程式才知道它們真正的含義。

要了解cookie,必不可少地要知道它的工作原理。一般來說,cookie通過HTTP Headers從伺服器端返回到瀏覽器上。首先,伺服器端在響應中利用set-cookie header來建立一個cookie,然後,瀏覽器在它的請求中通過cookie header包含這個已經建立的cookie,並且將它返回至伺服器,從而完成瀏覽器的認證。

Session介紹

Session中文經常翻譯為會話,其本來的含義是指有始有終的一系列動作/訊息。比如,打電話時從拿起電話撥號到結束通話電話這中間的一系列過程可以稱之為一個session

然而當session一詞與網路協議相關聯時,它又往往隱含了“面向連線”和/或“保持狀態”這樣兩個含義,“面向連線”指的是在通訊雙方在通訊之前要先建立一個通訊的渠道,如打電話,直到對方接了電話通訊才能開始,與此相對的是寫信,在你把信發出去的時候你並不能確認對方的地址是否正確,通訊渠道不一定能建立,但對發信人來說,通訊已經開始了。“保持狀態”則是指通訊的一方能夠把一系列的訊息關聯起來,使得訊息之間可以互相依賴。

而到了web伺服器蓬勃發展的時代,session在web開發語境下的語義又有了新的發展,它的含義是指一類用來在客戶端與伺服器端之間保持狀態的解決方案。

有時候session也用來指這種解決方案的儲存結構,如“把XXX儲存在session裡”。由於各種用於WEB開發的語言在一定程度上都提供了對這種解決方案的支援,所以在某種特定語言的語境下,session也被用來指代該語言的解決方案。

Cookie與session比較

具體來說,cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要儲存一個標誌,所以session機制可能需要藉助於cookie機制來達到儲存標誌的目的,但實際上它還有其他選擇。

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的名字都是類似於SESSIONID。但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞迴服務端。
經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面。還有一種技術叫做表單隱藏欄位,就是伺服器會自動修改表單,新增一個隱藏欄位,以便在表單提交時能夠把session id 傳遞迴伺服器。

相關文章