認識cookie與session的區別與應用

2021-08-14 14:06:45 字數 3279 閱讀 2289

通常我們所說的瀏覽器

自動儲存密碼,下次不用登陸,網頁換**,使用者引導,提示一次就不再出現的內容,大部分通過cookie或者session來實現的,在這次製作使用者引導中,本人就用到了cookie的內容,鑑於之前沒有詳細的了解,本文將深入的講解兩者的區別以及應用。·

使用js來設定、讀取、刪除cookie的最佳**(附換膚應用)

cookie是瀏覽器(user agent)訪問一些**後,這些**存放在客戶端的一組資料,用於使**等跟蹤使用者,實現使用者自定義功能。

cookie的domain和path屬性標識了這個cookie是哪乙個**傳送給瀏覽器的;cookie的expires屬性標識了cookie的有效時間,當cookie的有效時間過了之後,這些資料就被自動刪除了。

如 果不設定過期時間,則表示這個cookie生命週期為瀏覽器會話期間,只要關閉瀏覽器視窗,cookie就消失了。這種生命期為瀏覽會話期的cookie 被稱為會話cookie。會話cookie一般不儲存在硬碟上而是儲存在記憶體裡。如果設定了過期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次 開啟瀏覽器,這些cookie依然有效直到超過設定的過期時間。儲存在硬碟上的cookie可以在不同的瀏覽器程序間共享,比如兩個ie視窗。而對於儲存 在記憶體的cookie,不同的瀏覽器有不同的處理方式。

session 是存放在伺服器端的類似於hashtable結構(每一種web

開發技術的實現可能不一樣,下文直接稱之為hashtable)來存放使用者資料,當瀏覽器 第一次傳送請求時,伺服器自動生成了乙個hashtable和乙個session id用來唯一標識這個hashtable,並將其通過響應傳送到瀏覽器。當瀏覽器第二次傳送請求,會將前一次伺服器響應中的session id放在請求中一併發送到伺服器上,伺服器從請求中提取出session id,並和儲存的所有session id進行對比,找到這個使用者對應的hashtable。

一般情況下,伺服器會在一定時間內(預設20分鐘)儲存這個 hashtable,過了時間限制,就會銷毀這個hashtable。在銷毀之前,程式設計師可以將使用者的一些資料以key和value的形式暫時存放在這個 hashtable中。當然,也有使用資料庫將這個hashtable序列化後儲存起來的,這樣的好處是沒了時間的限制,壞處是隨著時間的增加,這個資料 庫會急速膨脹,特別是訪問量增加的時候。一般還是採取前一種方式,以減輕伺服器壓力。

session的客戶端實現形式(即session id的儲存方法)

一般瀏覽器提供了兩種方式來儲存,還有一種是程式設計師使用html

隱藏域的方式自定義實現:

[1] 使用cookie來儲存,這是最常見的方法,本文「記住我的登入狀態」功能的實現正式基於這種方式的。伺服器通過設定cookie的方式將session id傳送到瀏覽器。如果我們不設定這個過期時間,那麼這個cookie將不存放在硬碟上,當瀏覽器關閉的時候,cookie就消失了,這個session id就丟失了。如果我們設定這個時間為若干天之後,那麼這個cookie會儲存在客戶端硬碟中,即使瀏覽器關閉,這個值仍然存在,下次訪問相應**時,同 樣會傳送到伺服器上。

[3] 第三種方式是在頁面表單裡面增加隱藏域,這種方式實際上和第二種方式一樣,只不過前者通過get方式傳送資料,後者使用post方式傳送資料。但是明顯後者比較麻煩。

cookie資料儲存在客戶端,session資料儲存在伺服器端。

簡 單的說,當你登入乙個**的時候,如果web伺服器端使用的是session,那麼所有的資料都儲存在伺服器上面,客戶端每次請求伺服器的時候會傳送 當前會話的sessionid,伺服器根據當前sessionid判斷相應的使用者資料標誌,以確定使用者是否登入,或具有某種許可權。由於資料是儲存在伺服器 上面,所以你不能偽造,但是如果你能夠獲取某個登入使用者的sessionid,用特殊的瀏覽器偽造該使用者的請求也是能夠成功的。sessionid是服務 器和客戶端鏈結時候隨機分配的,一般來說是不會有重複,但如果有大量的併發請求,也不是沒有重複的可能性,我曾經就遇到過一次。登入某個**,開始顯示的 是自己的資訊,等一段時間超時了,一重新整理,居然顯示了別人的資訊。

如果瀏覽器使用的是 cookie,那麼所有的資料都儲存在瀏覽器端,比如你登入以後,伺服器設定了 cookie使用者名稱(username),那麼,當你再次請求伺服器的時候,瀏覽器會將username一塊傳送給伺服器,這些變數有一定的特殊標記。服 務器會解釋為 cookie變數。所以只要不關閉瀏覽器,那麼 cookie變數便一直是有效的,所以能夠保證長時間不掉線。如果你能夠截獲某個使用者的 cookie變數,然後偽造乙個資料報傳送過去,那麼伺服器還是認為你是合法的。所以,使用 cookie被攻擊的可能性比較大。如果設定了的有效時間,那麼它會將 cookie儲存在客戶端的硬碟上,下次再訪問該**的時候,瀏覽器先檢查有沒有 cookie,如果有的話,就讀取該 cookie,然後傳送給伺服器。如果你在機器上面儲存了某個論壇 cookie,有效期是一年,如果有人入侵你的機器,將你的  cookie拷走,然後放在他的瀏覽器的目錄下面,那麼他登入該**的時候就是用你的的身份登入的。所以 cookie是可以偽造的。當然,偽造的時候需要主意,直接copy   cookie檔案到 cookie目錄,瀏覽器是不認的,他有乙個index.dat檔案,儲存了 cookie檔案的建立時間,以及是否有修改,所以你必須先要有該**的 cookie檔案,並且要從保證時間上騙過瀏覽器,曾經在學校的vbb論壇上面做過試驗,copy別人的 cookie登入,冒用了別人的名義發帖子,完全沒有問題。

session是由應用伺服器維持的乙個伺服器端的儲存空間,使用者在連線伺服器時,會由伺服器生成乙個唯一的sessionid,用該sessionid 為識別符號來訪問伺服器端的session儲存空間。而sessionid這一資料則是儲存到客戶端,用cookie儲存的,使用者提交頁面時,會將這一 sessionid提交到伺服器端,來訪問session資料。這一過程,是不用開發人員干預的。所以一旦客戶端禁用cookie,那麼session也會失效。

伺服器也可以通過url重寫的方式來傳遞sessionid的值,因此不是完全依賴cookie。如果客戶端cookie禁用,則伺服器可以自動通過重寫url的方式來儲存session的值,並且這個過程對程式設計師透明。

可以試一下,即使不寫cookie,在使用request.getcookies();取出的cookie陣列的長度也是1,而這個cookie的名字就是jsessionid,還有乙個很長的二進位制的字串,是sessionid的值。

sessionid儲存在cookie中並且不設定cookie的有效時長時:在不關閉瀏覽器的情況下切換登入的使用者,獲取的session可能是同乙個seesion,因為sessionid儲存在cookie中,只要瀏覽器不關閉,cookie就存在,通過sessionid獲取的session就是同乙個session;而同一使用者在不同瀏覽器登入時的獲取的session不是同乙個session,因為cookie不同。

前端開發部落格

web 快取機制 cookie與session

1.cookie cookie技術是客戶端的解決方案,cookie是由伺服器發給客戶端的特殊資訊,而這些資訊以文字檔案的方式存放在客戶端,然後客戶端每次向伺服器傳送請求的時候都會帶上這些特殊的資訊。web應用程式是使用http協議傳輸資料的。http協議是無狀態的協議。一旦資料交換完畢,客戶端與伺服...

Python中cookie和session的異同點

cookie和session的異同點 共同點 1.cookie和session都是用來儲存資料的 2.cookie和session都可以設定有效時間 不同點 1.cookie是儲存在瀏覽器客戶端,session是儲存在服務端 2.session相對cookie來說更更安全 3.session依賴於c...

Flask中的cookie和session淺知

cookie技術的必要性 cookie的實現原理 cookie時用來將使用者資訊儲存在客戶端的技術,使用者資訊會被存放於客戶端的計算機中。cookie儲存到客戶端之後,當使用者再次通過瀏覽器發起對伺服器的請求的時候,瀏覽器就會自動帶著此 相關的cookie資訊來請求資料庫。而cookie資訊裡面儲存...