【cookie 和 session 的那些事】

       個人學習整理,如有不足之處,請不吝指教。轉載請註明:@CSU-Max


        cookie 與 session 是常用的會話跟蹤技術。最近看了不少相關的知識,本篇文章就記錄下我的一些學習心得。


基本原理

      

        cookie 是通過客戶端記錄信息確定用戶身份, session 是通過服務器端記錄信息確定用戶身份。http 協議是無狀態的協議(”連接-請求-應答-關閉連接“的模式),當每次用戶從客戶端請求頁面時,服務器都會打開新的會話。cookie 的作用就是爲了解決 http 協議這種無狀態的不足。

       當用戶訪問某網站時,瀏覽器就會在本地硬盤上查找與該網站相關聯的 cookie 。如果該 cookie 存在,瀏覽器就將它與頁面請求一起通過 http 報頭信息發送到用戶要訪問的站點,然後系統會比較 cookie 中各個屬性和值是否與存放在服務器端(如數據庫)的信息一致,並根據比較結果確定用戶是”初訪者“還是”老客戶“。


       session 是以 cookie 或 url 重寫或隱藏表單提交爲基礎的。默認情況下使用 cookie 實現(下面在談到 session cookie 時提到),當用戶發起一個訪問請求時,服務器會檢查該請求中是否包含 sessionid,若未包含,則系統會創造一個名爲JSESSIONID 的輸出 cookie (即 session cookie),並將其以 HashTable 的形式寫到服務器的內存裏,若已包含 sessionid,服務器會檢查內存中是否有與該 session 相匹配的信息,若存在則直接使用該 sessionid,若不存在則重新生成新的 session 並在本次響應中返回給客戶端;當瀏覽器的 cookie 被禁止後,web 服務器會採用 url 重寫的方式傳遞  sessionid(一般採用的是 get 方式,我們可以在地址欄看到類似 sessionid = xxxxxx 的信息,也可以使用提交隱藏表單的形式來實現)。
       session 要麼保存在服務器端,要麼在客戶端和服務器端傳遞(cookie 或 url rewritting 或 hidden input),若使用 cookie ,則會話 cookie 中就存儲了 sessionid ,有訪問請求時就是根據 sessionid 在服務端查找相關的 session。




生命週期


       cookie 一般用於標識用戶,一般可以長久保存,用於用戶跟蹤和識別唯一用戶;而 session 的生命週期與訪問的進程一致,它記錄了一次訪問的開始到結束,當瀏覽器或或進程關閉後,session 也就消失了。
       cookie 是通過頭部 header 返回到瀏覽器並保存在磁盤中,如果用戶再次訪問該服務器,瀏覽器會自動把 cookie傳到服務器。cookie 的內容主要包括:名字,值,過期時間,路徑和域。路徑和域一起構成 cookie 的作用範圍,若不設置過期時間,則表示這個 cookie 的生命週期爲會話期間,關閉瀏覽器 cookie 就消失了。


       說到這裏,我們就可以根據過期時間將 cookie 分爲兩種:
持久 cookie(persistent cookie) :設置了 cookie 的有效時間,一般用於長期保存,該 cookie 保存在磁盤中,在多個瀏覽器會話中是共享的。
會話 cookie(session cookie): 沒有設置 cookie 的有效時間,此時 cookie 只存在瀏覽器的內存中,當用戶退出或瀏覽器關閉,此時 cookie 就失效了,此種狀況下 cookie 就和 session 很像了,默認情況下 session 就是通過會話 cookie 實現的。
注:
       一般我們所說的 cookie 指的是持久 cookie,持久 cookie 可以看到,而會話 cookie 存在內存中,一般看不到。
       cookie 是在客戶端會話狀態的存貯機制,要使用 cookie ,需要用戶打開客戶端的 cookie 支持。


       session 也是可以設置失效時間的,這裏要分兩個方面來看:瀏覽器和服務器。對服務器而言,session 與訪問進程直接相關,當瀏覽器關閉時,session 也隨之消失;而服務器端的 session 的失效時間一般是人爲設置的,目的是能定期釋放內存空間,減小服務器壓力。一般都會設置一個定長時間,若這段時間內,當前會話處於非活動狀態,就會清除該 session。所以說 session 的中斷也不一定意味着用戶離開了網站。
注:
       這裏強調是瀏覽器關閉,是因爲現在很多的瀏覽器都是多進程的 session 共享,即通過多個標籤或頁面打開多個進程訪問同意網站時會共享 seesion,只有當瀏覽器關閉時纔會被清除。也就是說有可能用戶在標籤中關閉了該網站,而未關閉瀏覽器,同時服務器端的 seesion 也還沒有到自動清除的時間,那麼若用戶重新打開該網站,那麼使用的還是原 session 進行瀏覽的。


其他

       cookie 一般不是很安全,針對 cookie 的攻擊也是有很多,數據存儲在客戶端磁盤,因此信息很容易泄漏。
       session 則會在服務器上保存,當訪問增多時,會在一定程度上影響服務器的性能。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章