首頁 >web前端 >js教程 >帶你了解session和cookie作用原理差異和用法(圖文教學)

帶你了解session和cookie作用原理差異和用法(圖文教學)

亚连
亚连原創
2018-05-19 09:45:533699瀏覽

這篇文章主要介紹了session和cookie作用原理,區別和用法,以及使用過程中的優缺點,透過列舉區別和原理,使讀者更能理解兩者之間的關係,需要的朋友可以參考下

Cookie概念

      在瀏覽某些網站時,這些網站會把一些資料存在客戶端,用於使用網站等跟踪使用者,實現使用者自訂功能.

是否設定過期時間:

#      若不設定過期時間,則表示這個Cookie生命週期為瀏覽器會話期間, 只要關閉瀏覽器,cookie就消失了.
      這個生命期為瀏覽會話期的cookie,就是會話Cookie;

儲存:   
      一般儲存於記憶體,不在硬碟;
      如果設定了過期時間, 瀏覽器會把cookie保存在硬碟上,關閉再開啟瀏覽器, 這些cookie依然有效直到超過的設定過期時間;
      儲存在硬碟上的Cookie可以在不同的瀏覽器進程間共享,例如兩個IE視窗。
      而適用於儲存 在記憶體的Cookie,不同的瀏覽器有不同的處理方式。

原則:

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

  setcookie("user","zy",time()+3600); 设置user为zy,一小时之后失效;
  $_COOKIE['user'];     取回user值(名字)
  setcookie("user","",time()-3600); 删除cookie,第二个参数为空,第三个时间设置为小于系统的当前时间即可.

  或在瀏覽器設定

#      使用Cookie時,Cookie自動產生一個文字檔案儲存在IE瀏覽器的Cookie臨時資料夾,應用瀏覽器刪除Cookie檔案的特定操作步驟為
      >選擇IE瀏覽器中的工具/internet選項指令,開啟Internet選項對話框,
      >在一般標籤中點選刪除Cookie按鈕,在彈出的對話方塊中點選確定按鈕,即可成功刪除全部Cookie檔.
 
Session的概念

      Session 是儲存在伺服器端的類似HashTable結構(每一種web開發技術的實作可能不一樣,下文直接稱為HashTable)來存放使用者資料;

功能:

      實作網頁之間資料傳遞,是儲存在伺服器端的物件集合。

原則:

      當使用者要求一個Asp.net頁面時,系統會自動建立一個Session;退出應用程式或關閉伺服器時,該Session撤銷。系統在創建Session時將為其分配一個長長的字串標識,以實現對Session進行管理與追蹤。
      session機制是伺服器端的機制,而伺服器則使用類似散列表的結構(也可能就是使用散列表)來保存資訊。
      
儲存:

#

      儲存在Server段的記憶體進程中的,而這個進程相當不穩定,經常會重啟,這樣重啟的話,就會造成Session失效,用戶就必須要重新登錄,用戶體驗相當差,比如用戶在填寫資料,快要結束的時候Session失效,直接跳到登入頁面;

是否已經創建過session:

      當程式需要為某個客戶端的請求創建一個session時,伺服器先檢查這個客戶端的請求裡是否已包含了一個session標識(稱為session id),

      如果已包含則表示以前已經為此客戶端創建過session,服務器就按照session id把這個session檢索出來....使用(檢索不到,會新建一個),
 
      如果客戶端請求不包含session id,為此客戶端創建一個session並且生成一個與此session相關聯的session id,

      session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個session id將被在本次回應中傳回給客戶端保存。

     (總結: 建立一個session時,伺服器看這個客戶端是否包含session標識, 是的話按照session id把session檢索出來,否則就得新建一個.)

Session的客戶端實作形式(即Session ID的保存方法):

     一般瀏覽器提供了兩種方式來保存,還有一種是程式設計師使用html隱藏域的方式自訂實現:

     [1] 使用Cookie來保存,這是最常見的方法,本文「記住我的登入狀態」功能的實作正式基於這種方式的。

     伺服器透過設定Cookie的方式將Session ID傳送至瀏覽器。
 
     如果我們不設定這個過期時間,那麼這個Cookie將不會存放在硬碟上,當瀏覽器關閉的時候,Cookie就消失了,這個Session ID就遺失了。

     如果我們設定這個時間為若干天之後,那麼這個Cookie會保存在客戶端硬碟中,即使瀏覽器關閉,這個值仍然存在,下次造訪對應網站時,同樣會發送到伺服器上。


     [2] 使用URL附加資訊的方式,也就是像我們常看到JSP網站會有aaa.jsp?JSESSIONID=*一樣的。這種方式跟第一種方式裡面不設定Cookie過期時間是一樣的。 (URL重寫,就是把session id直接附加在URL路徑的後面。)


#     [3] 第三種方式是在頁面表單裡面增加隱藏域,這種方式實際上和第二種方式一樣,只不過前者透過GET方式發送數據,後者使用POST方式發送數據。但是明顯後者比較麻煩。
     表單隱藏字段就是伺服器會自動修改表單,新增一個隱藏字段,以便在表單提交時能夠把session id傳回伺服器。例如:
      a62ea03a0e3fc98184ee7fac7a0f970e
         10a0c4c6fe334f1dd2642c4aa224944a
         13ba08d2c6f09324055f9ad271f6ac71
23efcc05e98690ceeb219581933e4231
       f5a47148e367a6035fd7a2faa965022e
      其實此技巧可以簡單的使用對action式應用網址來取代。

session 使用:

        使用者資料儲存至session前,先啟動;
                 $_SESSION['user'] ="zy";      設定使用者名稱
         unset($_SESSION['user']);    銷毀使用者名稱
    失去已經儲存的session的資料

cookie 與session 的差異:

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

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

       Session是由應用程式伺服器維持的一個伺服器端的儲存空間,使用者在連接伺服器時,會由伺服器產生一個唯一的SessionID,用該SessionID 為識別碼來存取伺服器端的Session儲存空間。而SessionID這資料則是儲存到客戶端,用Cookie儲存的,使用者提交頁面時,會將這 SessionID提交到伺服器端,來存取Session資料。這一過程,是不用開發人員幹預的。所以一旦客戶端停用Cookie,那麼Session也會失效。

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

       3、session會在一段時間內儲存於伺服器上。當訪問增多,會比較佔用你伺服器的效能考慮到減輕伺服器效能方面,應使用COOKIE。

       4、單一cookie儲存的資料不能超過4K,許多瀏覽器限制一個網站儲存最多20個cookie。 (Session物件沒有對儲存的資料量的限制,其中可以保存更為複雜的資料類型)

#注意:

      session很容易失效,使用者體驗很差;

      雖然cookie不安全,但是可以加密;

      cookie也分為永久和暫時存在的;

      瀏覽器有禁止cookie功能,但一般使用者都不會設定;

     必須設定失效時間,不然瀏覽器關機就消失了;

 例如:

      記住密碼功能就是使用永久cookie寫在客戶端電腦,下次登入時,自動將cookie訊息附加傳送給服務端。

      application是一種全域性訊息,是所有使用者分享的訊息,如可以記錄有多少使用者現在登入本網站,並且把訊息展現個所有使用者。

兩者最大的差別在於生存週期,一個是IE啟動到IE關閉.(瀏覽器頁面一關,session就消失了)
一個是預先設定的生存週期,或永久的保存於本地的文件。 (cookie)

上面是我整理給大家的,希望今後會對大家有幫助。

相關文章:

nodejs連接mysql資料庫步驟詳解

給nodejs裡密碼加密有哪幾種方式

vue處理storejs取得的資料

以上是帶你了解session和cookie作用原理差異和用法(圖文教學)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn