天天看點

cookie&session的Q&A故事[原理篇]

  引語:cookie和session在網站開發中,起着無可厚非的重要作用,但是我們平時往往都隻是通過某種語言作為媒體,通過某些接口函數進行cookie和session的操作,而對其原理可能不了解或一知半解。這樣的話,對于一個真正的懂技術的人來說,也算是一種遺憾吧。雖然網絡上有許多的關于cookie和session的文章,但是我始終相信,一萬個讀者就有一萬個哈姆雷特,我也隻是其中一個讀者,我希望站在一個獨立的角度去解說這個問題,希望對某些好奇的朋友或者想了解的朋友,作為參考!

        本文以Q&A來解說問題,我相信會更容易了解更有意思!

  Session 與 Cookie 都是為了保持通路使用者與後端伺服器的互動狀态的媒體。

1. 什麼是Cookie?

  Cookie意為“甜餅”,是由W3C組織提出,最早由Netscape社群發展的一種機制。目前Cookie已經成為标準,所有的主流浏覽器如IE、Netscape、Firefox、Opera等都支援Cookie。由于HTTP是一種無狀态的協定,伺服器單從網絡連接配接上無從知道客戶身份。怎麼辦呢?就給用戶端們頒發一個通行證吧,每人一個,無論誰通路都必須攜帶自己通行證。這樣伺服器就能從通行證上确認客戶身份了。這就是Cookie的工作原理。

  cookie何時生成?Cookie實際上是一小段的文本資訊,是一本地存儲技術。用戶端請求伺服器,如果伺服器需要記錄該使用者狀态,就使用response向用戶端浏覽器頒發一個Cookie。用戶端浏覽器會把Cookie儲存起來。當浏覽器再請求該網站時,浏覽器把請求的網址連同該Cookie一同送出給伺服器。伺服器檢查該Cookie,以此來辨認使用者狀态。伺服器還可以根據需要修改Cookie的内容。

  cookie應注意什麼?Cookie功能需要浏覽器的支援。如果浏覽器不支援Cookie(如大部分手機中的浏覽器)或者把Cookie禁用了,Cookie功能就會失效。不同的浏覽器采用不同的方式儲存Cookie。如IE浏覽器會在“C:\Documents and Settings\你的使用者名\Cookies”檔案夾下以文本檔案形式儲存,一個文本檔案儲存一個Cookie。

  Cookie的安全性?cookie具有不可跨域名性,根據Cookie規範,浏覽器通路Google隻會攜帶Google的Cookie,而不會攜帶Baidu的Cookie。Google也隻能操作Google的Cookie,而不能操作Baidu的Cookie。但是,在用戶端的資料畢竟是不可靠的,一般隻用于存儲一些不太重要的資料!

  cookie是何時被删除的?不設定過期時間,則表示這個cookie的生命期為浏覽器會話期間,關閉浏覽器視窗,cookie就消失。這種生命期為浏覽器會話期的cookie被稱為會話cookie。會話cookie一般不存儲在硬碟上而是儲存在記憶體裡,當然這種行為并不是規範規定的。若設定了過期時間,浏覽器就會把cookie儲存到硬碟上,關閉後再次打開浏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬碟上的cookie可以在不同的浏覽器程序間共享,比如兩個IE視窗。而對于儲存在記憶體裡的cookie,不同的浏覽器有不同的處理方式。     

2. 什麼是Session?

  Session是另一種記錄客戶狀态的機制,不同的是Cookie儲存在用戶端浏覽器中,而Session儲存在伺服器上。用戶端浏覽器通路伺服器的時候,伺服器把用戶端資訊以某種形式記錄在伺服器上。這就是Session。用戶端浏覽器再次通路時隻需要從該Session中查找該客戶的狀态就可以了。session是伺服器使用一種類似于散清單的結構(也可能就是使用散清單)來儲存資訊的。

  session何時生成?Session在使用者第一次通路伺服器的時候自動建立。需要注意隻有通路動态程式時才會建立Session,隻通路HTML、IMAGE等靜态資源并不會建立Session。Session生成後,隻要使用者繼續通路,伺服器就會更新Session的最後通路時間,并維護該Session。使用者每通路伺服器一次,無論是否讀寫Session,伺服器都認為該使用者的Session“活躍(active)”了一次。

  session應注意什麼?Session儲存在伺服器端。為了獲得更高的存取速度,伺服器一般把Session放在記憶體裡。每個使用者都會有一個獨立的Session。如果Session内容過于複雜,當大量客戶通路伺服器時可能會導緻記憶體溢出。是以,Session裡的資訊應該盡量精簡。而且如果有多台web伺服器的話,必須要考慮如何共享session的問題!

  session的安全性?session存放在伺服器端,一般來說,還是很安全的!

  session是何時被删除的?Session長期不被使用,超過了逾時時間沒通路過伺服器,Session就自動失效了(原理是被某程序清理幹掉了)。

3. PHP中的session cookie原理?

  PHP在http 協定的頭資訊裡發送cookie,是以  setcookie()函數必須在其它資訊被輸出到浏覽器前調用,這和對header()函數的限制類似。

  可以用 setcookie()或 setrawcookie()函數來設定 cookie。也可以通過向用戶端直接發送http頭來設定。要删除cookie,隻需把有效時間設為小于目前時間,和把值設定為空即可。

  使用方法?通過php内置超級全局變量$_COOKIE 就可以讀取浏覽器端的cookie。

  session 使用過期時間設為0 的cookie,并且将一個稱為session ID 的唯一辨別符(一長串字元串),在伺服器端同步生成一些 session 檔案(可以自己定義 session 的儲存類型),與使用者機關聯起來。web應用程式存貯與這些 session 相關的資料,并且讓資料随着使用者在頁面之間傳遞.通路網站的來客會被配置設定一個唯一的辨別符,即所謂的 SESSION ID。它要麼存放在用戶端的cookie,要麼經由 URL 傳遞.SESSION 允許使用者注冊任意數目的變量并保留給各個請求使用。當來客通路網站時,PHP會自動(如果session.auto_start 被設為1)或在使用者請求時(由session_start()明确調用或session_register() 暗中調用)檢查請求中是否發送了特定的SESSION ID。如果是,則之前儲存的環境就被重建。

  session最最核心的概念就是:網頁間跳轉的額外資料,儲存在伺服器,用一個id辨別,浏覽器要維持session,需要每次送出都帶上這個id.

  使用方法?通過$_SESSION這個變量進行設定和擷取。

  session是何時被删除的?通過一種垃圾回收機制進行清理删除。session.gc_maxlifetime 指定過了多少秒之後資料就會被視為"垃圾"并被清除。 垃圾搜集可能會在 session 啟動的時候開始( 取決于 session.gc_probability 和 session.gc_divisor)。 session.gc_probability 與 session.gc_divisor 合起來用來管理 gc(garbage collection 垃圾回收)程序啟動的機率。此機率用 gc_probability/gc_divisor 計算得來。例如 1/100 意味着在每個請求中有 1% 的機率啟動 gc 程序。session.gc_probability 預設為1,session.gc_divisor 預設為 100。

  末語:本文内容來源主要為網絡,通過一定的篩選,加上一定的個人了解而來,隻為更友善檢視,不過我相信對于考試或者面試一類的任務,本文還是有一定的存在意義的,不信你試試!

  最後,我将本文精簡為一句話:cookie和session都是為了儲存使用者的狀态而存在的,他在被通路時被通過一定的安全機制算法生成,又通過浏覽器或某語言的一些特定程序(可以認為是守護程序)定期清理,session涉及記憶體及多伺服器問題,可以将其儲存到資料庫或其他地方解決該問題!

  ok...

不要害怕今日的苦,你要相信明天,更苦!