1. 程式人生 > >session 和 cookie 的區別和作用

session 和 cookie 的區別和作用

session與cookie在web開發中我們用到的不少了,那麼關於session與cookie你有深入理解嗎?今天我們就一起來看一篇關於深入分析理解session與cookie的作用的例子。

在Web發展歷史中,session與cookie都是偉大的存在,其初衷都是為了記住使用者在網站上的瀏覽資訊,如果沒有其他替代品的出現,幾乎所有web站點都離不開session與cookie。

為什麼需要

Http協議是無狀態的,也就導致伺服器無法分辨是誰瀏覽了網頁。為了維持使用者在網站的狀態,比如登陸、購物車等,出現了先後出現了四種技術,分別是隱藏表單域、URL重寫、cookie、session。

Cookie

為了解決Http協議無法維持狀態的問題,1994年網景通訊的一名員工 Lou Montulli將 “magic cookies” 的概念應用到 Web 通訊中。他試圖解決 Web 的第一個購物車應用,現在購物車成了購物網站的支柱。他的原始說明文件提供了 cookie 工作原理的基本資訊,該文件後來被作為規範納入到 RFC 2109(大多數瀏覽器的實現參考文件)中,最終被納入到 RFC 2965 中。Montulli 也被授予 cookie 的美國專利。網景瀏覽器在它的第一個版本中就開始支援 cookie,現在所有 Web 瀏覽器都支援 cookie。(這裡只介紹cookie與session)

是什麼

cookie是瀏覽器儲存在使用者電腦上的一小段文字,用來儲存使用者在網站上的必要的資訊。Web頁面或伺服器告訴瀏覽器按照一定的規範儲存這些資訊,並且在以後的所有請求中,這些資訊就會自動加在http請求頭中傳送給伺服器,伺服器根據這些資訊判斷不同的使用者。並且cookie本身是安全的。

如何建立

Web 伺服器通過傳送一個稱為 Set-Cookie 的 HTTP 訊息頭來建立一個 cookie,Set-Cookie訊息頭是一個字串,其格式如下(中括號中的部分是可選的):

Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

value

value 部分,通常是一個 name=value 格式的字串。事實上,這種格式是原始規範中指定的格式,但是瀏覽器並不會對 cookie 值按照此格式來驗證。實際上,你可以指定一個不含等號的字串,它同樣會被儲存。然而,最常用的使用方式是按照 name=value 格式來指定 cookie 的值(大多數介面只支援該格式)。

傳送回伺服器的cookie只包含cookie設定的值,而不包含cookie的其他可選項,而且瀏覽器不會對cookie做任何更改,會原封不動的傳送回伺服器。當存在多個cookie時,用分號和空格隔開:

Cookie: name=value; name1=value1; name2=value2/pre>

cookie過期時間

如果不設定cookie過期時間,cookie會在會話結束後銷燬,稱為會話cookie。如果想將會話cookie設定為持久cookie,只需設定一下cookie的過期時間即可,該選項的值是一個 Wdy, DD-Mon-YYYY HH:MM:SS GMT 日期格式的值。注意這個失效日期則關聯了以 name-domain-path-secure 為標識的 cookie。要改變一個 cookie 的失效日期,你必須指定同樣的組合。

持久cookie是無法改成會話cookie,除非刪除這個cookie,然後重新建立這個cookie。

domain 選項

domian選項設定了cookie的域,只有發向這個域的http請求才能攜帶這些cookie。一般情況下domain會被設定為建立該cookie的頁面所在的域名。

像 Yahoo! 這種大型網站,都會有許多 name.yahoo.com 形式的站點(例如:my.yahoo.com, finance.yahoo.com 等等)。將一個 cookie 的 domain 選項設定為 yahoo.com,就可以將該 cookie 的值傳送至所有這些站點。瀏覽器會把 domain 的值與請求的域名做一個尾部比較(即從字串的尾部開始比較),並將匹配的 cookie 傳送至伺服器。

path 選項

path選項和domain選項類似,只有包含指定path的http請求才能攜帶這些cookie。這個比較通常是將 path 選項的值與請求的 URL 從頭開始逐字元比較完成的。如果字元匹配,則傳送 Cookie 訊息頭,例如:

set-cookie:namevalue;path=/blog

所以包含/blog的http請求都會攜帶cookie資訊。

secure 選項

該選項只是一個標記而沒有值。只有當一個請求通過 SSL 或 HTTPS 建立時,包含 secure 選項的 cookie 才能被髮送至伺服器。這種 cookie 的內容具有很高的價值,如果以純文字形式傳遞很有可能被篡改。

事實上,機密且敏感的資訊絕不應該在 cookie 中儲存或傳輸,因為 cookie 的整個機制原本都是不安全的。預設情況下,在 HTTPS 連結上傳輸的 cookie 都會被自動新增上 secure 選項。

HTTP-Only

HTTP-Only 的意思是告之瀏覽器該 cookie 絕不能通過 JavaScript 的 document.cookie 屬性訪問。設計該特徵意在提供一個安全措施來幫助阻止通過 JavaScript 發起的跨站指令碼攻擊 (XSS) 竊取 cookie 的行為。

JavaScript 操作 cookie

在 JavaScript 中通過 document.cookie 屬性,你可以建立、維護和刪除 cookie。建立 cookie 時該屬性等同於 Set-Cookie 訊息頭,而在讀取 cookie 時則等同於 Cookie 訊息頭。

刪除cookie

會話 cooke (Session cookie) 在會話結束時(瀏覽器關閉)會被刪除。

持久化 cookie(Persistent cookie)在到達失效日期時會被刪除。

如果瀏覽器中的 cookie 數量達到限制,那麼 cookie 會被刪除以為新建的 cookie 建立空間。

session

session的作用和cookie差不多,也是用來解決Http協議不能維持狀態的問題。但是session只儲存在伺服器端的,不會在網路中進行傳輸,所以較cookie來說,session相對安全一些。但是session是依賴cookie的,當用戶訪問某一站點時,伺服器會為這個使用者產生唯一的session_id,並把這個session_id以cookie的形式傳送到客戶端,以後的客戶端的所有請求都會自動攜帶這個cookie(前提是瀏覽器支援並且沒有禁用cookie)。

用下面這個圖來了解下session的工作原理:

禁用cookie時如何使用session

有些時候,為了安全瀏覽器會禁用cookie,這時可以用傳參的方式將session_id傳送到伺服器,session可以照常工作.

刪除session

會話關閉後,session會自動失效,如果想手動刪除session,可以在伺服器端程式設計實現。如PHP是這樣做的

$_SESSION = array();

session_destory();