Session與cookie的區別和聯繫

小序:

1. 由於HTTP協議是無狀態的協議,所以服務端需要記錄用戶的狀態時,就需要用某種機制來識具體的用戶,這個機制就是Session.典型的場景比如購物車,當你點擊下單按鈕時,由於HTTP協議無狀態,所以並不知道是哪個用戶操作的,所以服務端要爲特定的用戶創建了特定的Session,用用於標識這個用戶,並且跟蹤用戶,這樣才知道購物車裏面有幾本書。這個Session是保存在服務端的,有一個唯一標識。在服務端保存Session的方法很多,內存、數據庫、文件都有。集羣的時候也要考慮Session的轉移,在大型的網站,一般會有專門的Session服務器集羣,用來保存用戶會話,這個時候 Session 信息都是放在內存的,使用一些緩存服務比如Memcached之類的來放 Session。
2. 思考一下服務端如何識別特定的客戶?這個時候Cookie就登場了。每次HTTP請求的時候,客戶端都會發送相應的Cookie信息到服務端。實際上大多數的應用都是用 Cookie 來實現Session跟蹤的,第一次創建Session的時候,服務端會在HTTP協議中告訴客戶端,需要在 Cookie 裏面記錄一個Session ID,以後每次請求把這個會話ID發送到服務器,我就知道你是誰了。有人問,如果客戶端的瀏覽器禁用了 Cookie 怎麼辦?一般這種情況下,會使用一種叫做URL重寫的技術來進行會話跟蹤,即每次HTTP交互,URL後面都會被附加上一個諸如 sid=xxxxx 這樣的參數,服務端據此來識別用戶。
3. Cookie其實還可以用在一些方便用戶的場景下,設想你某次登陸過一個網站,下次登錄的時候不想再次輸入賬號了,怎麼辦?這個信息可以寫到Cookie裏面,訪問網站的時候,網站頁面的腳本可以讀取這個信息,就自動幫你把用戶名給填了,能夠方便一下用戶。這也是Cookie名稱的由來,給用戶的一點甜頭。
所以,總結一下:
Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在集羣、數據庫、文件中;
Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。


COOKIE和SESSION有什麼區別?
cookie保存在客戶端,session保存在服務器端,
cookie
目的可以跟蹤會話,也可以保存用戶喜好或者保存用戶名密碼
session用來跟蹤會話


當我們登錄網站勾選保存用戶名和密碼的時候,一般保存的都是cookie,將用戶名和密碼的cookie保存到硬盤中,這樣再次登錄的時候瀏覽器直接將cookie發送到服務端驗證,直接username和password保存到客戶端,當然這樣不安全,瀏覽器也可以加密解密這樣做,每個瀏覽器都可以有自己的加密解密方式,這樣方便了用戶,再比如用戶喜歡的網頁背景色,比如QQ空間的背景,這些信息也是可以通過cookie保存到客戶端的,這樣登錄之後直接瀏覽器直接就可以拿到相應的偏好設置。

②跟蹤會話,比如某些網站中網頁有不同的訪問權限,有隻能登錄的用戶訪問的網頁或者用戶級別不同不能訪問的,但是http請求是無狀態的,每次訪問服務端是不知道是否是登錄用戶,很自然的想到在http請求報文中加入登錄標識就可以了,這個登錄標識就可以是cookie,這樣的cookie服務端要保存有所有登錄用戶的cookie,這樣請求報文來了之後拿到登錄標識cookie,在服務端進行比較久可以了。再比如購物網站,多次點擊添加商品到購物車客戶端很容易知道哪些物品在購物車中,但是服務端怎麼知道每次添加的物品放到哪個登錄用戶的購物車中呢?也需要請求報文中帶着cookie才行(在不登陸的情況下京東也是可以不斷添加商品的,推測應該是登錄的時候一併創建cookie並且發送物品信息),這些cookie都是爲了跟蹤會話用的,所以客戶端有,服務端也有,並且服務端有全部的會話cookie。

後面衍生出session技術,session技術是要使用到cookie的,之所以出現session技術,主要是爲了安全。

http是無狀態的協議,客戶每次讀取web頁面時,服務器都打開新的會話,而且服務器也不會自動維護客戶的上下文信息,那麼要怎麼才能實現網上商店中的購物車呢,session就是一種保存上下文信息的機制,它是針對每一個用戶的,變量的值保存在服務器端,通過SessionID來區分不同的客戶,session是以cookie或URL重寫爲基礎的,默認使用cookie來實現,系統會創造一個名爲JSESSIONID的輸出cookie,我們叫做session cookie,以區別persistent cookies,也就是我們通常所說的cookie,注意session cookie是存儲於瀏覽器內存中的,並不是寫到硬盤上的,這也就是我們剛纔看到的JSESSIONID


現在看一下兩者的結果:

都知道session是保存在服務器端的,實際上大多數的應用都是用 Cookie 來實現Session跟蹤的,第一次創建Session的時候,服務端會在HTTP協議中告訴客戶端,需要在 Cookie 裏面記錄一個Session ID,以後每次請求把這個會話ID發送到服務器,我就知道你是誰了。F12會看到這個SESSIONID,這個就是唯一標識用戶的


服務端是怎麼知道客戶端的多個請求是隸屬於一個Session呢?注意到後臺的那個jsessionid=4976EA9D4EBDAA7CE72CDFC1B7BBC1A4木有?原來就是通過HTTP請求報文頭的Cookie屬性的jsessionid的值關聯起來的!


我們就可以很容易的分辨出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(會話跟蹤)。

再來看看cookie,它是存於客戶端的,我們是可以直接看到的,簡單明瞭


在一些web開發的書中,往往只是簡單的把Session和cookie作爲兩種並列的http傳送信息的方式,session cookies位於服務器端,persistent cookie位於客戶端,可是session又是以cookie爲基礎的,明白的兩者之間的聯繫和區別,我們就不難選擇合適的技術來開發web service了。


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