Session 和 Cookie


Session基礎知識:   

   會話(session)是一種持久網絡協議,在客戶端和服務器端之間建立關聯,從而起到交換數據包的作用機制,session在網絡協議(例如telnet或FTP)中是非常重要的部分。會話層建立、維持並同步兩個正在通信的系統(進程)之間的交互。

   HTTP傳輸協議無法長時間駐留會話層,會話的維持需要在傳輸數據中的高級別程序。例如,在瀏覽器和遠程服務器之間的HTTP傳輸中,HTTP的cookie就被用來包含一些會話相關的信息,比如session ID,參數和權限信息等。

軟件實現:

    TCP協議中的 會話通常是通過子進程和(或)多線程在軟件中實現的,當計算機建立或者加入一個會話時即創建一個新的進程或線程。HTTP 會話通常不會針對每個會話創建一個線程,而是由一個儲存每個會話狀態信息的數據庫實現的。

     當客戶端在多個服務器調取數據時,保持會話狀態的一致性是需要注意的,多個服務器端需要共享一個儲存會話信息的文件系統或者數據庫。否則,當用戶在一個新的而不是一開始保存會話信息的主機上提交訪問請求的時候,新的主機會因爲無法獲知原來主機的會話的訪問狀態而產生問題。(session共享)


服務端的會話:

    在負載均衡集羣中,服務端的會話需要是快速而高效的,可以通過共享存儲或者設立獨立的存儲服務器來解決session共享的問題。



客戶端的會話:

    客戶端會話使用了Cookie和加密技術來完成會話層的數據存儲需求。


服務端會話和客戶端會話的協作:

    在動態頁面完成解析的時候,服務器上儲存在會話(session)中的變量會被壓縮後傳輸給客戶端的Cookie。此時完全依靠客戶端的文件系統(硬盤cookie)來保存這些數據(或者內存cookie)。

    在每一個成功的請求中,Cookie中都保存有服務器端用戶所具有的身份證明(PHP中的session id)或者更爲完整的數據雖然這樣的機制可以保存數據的前後關聯,但是必須要保障數據的完整性和安全性。

=============================================================================================


cookie基礎知識

    Cookie(複數形態Cookies),中文名稱爲“小型文本文件”或“小甜餅”,指某些網站爲了辨別用戶身份而儲存在用戶本地終端(Client Side)上的數據(通常經過加密)。定義於RFC2109。是網景公司的前僱員盧·蒙特利在1993年3月的發明。

    

cookie分類:

   Cookie總是保存在客戶端中,按在客戶端中的存儲位置,可分爲內存Cookie和硬盤Cookie。

   內存Cookie由瀏覽器維護,保存在內存中,瀏覽器關閉後就消失了,其存在時間是短暫的。硬盤Cookie保存在硬盤裏,有一個過期時間,除非用戶手工清理或到了過期時間,硬盤Cookie不會被刪除,其存在時間是長期的。所以,按存在時間,可分爲非持久Cookie和持久Cookie。
cookie作用:
    因爲HTTP協議不能長期駐留會話層,也即HTTP協議是無狀態的,服務器不知道與它進行會話的用戶上一次做了什麼,這嚴重阻礙了交互式Web應用程序的實現。cookie卻能很好的解決這個問題:服務器可以設置讀取Cookies中包含的信息,藉此維護用戶跟服務器會話中的狀態。
應用場景:
    典型的網上購物場景中,用戶瀏覽了幾個頁面,買了一盒餅乾和兩飲料。最後結帳時,由於HTTP的無狀態性,不通過額外的手段,服務器並不知道用戶到底買了什麼。所以Cookie就是用來繞開HTTP的無狀態性的“額外手段”之一。
    在剛纔的購物場景中,當用戶選購了第一項商品,服務器在向用戶發送網頁的同時,還發送了一段Cookie,記錄着那項商品的信息。當用戶訪問另一個頁面,瀏覽器會把Cookie發送給服務器,於是服務器知道他之前選購了什麼。用戶繼續選購飲料,服務器就在原來那段Cookie裏追加新的商品信息。結帳時,服務器讀取發送來的Cookie就行了。

    Cookie另一個典型的應用是當登錄一個網站時,網站往往會請求用戶輸入用戶名和密碼,並且用戶可以勾選“下次自動登錄”。如果勾選了,那麼下次訪問同一網站時,用戶會發現沒輸入用戶名和密碼就已經登錄了。這正是因爲前一次登錄時,服務器發送了包含登錄憑據(用戶名加密碼的某種加密形式)的Cookie到用戶的硬盤上。第二次登錄時,(如果該Cookie尚未到期)瀏覽器會發送該Cookie到服務器,服務器驗證憑據,於是不必輸入用戶名和密碼就讓用戶登錄了。


Cookie的缺陷:

   (1)Cookie會被附加在每個HTTP請求中,所以無形中增加了流量。

   (2)由於在HTTP請求中的Cookie是明文傳遞的,所以安全性成問題。(除非用HTTPS)
   (3)Cookie的大小限制在4KB左右。對於複雜的存儲需求來說是不夠用的。


偷竊Cookies和腳本攻擊:

   雖然Cookies沒有中電腦病毒那麼危險,但它仍包含了一些敏感消息:用戶名,電腦名,使用的瀏覽器和曾經訪問的網站。用戶不希望這些內容泄漏出去,尤其是當其中還包含有私人信息的時候。

這並非危言聳聽,跨站點腳本(Cross site scripting)可以達到此目的。在受到跨站點腳本攻擊時,Cookie盜賊和Cookie毒藥將竊取內容。一旦Cookie落入攻擊者手中,它將會重現其價值。
   Cookie盜賊:蒐集用戶Cookie併發給攻擊者的黑客。攻擊者將利用Cookie消息通過合法手段進入用戶帳戶。
   Cookie投毒:一般認爲,Cookie在儲存和傳回服務器期間沒有被修改過,而攻擊者會在Cookie送回服務器之前對其進行修改,達到自己的目的。例如,在一個購物網站的Cookie中包含了顧客應付的款項,攻擊者將該值改小,達到少付款的目的。這就是Cookie投毒。

=============================================================================================

                                                        

                      來來來,大家隨意品嚐......


深入理解:參考鏈接http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html 

 
    當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇,都紀錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的 Cookie 資料,有的話,就會依據 Cookie 裏的內容來判斷使用者,送出特定的網頁內容給你。 Cookie 的使用很普遍,許多有提供個人化服務的網站,都是利用 Cookie 來辨認使用者,以方便送出使用者量身定做的內容,像是 Web 接口的免費 email 網站,都要用到 Cookie。
 
 
具體來說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的名字都是類似於SEEESIONID。但cookie可以被人爲的禁止,則必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞迴服務器。經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面。還有一種技術叫做表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞迴服務器。比如:
  1. <form name="testform" action="/xxx">
  2. <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
  3. <input type="text">
  4. </form>
實際上這種技術可以簡單的用對action應用URL重寫來代替。

cookie 和 session 的區別:
 
1、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
2、cookie不是很安全,別人可以分析存放在本地的 COOKIE 並進行 COOKIE 欺騙考慮到安全應當使用session。
3、session會在一定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。
4、單個cookie保存的數據不能超過4K,很多瀏覽器都限制一個站點最多保存20個cookie。 
5、所以個人建議:
   將登陸信息等重要信息存放爲SESSION
   其他信息如果需要保留,可以放在COOKIE中 
6、關於cookie session的形象比喻: 咖啡館滿五杯送一杯的活動。http是無狀態的。
 
  1.    服務員完全記住每個顧客的數量,及這次應該是收費還是免費 (對應 是有狀態的)。
  2.  
  3.    顧客有個會員卡,每消費一次店裏蓋章,卡有用戶持有。(cookie
  4.  
  5.   顧客有卡號,記錄有店主來記錄器消費記錄。信息由咖啡店持有(session





根據所學知識以及wiki整理而來,如有不恰當之處,還請大家指正,學無止境,共同進步.


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