1. 程式人生 > >理解Cookie和Session及其區別

理解Cookie和Session及其區別

前言

HTTP是一種無狀態的協議,為了分辨連結是誰發起的,就需要我們自己去解決這個問題。不然有些情況下即使是同一個網站我們每開啟一個頁面也都要登入一下。而Session和Cookie就是為解決這個問題而提出來的兩個機制。

什麼是cookie和session

cookie:

在網站中,http請求是無狀態的。也就是說即使第一次和伺服器連線後並且登入成功後,第二次請求伺服器依然不能知道當前請求是哪個使用者。cookie的出現就是為了解決這個問題,第一次登入後伺服器返回一些資料(cookie)給瀏覽器,然後瀏覽器儲存在本地,當該使用者傳送第二次請求的時候,就會自動的把上次請求儲存的cookie資料自動的攜帶給伺服器,伺服器通過瀏覽器攜帶的資料就能判斷當前使用者是哪個了。cookie儲存的資料量有限,不同的瀏覽器有不同的儲存大小,但一般不超過4KB。因此使用cookie只能儲存一些小量的資料。

通俗講,Cookie是訪問某些網站以後在本地儲存的一些網站相關的資訊,下次再訪問的時候減少一些步驟。另外一個更準確的說法是:Cookies是伺服器在本地機器上儲存的小段文字並隨每一個請求傳送至同一個伺服器,是一種在客戶端保持狀態的方案。

cookie機制:

正統的cookie分發是通過擴充套件HTTP協議來實現的,伺服器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端指令碼如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由瀏覽器按照一定的原則在後臺自動傳送給伺服器的。瀏覽器檢查所有儲存的cookie,如果某個cookie所宣告的作用範圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上傳送給伺服器。

Cookie的主要內容包括

名字,值,過期時間,路徑和域。使用Fiddler抓包就可以看見,比方說我們開啟百度的某個網站可以看到Headers包括Cookie.

key, value形式:過期時間可設定的,如不設,則瀏覽器關掉就消失了,儲存在記憶體當中,否則就按設定的時間來儲存在硬碟上的,過期後自動清除,比方說開關機關閉再開啟瀏覽器後他都會還存在,前者稱之為Session cookie 又叫 transient cookie,後者稱之為Persistent cookie 又叫 permenent cookie。路徑和域就是對應的域名,a網站的cookie自然不能給b用。

session:

Session是存在伺服器的一種用來存放使用者資料的類HashTable結構。伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來儲存資訊。ession和cookie的作用有點類似,都是為了儲存使用者相關的資訊。不同的是,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。

當瀏覽器 第一次傳送請求時,伺服器自動生成了一個HashTable和一個Session ID用來唯一標識這個HashTable,並將其通過響應傳送到瀏覽器。當瀏覽器第二次傳送請求,會將前一次伺服器響應中的Session ID放在請求中一併傳送到伺服器上,伺服器從請求中提取出Session ID,並和儲存的所有Session ID進行對比,找到這個使用者對應的HashTable。一般這個值會有個時間限制,超時後毀掉這個值,預設30分鐘。

當用戶在應用程式的 Web頁間跳轉時,儲存在 Session 物件中的變數不會丟失而是在整個使用者會話中一直存在下去。

Session的實現方式和Cookie有一定關係。建立一個連線就生成一個session id,開啟幾個頁面就好幾個了,這裡就用到了Cookie,把session id存在Cookie中,每次訪問的時候將Session id帶過去就可以識別了.

cookie和session的安全性問題:

session:

如果web伺服器端使用的是session,那麼所有的資料都儲存在伺服器上。

客戶端每次請求伺服器的時候會發送當前會話的sessionid,伺服器根據當前sessionid判斷相應的使用者資料標誌,以確定使用者是否登入或具有某種許可權。由於資料是儲存在伺服器上面,所以你不能偽造,

但是如果你能夠獲取某個登入使用者的sessionid,用特殊的瀏覽器偽造該使用者的請求也是能夠成功的。

sessionid是伺服器和客戶端連結時候隨機分配的,一般來說是不會有重複,但如果有大量的併發請求,也不是沒有重複的可能性.

cookie:

如果瀏覽器使用的是cookie,那麼所有的資料都儲存在瀏覽器端.

比如你登入以後,伺服器設定了cookie使用者名稱,那麼當你再次請求伺服器的時候,瀏覽器會將使用者名稱一塊傳送給伺服器,這些變數有一定的特殊標記。伺服器會解釋為cookie變數,所以只要不關閉瀏覽器,那麼cookie變數一直是有效的,所以能夠保證長時間不掉線。

如果你能夠截獲某個使用者的cookie變數,然後偽造一個數據包傳送過去,那麼伺服器還是認為你是合法的。所以,使用cookie被攻擊的可能性比較大。

如果設定了的有效時間,那麼它會將cookie儲存在客戶端的硬碟上,下次再訪問該網站的時候,瀏覽器先檢查有沒有 cookie,如果有的話,就讀取該cookie,然後傳送給伺服器。

如果你在機器上面儲存了某個論壇 cookie,有效期是一年,如果有人入侵你的機器,將你的cookie拷走,然後放在他的瀏覽器的目錄下面,那麼他登入該網站的時候就是用你的的身份登入的。

所以cookie是可以偽造的。當然,偽造的時候需要注意,直接copy cookie檔案到cookie目錄,瀏覽器是不認的,他有一個index.dat檔案,儲存了cookie檔案的建立時間,以及是否有修改,所以你必須先要有該網站的 cookie檔案,並且要從有效時間上騙過瀏覽器。

cookie 和session 的區別:

1、cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。

2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙。考慮到安全應當使用session。

3、Session過多時會消耗伺服器資源,大型網站會有專門Session伺服器,Cookie存在客戶端沒問題。

4、單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。

5、將登陸資訊等重要資訊存放為SESSION       其他資訊如果需要保留,可以放在COOKIE中

6、儲存資料量方面:session 能夠儲存任意的 java 物件,cookie 只能儲存 String 型別的物件

7、一個在客戶端一個在服務端。因Cookie在客戶端所以可以編輯偽造,不是十分安全。

8、域的支援範圍不一樣,比方說a.com的Cookie在a.com下都能用,而www.a.com的Session在api.a.com下都不能用,解決這個問題的辦法是JSONP或者跨域資源共享。

單點登入中,cookie 被禁用了怎麼辦?(一點登陸,子網站其他系統不用再登陸)

單點登入的原理是後端生成一個 session ID,設定到 cookie,後面所有請求瀏覽器都會帶上cookie,然後服務端從cookie獲取 session ID,查詢到使用者資訊。所以,保持登入的關鍵不是cookie,而是通過cookie 儲存和傳輸的 session ID,本質是能獲取使用者資訊的資料。

1. 除了cookie,還常用 HTTP 請求頭來傳輸。但這個請求頭瀏覽器不會像cookie一樣自動攜帶,需手工處理

2.經常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的後面。還有一種技術叫做表單隱藏欄位。就是伺服器會自動修改表單,新增一個隱藏欄位,以便在表單提交時能夠把session id傳遞迴伺服器。比如: <form name="testform" action="/xxx"> <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"> <input type="text"> </form> 實際上這種技術可以簡單的用對action應用URL重寫來代替。