1. 程式人生 > >正確理解cookie和session機制原理

正確理解cookie和session機制原理

php中cookie和session是我們常用的兩個變量了,一個是使用者客戶端的,一個用在伺服器的但他們的區別與工作原理怎麼樣,下面我們一起來看看cookie和session機制原理吧。

cookie和session機制之間的區別和聯絡

  具體來說cookie機制採用的是在客戶端保持狀態的方案。它是在使用者端的會話狀態的存貯機制,他需要使用者開啟客戶端的cookie支援。cookie的作用就是為了解決HTTP協議無狀態的缺陷所作的努力.

  而session機制採用的是一種在客戶端與伺服器之間保持狀態的解決方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要儲存一個標識,所以session機制可能需要藉助於cookie機制來達到儲存標識的目的。而session提供了方便管理全域性變數的方式

  session是針對每一個使用者的,變數的值儲存在伺服器上,用一個sessionID來區分是哪個使用者session變數,這個值是通過使用者的瀏覽器在訪問的時候返回給伺服器,當客戶禁用cookie時,這個值也可能設定為由get來返回給伺服器。

  就安全性來說:當你訪問一個使用session的站點,同時在自己機子上建立一個cookie,建議在伺服器端的SESSION機制更安全些.因為它不會任意讀取客戶儲存的資訊。

  正統的cookie分發是通過擴充套件HTTP協議來實現的,伺服器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie

  從網路伺服器觀點看所有HTTP請求都獨立於先前請求。就是說每一個HTTP響應完全依賴於相應請求中包含的資訊

  狀態管理機制克服了HTTP的一些限制並允許網路客戶端及伺服器端維護請求間的關係。在這種關係維持的期間叫做會話(session)。

  Cookies是伺服器在本地機器上儲存的小段文字並隨每一個請求傳送至同一個伺服器。IETFRFC2965HTTPStateManagementMechanism是通用cookie規範。網路伺服器用HTTP頭向客戶端傳送cookies,在客戶終端,瀏覽器解析這些cookies並將它們儲存為一個本地檔案,它會自動將同一伺服器的任何請求縛上這些cookies

  -------------------------------------------------------------------------------------------------------------------------------------------------------------------

  理解session機制

  session機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來儲存資訊。

  當程式需要為某個客戶端的請求建立一個session的時候,伺服器首先檢查這個客戶端的請求裡是否已包含了一個session標識-稱為sessionid,如果已包含一個sessionid則說明以前已經為此客戶端建立過session,伺服器就按照sessionid把這個session檢索出來使用(如果檢索不到,可能會新建一個),如果客戶端請求不包含sessionid,則為此客戶端建立一個session並且生成一個與此session相關聯的sessionid,sessionid的值應該是一個既不會重複,又不容易被找到規律以仿造的字串,這個sessionid將被在本次響應中返回給客戶端儲存。

  儲存這個sessionid的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識發揮給伺服器。一般這個cookie的名字都是類似於SEEESIONID,而。比如weblogic對於web應用程式生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。

  由於cookie可以被人為的禁止,必須有其他機制以便在cookie被禁止時仍然能夠把sessionid傳遞迴伺服器。經常被使用的一種技術叫做URL重寫,就是把sessionid直接附加在URL路徑的後面,附加方式也有兩種,一種是作為URL路徑的附加資訊,表現形式為http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

  另一種是作為查詢字串附加在URL後面,表現形式為http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

  這兩種方式對於使用者來說是沒有區別的,只是伺服器在解析的時候處理的方式不同,採用第一種方式也有利於把sessionid的資訊和正常程式引數區分開來。

  為了在整個互動過程中始終保持狀態,就必須在每個客戶端可能請求的路徑後面都包含這個sessionid。

  另一種技術叫做表單隱藏欄位。就是伺服器會自動修改表單,新增一個隱藏欄位,以便在表單提交時能夠把sessionid傳遞迴伺服器。比如下面的表單

  在被傳遞給客戶端之前將被改寫成

  這種技術現在已較少應用,筆者接觸過的很古老的iPlanet6(SunONE應用伺服器的前身)就使用了這種技術。

  實際上這種技術可以簡單的用對action應用URL重寫來代替。

  在談論session機制的時候,常常聽到這樣一種誤解“只要關閉瀏覽器,session就消失了”。其實可以想象一下會員卡的例子,除非顧客主動對店家提出銷卡,否則店家絕對不會輕易刪除顧客的資料。對session來說也是一樣的,除非程式通知伺服器刪除一個session,否則伺服器會一直保留,程式一般都是在使用者做logoff的時候發個指令去刪除session。然而瀏覽器從來不會主動在關閉之前通知伺服器它將要關閉,因此伺服器根本不會有機會知道瀏覽器已經關閉,之所以會有這種錯覺,是大部分session機制都使用會話cookie來儲存sessionid,而關閉瀏覽器後這個sessionid就消失了,再次連線伺服器時也就無法找到原來的session。如果伺服器設定的cookie被儲存到硬碟上,或者使用某種手段改寫瀏覽器發出的HTTP請求頭,把原來的sessionid傳送給伺服器,則再次開啟瀏覽器仍然能夠找到原來的session。

  恰恰是由於關閉瀏覽器不會導致session被刪除,迫使伺服器為seesion設定了一個失效時間,當距離客戶端上一次使用session的時間超過這個失效時間時,伺服器就可以認為客戶端已經停止了活動,才會把session刪除以節省儲存空間。

  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------

  由JSESSIONID談cookie與SESSION的區別和聯絡

  在一些投票之類的場合,我們往往因為公平的原則要求每人只能投一票,在一些WEB開發中也有類似的情況,這時候我們通常會使用COOKIE來實現,例如如下的程式碼:

<%
   cookie[]cookies=request.getCookies();  
if(cookies.lenght==0||cookies==null)  
doStuffForNewbie();  
//沒有訪問過  
}  
else  
{  
doStuffForReturnVisitor();//已經訪問過了  
}  
%>
 

  這是很淺顯易懂的道理,檢測COOKIE的存在,如果存在說明已經執行過寫入COOKIE的程式碼了,然而執行以上的程式碼後,無論何時結果都是執行doStuffForReturnVisitor(),通過控制面板-Internet選項-設定-察看檔案卻始終看不到生成的cookie檔案,奇怪,程式碼明明沒有問題,不過既然有cookie,那就顯示出來看看。

  cookie[]cookies=request.getCookies();  
   if(cookies.lenght==0||cookies==null)  
     out.println("Hasnotvisitedthiswebsite");  
   }  
else 
{  
for(inti=0;i<cookie.length;i++)  
    {  
out.println("cookiename:"+cookies[i].getName()+"cookievalue:"+  
cookie[i].getValue());  
}  
}  

  執行結果:

  cookiename:JSESSIONIDcookievalue:KWJHUG6JJM65HS2K6為什麼會有cookie呢,大家都知道,http是無狀態的協議,客戶每次讀取web頁面時,伺服器都開啟新的會話,而且伺服器也不會自動維護客戶的上下文資訊,那麼要怎麼才能實現網上商店中的購物車呢,session就是一種儲存上下文資訊的機制,它是針對每一個使用者的,變數的值儲存在伺服器端,通過SessionID來區分不同的客戶,session是以cookie或URL重寫為基礎的,預設使用cookie來實現,系統會創造一個名為JSESSIONID的輸出cookie,我們叫做sessioncookie,以區別persistentcookies,也就是我們通常所說的cookie,注意sessioncookie是儲存於瀏覽器記憶體中的,並不是寫到硬碟上的,這也就是我們剛才看到的JSESSIONID,我們通常情是看不到JSESSIONID的,但是當我們把瀏覽器的cookie禁止後,web伺服器會採用URL重寫的方式傳遞Sessionid,我們就可以在位址列看到sessionid=KWJHUG6JJM65HS2K6之類的字串。

  明白了原理,我們就可以很容易的分辨出persistentcookies和sessioncookie的區別了,網上那些關於兩者安全性的討論也就一目瞭然了,sessioncookie針對某一次會話而言,會話結束sessioncookie也就隨著消失了,而persistentcookie只是存在於客戶端硬碟上的一段文字(通常是加密的),而且可能會遭到cookie欺騙以及針對cookie的跨站指令碼攻擊,自然不如sessioncookie安全了。

  通常sessioncookie是不能跨視窗使用的,當你新開了一個瀏覽器視窗進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們資訊共享的目的就達不到了,此時我們可以先把sessionid儲存在persistentcookie中,然後在新視窗中讀出來,就可以得到上一個視窗SessionID了,這樣通過sessioncookie和persistentcookie的結合我們就實現了跨視窗的sessiontracking(會話跟蹤)。

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

後來我看一篇關於 徹底理解PHP的SESSION機制

1.session.save_handler = files

    * 1. session_start()
         1. session_start()是session機制的開始,它有一定概率開啟垃圾回收,因為session是存放在檔案中,
PHP自身的垃圾回收是無效的,SESSION的回收是要刪檔案的,這個概率是根據php.ini的配置決定的,
但是有的系統是 session.gc_probability = 0,這也就是說概率是0,而是通過cron指令碼來實現垃圾回收。

            session.gc_probability = 1
            session.gc_divisor = 1000
            session.gc_maxlifetime = 1440//過期時間 預設24分鐘
            //概率是 session.gc_probability/session.gc_divisor 結果 1/1000, 
            //不建議設定過小,因為session的垃圾回收,是需要檢查每個檔案是否過期的。
            session.save_path = //好像不同的系統預設不一樣,有一種設定是 "N;/path"
            //這是隨機分級儲存,這個樣的話,垃圾回收將不起作用,需要自己寫指令碼

         2. session會判斷當前是否有$_COOKIE[session_name()];session_name()返回儲存session_id的COOKIE鍵值,
這個值可以從php.ini找到

            session.name = PHPSESSID //預設值PHPSESSID
            

         3. 如果不存在會生成一個session_id,然後把生成的session_id作為COOKIE的值傳遞到客戶端.
相當於執行了下面COOKIE 操作,注意的是,這一步執行了setcookie()操作,COOKIE是在header頭中傳送的,
這之前是不能有輸出的,PHP有另外一個函式 session_regenerate_id() 如果使用這個函式,這之前也是不能有輸出的。

                setcookie(session_name(),
                          session_id(),
                          session.cookie_lifetime,//預設0
                          session.cookie_path,//預設'/'當前程式跟目錄下都有效
                          session.cookie_domain,//預設為空
                          )

         4. 如果存在那麼session_id = $_COOKIE[session_name];
            然後去session.save_path指定的資料夾裡去找名字為'SESS_' . session_id()的檔案.
            讀取檔案的內容反序列化,然後放到$_SESSION中
    * 2. 為$_SESSION賦值
      比如新新增一個值$_SESSION['test'] = 'blah'; 那麼這個$_SESSION只會維護在記憶體中,當指令碼執行結束的時候,
用把$_SESSION的值寫入到session_id指定的資料夾中,然後關閉相關資源.      這個階段有可能執行更改session_id的操作,
比如銷燬一箇舊的的session_id,生成一個全新的session_id.一半用在自定義 session操作,角色的轉換上,
比如Drupal.Drupal的匿名使用者有一個SESSION的,當它登入後需要換用新的session_id

        if (isset($_COOKIE[session_name()])) {
          setcookie(session_name(), '', time() - 42000, '/');//舊session cookie過期
        }
        session_regenerate_id();//這一步會生成新的session_id
       //session_id()返回的是新的值

      3.寫入SESSION操作
      在指令碼結束的時候會執行SESSION寫入操作,把$_SESSION中值寫入到session_id命名的檔案中,可能已經存在,
可能需要建立新的檔案。
    * 4. 銷燬SESSION
      SESSION發出去的COOKIE一般屬於即時COOKIE,儲存在記憶體中,當瀏覽器關閉後,才會過期,假如需要人為強制過期,
比如 退出登入,而不是關閉瀏覽器,那麼就需要在程式碼裡銷燬SESSION,方法有很多,
          o 1. setcookie(session_name(), session_id(), time() - 8000000, ..);//退出登入前執行
          o 2. usset($_SESSION);//這會刪除所有的$_SESSION資料,重新整理後,有COOKIE傳過來,但是沒有資料。
          o 3. session_destroy();//這個作用更徹底,刪除$_SESSION 刪除session檔案,和session_id

      當不關閉瀏覽器的情況下,再次重新整理,2和3都會有COOKIE傳過來,但是找不到資料

2.session.save_handler = user

      使用者自定義session處理機制,更加直觀
    * session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc'); 
1.session_start(),
      執行open($save_path, $session_name)開啟session操作控制代碼
      $save_path 在session.save_handler = files的情況下它就是session.save_path,
但是如果使用者自定的話,這個兩個引數都用不上,直接返回TRUE

      執行read($id)從中讀取資料.//這個引數是自動傳遞的就是session_id(),可以通過這個值進行操作。
    * 2.指令碼執行結束
      執行write($id, $sess_data) //兩個引數,很簡單
    * 3.假如使用者需要session_destroy()
      先執行destroy.在執行第2步

      一個實際例子:

 程式碼如下

      //SESSION初始化的時候呼叫
      function open($save_path, $session_name)
      {
        global $sess_save_path;
        $sess_save_path = $save_path;
        return(true);
      }

      //關閉的時候呼叫
      function close()
      {
        return(true);
      }

      function read($id)
      {
        global $sess_save_path;
        $sess_file = "$sess_save_path/sess_$id";
        return (string) @file_get_contents($sess_file);
      }
      //指令碼執行結束之前,執行寫入操作
      function write($id, $sess_data)
      {
        echo "sdfsf";
        global $sess_save_path;

        $sess_file = "$sess_save_path/sess_$id";
        if ($fp = @fopen($sess_file, "w")) {
          $return = fwrite($fp, $sess_data);
          fclose($fp);
          return $return;
        } else {
          return(false);
        }

      }

      function destroy($id)
      {
        global $sess_save_path;

        $sess_file = "$sess_save_path/sess_$id";
        return(@unlink($sess_file));
      }

      function gc($maxlifetime)
      {
        global $sess_save_path;

        foreach (glob("$sess_save_path/sess_*") as $filename) {
          if (filemtime($filename) + $maxlifetime < time()) {
            @unlink($filename);
          }
        }
        return true;
      }

相關推薦

正確理解cookiesession機制原理

php中cookie和session是我們常用的兩個變量了,一個是使用者客戶端的,一個用在伺服器的但他們的區別與工作原理怎麼樣,下面我們一起來看看cookie和session機制原理吧。 cookie和session機制之間的區別和聯絡   具體來說cookie機制

理解CookieSession機制

超時 動態生成 實現 方便 位置 http請求 persist 解決 pri 會話(Session)跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄信息確定用戶身份,Session通過在服務

【HTTP與HTTPS】3.理解CookieSession機制(二)

目錄 一、Session機制 除了使用Cookie,Web應用程式中還經常使用Session來記錄客戶端狀態。Session是伺服器端使用的一種記錄客戶端狀態的機制,使用上比Cookie簡單一些,相應的也增加了伺服器的儲存壓力。

基礎知識《十二》一篇文章理解CookieSession

alt str web應用 rfi 密鑰 hide 開始 單位 ews 理解Cookie和Session機制 會話(Session)跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是Cookie與Session。Co

深入理解cookiesession

上一個 action inpu 用戶 character method 角色 默認 image cookie和session在java web開發中扮演了十分重要的作用,本篇文章對其中的重要知識點做一些探究和總結。(轉發自https://www.cnblogs.com/ro

理解CookieSession

傳輸 存在 常見 一致性 訪問服務器 dom 所有 查看 登陸 理解Cookie Cookie的作用 用戶通過Http協議服務器,服務器會將一些Key/Value對返回給客戶端瀏覽器,用戶下次訪問時數據又被完整的帶回服務器。具體可以利用Cookie來做如: 在客戶端上保存

理解cookiesession技術

一、HTTP協議的無狀態性 WEB應用程式使用的是HTTP協議傳輸資料的,HTTP協議是一個無狀態的協議,這次資料傳輸完畢,客戶端會和服務端斷開連線,再次傳輸資料就需要重新建立新的連線,這也就無法會話跟蹤。可以理解為伺服器是一個健忘症,這次你訪問他和它交換資料,下次來他就不認識你了,這是一個很不友好的事情。

理解CookieSession及其區別

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

WEB後臺--基於Token的WEB後臺登入認證機制(並講解其他認證機制以及cookiesession機制

繼續這一個系列,基於Token的WEB後臺登入認證機制(並講解cookie和session機制)。每個後端不得不解決的認證問題。 本系列: 文章結構:(1)JWT(一種基於 token 的認證方案)介紹並介紹其他幾大認證機

基於Token的WEB後臺登入認證機制(並講解其他認證機制以及cookiesession機制

幾種常用的認證機制 HTTP Basic Auth HTTP Basic Auth簡單點說明就是每次請求API時都提供使用者的username和password,簡言之,Basic Auth是配合RESTful API 使用的最簡單的認證方式,只需提供使用者

理解CookieSession的區別

前言 HTTP是一種無狀態的協議,為了分辨連結是誰發起的,需自己去解決這個問題。不然有些情況下即使是同一個網站每開啟一個頁面也都要登入一下。而Session和Cookie就是為解決這個問題而提出來的兩個機制。 應用場景 登入網站,今輸入使用者名稱密碼登入了,第二天再開啟很多情況下就直接打開了。這個時

cookie session機制

目錄 Cookie機制 什麼是Cookie Cookie的不可跨域名性 Unicode編碼:儲存中文 BASE64編碼:儲存二進位制圖片 設定Cookie的所有屬性 Cookie的有效期 Cookie的修改、刪除

理解CookieSession的區別及使用

前言 HTTP是一種無狀態的協議,為了分辨連結是誰發起的,需自己去解決這個問題。不然有些情況下即使是同一個網站每開啟一個頁面也都要登入一下。而Session和Cookie就是為解決這個問題而提出來的兩個機制。 應用場景 登入網站,今輸入使用者名稱密碼登入了,第二天再開啟很

驗證碼以及CookieSession機制

1、驗證碼的作用 防止機器暴力破解使用者名稱和密碼(或者是其他可以多次提交的表單)。因此為了安全起見,通常驗證碼的驗證並不會交由前端來進行,而是由後端來進行檢驗。同時驗證碼的樣子也會盡量千奇百怪,讓機器不能夠識別。 2、驗證碼的機制 前端:前端網頁通過

COOKIESession原理及異同

附加 需要 修改表 就會 nbsp 客戶端請求 增加 相關 web 一.原理 cookie原理: 1)當用戶第一次訪問服務器時:服務器會在響應消息中增加Set-Cookie頭字段     (Set-Cookie頭字段的語法格式:Set-Cookie: CookieNa

介紹COOKIESession原理及異同

區別 bsp 文件中 異同 定時 服務器性能 cookie ESS 很多 cookie的原理 當瀏覽器從服務器上請求 web 頁面時, 屬於該頁面的 cookie 會被添加到該請求中。服務端通過這種方式來獲取用戶的信息。 session的原理 當服務器需要為客戶端的請

web開發(三) 會話機制CookieSession詳解

response 客戶端請求 非正常關閉 特殊情況 刪除 session 協議 XML 容易 在網上看見一篇不錯的文章,寫的詳細。 以下內容引用那篇博文。轉載於《http://www.cnblogs.com/whgk/p/6422391.html》,在此僅供學習參考之用。

cookiesession理解

信息保存 bsp 鍵值 原理 server 範圍 session nbsp 信息 一、前言 1、HTTP協議:無法保持狀態,服務端不知道是誰在訪問它。但是我們需要讓server端知道是誰在訪問,所以cookie誕生,cookie不屬於HTTP協議範圍。 2、cooKies和

java web---會話機制cookiesession

轉載:https://www.cnblogs.com/whgk/p/6422391.html 一、會話機制     Web程式中常用的技術,用來跟蹤使用者的整個會話。常用的會話跟蹤技術是Cookie與Session。Cookie通過在客戶端記錄資訊確定使用者身份,Session通過在伺服器端

cookiesession起源,原理,實現

一、引入 1.一種新的需求產生了 隨著web網站的快速發展,網站已經不再用於單純的資訊展示,而是一個龐大的具有互動式的多網頁的應用。在web應用中,資訊的登入是一種很常見的功能,登入後頁面跳轉必須保持登入狀態,不能但是每一次頁面跳轉都需要重新登入。在這樣的需求下cookie應運而生。