回覆內容:
先不說Php裡的session和cookie,我們來看看在正常的web中,session和cookie分別是什麼。
Cookie其實是瀏覽器一端的技術。由於HTTP本身是無狀態的,常規來說對於伺服器端並不知道每次請求的分別是誰,於是一個web會話允許在HTTP頭裡透過set-cookie臨時儲存一些內容在客戶端,客戶端則需要在這個會話中的每一個HTTP請求都附上目前cookie的內容(停用cookie的話就不發了)。這裡的會話一般是以網域來界定的。
但是cookie有兩個很大的缺陷:1. cookie是儲存在客戶端的,所以cookie可以被讀取、挪用和修改。這意味著,對於任何關鍵訊息,例如登陸資訊等,如果用cookie來保持,別人就能夠隨意讀取刪改。 2. 其它偽裝網站可能可以直接取得到你的cookie內容。
那麼怎麼樣訪問這些資訊來使得用戶端難以隨意刪改cookie偽裝其它用戶呢?通常來說有兩大類方法:1. 將cookie加密;2.cookie裡只存一個帶有自驗證的特徵碼,然後把關鍵資料儲存在伺服器一端。這就是session了。
session是cookie的應用。加密儲存在客戶端的session是最容易實現的,不會為伺服器帶來額外的儲存負擔,許多的新型小微框架的session都是以此手段實現的(而並未儲存在服務端)。其次就是儲存在服務端,可選的儲存的地方包括而不限於記憶體、檔案、外部資料庫等。
Php自帶庫裡,cookie即往response裡加入需要客戶端存儲等cookie,session則是在cookie裡加一條session_id,然後默認以文件的形式將需要存儲的東西存儲在服務端。
順帶一提,現代瀏覽器里普遍都支援localStorage,一來它透過前端存取而後端不可取得,對使用者而言安全性稍好,二來可以儲存的量大多了,三來有一定的防低端爬蟲的能力。如果不用考慮老舊瀏覽器相容的話,用localStorage+前後端分離,以ajax形式透過js回報localStorage內容(session_id或加密儲存內容)以代替cookie更值得推薦。
cookie就是把資料存在客戶端
session就是把資料存在伺服器端,客戶端只存一個id
一樓說的很好了。
其實最大的差別就是cookie存在客戶端,session存在伺服器端。而且一般情況下,session確實依賴cookie裡面的session id,其實這個session id你也可以自己定,然後用session時指定這個session id。 session id的功能就是指定session存放的文件,所以cookie停用後,可以用這招。
再補充一點就是,在分散式架構中session要慎用,因為可能會出現session資料遺失的情況,當然你也可以重寫session,讓session存在快取中或資料庫中。
你可以這麼理解,cookie是別人家的箱子,session是自己家的箱子,箱子的好處是什麼?存東西唄