session與cookie是web開發裡一個重要的概念,在大多數web應用裡session都是被當做現成的東西,拿來就直接用,但是一些複雜的web應用裡能拿來用的session已經滿足不了實際的需求,當碰到這樣的情況時候我們需要更加深入的理解session的機制,本文將簡單敘述下session的相關知識,為設計可替代web容器自帶的session機制打個基礎。
cookie
cookie是伺服器傳送給瀏覽器並在使用者瀏覽時儲存在使用者計算機上的一小部分資料。使用HTTP頭在瀏覽器和伺服器之間生成和共享Cookie。 ps:指某些網站為了辨別使用者身份而儲存在使用者本地終端上的資料
它允許伺服器儲存和檢索來自客戶端的資料,它儲存在客戶端的檔案中,並且可以儲存的最大的cookie大小在任何瀏覽器中都被限制為4K。
分類
Cookie總是儲存在客戶端中,按照客戶端中的儲存位置,可分為記憶體Cookie和硬碟Cookie
顧名思義記憶體Cookie有瀏覽器維護,儲存在記憶體中,瀏覽器關閉後消失,其存在時間是短暫的。硬碟Cookie儲存在硬碟裡,有一個過期時間,除非使用者手動清理,或是到了過期時間,硬碟Cookie不會被刪除,其存在時間是長期的。
用途
因為HTTP協議是無狀態的,即伺服器不知道使用者上一次做了什麼,這嚴重阻礙了互動式Web應用程式的實現。在典型的網上購物場景中,使用者瀏覽了幾個頁面,買了一盒餅乾和兩瓶飲料。最後結帳時,由於HTTP的無狀態性,不通過額外的手段,伺服器並不知道使用者到底買了什麼,所以Cookie就是用來繞開HTTP的無狀態性的“額外手段”之一。伺服器可以設定或讀取Cookies中包含資訊,藉此維護使用者跟伺服器會話中的狀態。
Cookie另一個典型的應用是當登入一個網站時,網站往往會請求使用者輸入使用者名稱和密碼,並且使用者可以勾選“下次自動登入”。如果勾選了,那麼下次訪問同一網站時,使用者會發現沒輸入使用者名稱和密碼就已經登入了。這正是因為前一次登入時,伺服器傳送了包含登入憑據(使用者名稱加密碼的某種加密形式)的Cookie到使用者的硬碟上。第二次登入時,如果該Cookie尚未到期,瀏覽器會傳送該Cookie,伺服器驗證憑據,於是不必輸入使用者名稱和密碼就讓使用者登入了。
Cookie的缺陷
- 根據上面所說的,Cookie會被附加在每一個HTTP請求中,由於HTTP請求中的Cookie是明文傳遞的,所以安全性成問題,除非使用HTTPS
- Cookie的大小限制在4K左右,對於複雜的儲存需求來是不夠用的。
Session
當任何使用者對web應用程式進行任何更改(如登入或登出)時,伺服器都不知道系統上的人是誰。為了解決這個問題,PHPsession將介紹哪些儲存使用者資訊可用於多個網頁。 session變數包含有關單個使用者的資訊,並且在所有的地方都可以訪問。
PHP程式碼以特定會話的雜湊形式生成唯一標識,該標識是32個十六進位制數字的隨機字串,如pvc19hdj5961abfk9lfg4b9l40c被稱為PHPsessionID。
http request
Cookie: PHPSESSID=pvc19hdj5961abfk9lfg4b9l40c;......
centos6.8 中:session儲存地址,當然了這個可以在php.ini中自行配置
/var/lib/php/session/sess_pvc19hdj5961abfk9lfg4b9l40c
複製程式碼
session檔案
Http請求根據上面的一串東西 我們好像發現了什麼了不得的東西(-_-!)
SESSID或COOKIE是其用於識別已經登入到網站的使用者的唯一編號。SESSID儲存在伺服器內部,它在該使用者的訪問(會話)期間分配給特定使用者。該SESSID可被儲存為一個cookie,表格欄位,或URL。
Session | **Cookies |
---|---|
資料儲存在伺服器上 | 資料儲存在瀏覽器中 |
會話資料更安全,因為它們從不在每個HTTPRequest上執行。 | 使用每個HTTP請求。 |
可以儲存物件(儲存大量資料) | 可以儲存字串型別(最大檔案大小為4kb) |
Session Cannot be used for Future Reference | Cookies are mostly used for future reference |
每個客戶端請求伺服器時,伺服器生成 session 時,都會給這個 session 分配一個唯一 id, 用來標示這個 session, 存到檔案時,檔名就是這個 id, 然後再把這個 id 返回到客戶端,並告訴客戶端儲存到 cookie 中.
header 響應
set-cookie:sessionid=23333333333
複製程式碼
如何設定cookie PHP透明地支援HTTP.cookie,可以使用封裝好地PHP函式setcookie()或setrawcookie()函式來設定cookie。cookie是HTTP標頭地一部分,因此setcookie()函式必須在其它資訊被輸入到瀏覽器前呼叫,和header()函式地限制類似。如果php.ini配置檔案設定variables_order中包括C,則任何從客戶端傳送地cookie都會被自動包括進$_COOKIE自動全域性陣列。
這寫概念基本都是w3c和上面的,詳情請轉至~.~ 哦還有會話劫持相關的內容 詳情請點選http://php.net/manual/en/session.configuration.php#ini.session.use-only-cookies
時:2018-4-17