一、cookie
1、cookie:記錄用戶端和伺服器端互動的資訊。
cookie規範定義了伺服器和用戶端互動資訊的格式、生存期、使用範圍、安全性。
在JavaScript中可以通過 document.cookie 來讀取或設定這些資訊。由於 cookie 多用在用戶端和服務端之間進行通訊,所以除了JavaScript以外,服務端的語言(如PHP)也可以存取 cookie。
2、Cookie在遠程瀏覽器端儲存資料並以此跟蹤和識別使用者的機制。從實現上說,Cookie是儲存在用戶端上的一小段資料,瀏覽器(即用戶端)通過HTTP協議和伺服器端進行Cookie互動。 cookie 是有大小限制的,每個 cookie 所存放的資料不能超過4kb,如果 cookie 字串的長度超過4kb,則該屬性將返回Null 字元串。
3、Cookie是由瀏覽器實現和管理的。
4、Cookie本身屬性有”Comment” 、”Domain”、”Max-Age”、”Path”、”Secure”、”Version”,具體使用方式參照JavaScript 操作 Cookie。
Comment 屬性是cookie的產生著對該cookie的描述;
Domain 屬性定義可訪問該cookie的網域名稱,對一些大的網站,如果希望cookie可以在子網站中共用,可以使用該屬性。例如設定Domain為 .bigsite.com ,則sub1.bigsite.com和sub2.bigsite.com都可以訪問已儲存在用戶端的cookie,這時還需要將Path設定為/。
Max-Age 屬性定義cookie的有效時間,用秒計數,當超過有效期間後,cookie的資訊不會從用戶端附加在HTTP訊息頭中發送到服務端。
Path 屬性定義網站上可以訪問cookie的頁面的路徑,預設狀態下Path為產生cookie時的路徑,此時cookie可以被該路徑以及其子路徑下的頁面訪問;可以將Path設定為/,使cookie可以被網站下所有頁面訪問。
Secure 屬性值定義cookie的安全性,當該值為true時必須是HTTPS狀態下cookie才從用戶端附加在HTTP訊息中發送到服務端,在HTTP時cookie是不發送的;Secure為false時則可在HTTP狀態下傳遞cookie,Secure預設為false。
Version 屬性定義cookie的版本,由cookie的建立者定義。
5、cookie的使用:
由伺服器端建立要記錄的資訊,然後傳遞到用戶端,由用戶端從HTTP訊息中取出資訊,儲存在本機磁碟上。當用戶端再次訪問伺服器端時,從本機磁碟上讀出原來儲存的資訊,附加到HTTP訊息中發送給伺服器端,伺服器端從HTTP訊息中讀取資訊,根據實際應用的需求進行進一步的處理。
6、由於cookie資訊以明文方式儲存在文字檔中,對一些敏感資訊如口令、銀行帳號如果要儲存在本地cookie檔案中,最好採用加密形式。
二、Session詳解
1、Session即回話,指一種持久性的、雙向的串連。Session與Cookie在本質上沒有區別,都是針對HTTP協議的局限性而提出的一種保持用戶端和伺服器間保持會話串連狀態的機制。Session也是一個通用的標準,但在不同的語言中實現有所不同。針對Web網站來說,Session指使用者在瀏覽某個網站時,從進入網站到瀏覽器關閉這段時間內的會話。Session實際上是一個特定的時間概念。
2、Session是通過sessionID判斷用戶端使用者的,即Session檔案的檔案名稱。sessionID實際上是在用戶端和服務端之間通過HTTP Request 和 HTTP Response傳來傳去。sessionID按照一定的演算法產生,必須包含在 HTTP Request 裡面,保證唯一性和隨機性,以確保Session的安全。如果沒有設定 Session 的組建循環, sessionID儲存在記憶體中,關閉瀏覽器後該ID自動登出;重新請求該頁面,會重新註冊一個sessionID。如果用戶端沒有禁用Cookie,Cookie在啟動Session回話的時候扮演的是儲存sessionID 和 Session 生存期的角色。Session到期後,PHP會對其進行回收。
三、session與cookie的區別:
1、session 在伺服器端,cookie 在用戶端(瀏覽器)
2、session 存在在伺服器的一個檔案裡(預設),不是記憶體
3、session 的運行依賴 session id,而 session id 是存在 cookie 中的,也就是說,如果 瀏覽器禁用了 cookie ,同時 session 也會失效(當然也可以在 url 中傳遞)
4、session 可以放在 檔案,資料庫,或記憶體中都可以。
5、使用者驗證這種場合一般會用 session因此,維持一個會話的核心就是用戶端的唯一標識,即 session id
6、session如果佔據太多記憶體會給伺服器服務效能造成一定的負擔。cookie儲存的資料有限
7、session儲存的是對象,cookie儲存的是字串類型的索引值對。
解釋:
由於HTTP協議是無狀態的協議,所以服務端需要記錄使用者的狀態時,就需要用某種機制來識具體的使用者,這個機制就是Session.典型的情境比如購物車,當你點擊下單按鈕時,由於HTTP協議無狀態,所以並不知道是哪個使用者操作的,所以服務端要為特定的使用者建立了特定的Session,用用於標識這個使用者,並且跟蹤使用者,這樣才知道購物車裡面有幾本書。這個Session是儲存在服務端的,有一個唯一標識。在服務端儲存Session的方法很多,記憶體、資料庫、檔案都有。叢集的時候也要考慮Session的轉移,在大型的網站,一般會有專門的Session伺服器叢集,用來儲存使用者會話,這個時候 Session 資訊都是放在記憶體的,使用一些快取服務比如Memcached之類的來放 Session。
思考一下服務端如何識別特定的客戶?這個時候Cookie就登場了。每次HTTP請求的時候,用戶端都會發送相應的Cookie資訊到服務端。實際上大多數的應用都是用 Cookie 來實現Session跟蹤的,第一次建立Session的時候,服務端會在HTTP協議中告訴用戶端,需要在 Cookie 裡面記錄一個Session ID,以後每次請求把這個會話ID發送到伺服器,我就知道你是誰了。有人問,如果用戶端的瀏覽器禁用了 Cookie 怎麼辦?一般這種情況下,會使用一種叫做URL重寫的技術來進行會話跟蹤,即每次HTTP互動,URL後面都會被附加上一個諸如 sid=xxxxx 這樣的參數,服務端據此來識別使用者。
Cookie其實還可以用在一些方便使用者的情境下,設想你某次登陸過一個網站,下次登入的時候不想再次輸入帳號了,怎麼辦?這個資訊可以寫到Cookie裡面,訪問網站的時候,網站頁面的指令碼可以讀取這個資訊,就自動幫你把使用者名稱給填了,能夠方便一下使用者。這也是Cookie名稱的由來,給使用者的一點甜頭。所以,總結一下:Session是在服務端儲存的一個資料結構,用來跟蹤使用者的狀態,這個資料可以儲存在叢集、資料庫、檔案中;Cookie是用戶端儲存使用者資訊的一種機制,用來記錄使用者的一些資訊,也是實現Session的一種方式。
四、Web Storage
web storage 是在用戶端儲存資料,HTML5 提供的在用戶端儲存資料的新方法,分兩種:localStorage和sessionStorage; 使用它可以在用戶端本地建立一個資料庫,原本儲存在伺服器端資料庫中的內容可以直接儲存在用戶端本地,大大減輕了伺服器端的負擔,同時加快了訪問資料的速度。
1、localStorage:資料永久儲存。將資料儲存在用戶端本地的硬體裝置(硬碟或其他硬體裝置)中,即使瀏覽器關閉了,該資料任然存在。localStorage的範圍是限定在文檔源層級的,不同的文檔源之間是不能讀取和修改對方的資料的,而相同的文檔源是可以的。但是不同的瀏覽器是不共用Storage的,也就是說你在Chorme瀏覽器裡存的資料,在Firefox裡是訪問不到的,即使它們是同一文檔源。
2、sessionStorage:資料臨時儲存。資料存放區在session對象中。儲存時間為從進入網頁到瀏覽器網頁關閉所經過的這段時間。sessionStorage的範圍同樣是限定在文檔源層級的,不僅如此,它還被限制在標籤頁中,不同標籤頁的同一個頁面擁有各自的sessionStorage,資料不能共用。如果是一個頁面裡有兩個iframe元素,它們是共用sessionStorage的。