Http協議基礎之為 Cookie 服務的首部欄位
為 Cookie 服務的首部欄位
管理伺服器與客戶端之間狀態的 Cookie,雖然沒有被編入標準化 HTTP/1.1 的 RFC2616 中,但在 Web 網站方面得到了廣泛的應用。
Cookie 的工作機制是使用者識別及狀態管理。Web 網站為了管理使用者的狀態會通過 Web 瀏覽器,把一些資料臨時寫入使用者的計算機內。接著當用戶訪問該Web網站時,可通過通訊方式取回之前發放的 Cookie。
呼叫 Cookie 時,由於可校驗 Cookie 的有效期,以及傳送方的域、路徑、協議等資訊,所以正規釋出的 Cookie 內的資料不會因來自其他 Web 站點和攻擊者的攻擊而洩露。
下面的表格內列舉了與 Cookie 有關的首部欄位。
首部欄位名 | 說明 | 首部型別 |
---|---|---|
Set-Cookie | 開始狀態管理所使用的Cookie資訊 | 響應首部欄位 |
Cookie | 伺服器接收到的Cookie資訊 | 請求首部欄位 |
Set-Cookie
Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31 GMT; path=/; domain=.hackr.jp;
當伺服器準備開始管理客戶端的狀態時,會事先告知各種資訊。
下面的表格列舉了 Set-Cookie 的欄位值。
屬性 | 說明 |
---|---|
NAME=VALUE | 賦予 Cookie 的名稱和其值(必需項) |
expires=DATE | Cookie 的有效期(若不明確指定則預設為瀏覽器關閉前為止) |
path=PATH | 將伺服器上的檔案目錄作為Cookie的適用物件(若不指定則預設為文件所在的檔案目錄) |
domain=域名 | 作為 Cookie 適用物件的域名 (若不指定則預設為建立 Cookie 的伺服器的域名) |
Secure | 僅在 HTTPS 安全通訊時才會傳送 Cookie |
HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 指令碼訪問 |
Cookie 的 expires 屬性指定瀏覽器可傳送 Cookie 的有效期。
當省略 expires 屬性時,其有效期僅限於維持瀏覽器會話(Session)時間段內。這通常限於瀏覽器應用程式被關閉之前。
另外,一旦 Cookie 從伺服器端傳送至客戶端,伺服器端就不存在可以顯式刪除 Cookie 的方法。但可通過覆蓋已過期的 Cookie,實現對客戶端 Cookie 的實質性刪除操作。
Cookie 的 path 屬性可用於限制指定 Cookie 的傳送範圍的檔案目錄。不過另有辦法可避開這項限制,看來對其作為安全機制的效果不能抱有期待。
通過 Cookie 的 domain 屬性指定的域名可做到與結尾匹配一致。比如,當指定 example.com 後,除 example.com 以外,www.example.com 或 www2.example.com 等都可以傳送 Cookie。
因此,除了針對具體指定的多個域名傳送 Cookie 之 外,不指定 domain 屬性顯得更安全。
Cookie 的 secure 屬性用於限制 Web 頁面僅在 HTTPS 安全連線時,才可以傳送 Cookie。
傳送 Cookie 時,指定 secure 屬性的方法如下所示。
Set-Cookie: name=value; secure
當省略 secure 屬性時,不論 HTTP 還是 HTTPS,都會對 Cookie 進行回收。
Cookie 的 HttpOnly 屬性是 Cookie 的擴充套件功能,它使 JavaScript 指令碼無法獲得 Cookie。其主要目的為防止跨站指令碼攻擊(Cross-site scripting,XSS)對 Cookie 的資訊竊取。
傳送指定 HttpOnly 屬性的 Cookie 的方法如下所示。
Set-Cookie: name=value; HttpOnly
通過上述設定,通常從 Web 頁面內還可以對 Cookie 進行讀取操作。但使用 JavaScript 的 document.cookie 就無法讀取附加 HttpOnly 屬性後的 Cookie 的內容了。因此,也就無法在 XSS 中利用 JavaScript 劫持 Cookie 了。
雖然是獨立的擴充套件功能,但 Internet Explorer 6 SP1 以上版本等當下的主流瀏覽器都已經支援該擴充套件了。另外順帶一提,該擴充套件並非是為了防止 XSS 而開發的。
Cookie
Cookie: status=enable
首部欄位 Cookie 會告知伺服器,當客戶端想獲得 HTTP 狀態管理支援時,就會在請求中包含從伺服器接收到的 Cookie。接收到多個 Cookie 時,同樣可以以多個 Cookie 形式傳送。