HTTP Cookie(也叫Web Cookie或瀏覽器Cookie)是服務器發送到用戶瀏覽器並保存在瀏覽器的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶併發送到服務器上。一般,它用於告知服務端兩個請求是否來自同一瀏覽器。Cookie使無狀態的HTTP協議記錄穩定的狀態信息成爲了可能。每一個 Cookie 的大小通常不能超過4KB。html
Cookie的經常使用場合:跨域
Cookie 包含如下幾方面的信息。瀏覽器
瀏覽器的同源政策規定,兩個網址只要域名相同和端口相同,就能夠共享 Cookie。服務器
Cookie曾一度用於客戶端數據的存儲,因當時並無其它合適的存儲辦法而做爲惟一的存儲手段,但如今隨着現代瀏覽器開始支持各類各樣的存儲方式,Cookie漸漸被淘汰。因爲服務器指定Cookie後,瀏覽器的每次請求都會攜帶Cookie數據,會帶來額外的性能開銷(尤爲是在移動環境下)。新的瀏覽器API已經容許開發者直接將數據存儲到本地,如使用 Web storage API (本地存儲和會話存儲)或 IndexedDB 。cookie
當服務器收到HTTP請求時,服務器能夠在響應頭裏面添加一個Set-Cookie
選項。瀏覽器收到響應後一般會保存下Cookie,以後對該服務器每一次請求中都經過Cookie
請求頭部將Cookie信息發送給服務器。另外,Cookie的過時時間、域、路徑、有效期、適用站點均可以根據須要來指定。session
2.1 Set-Cookie響應頭部和Cookie請求頭部併發
服務器使用Set-Cookie
響應頭部向瀏覽器發送Cookie信息。一個簡單的Cookie可能像這樣:性能
Set-Cookie: "xxx=dd"
服務器經過該頭部告知瀏覽器保存屬性爲xxx
值爲dd
的Cookie信息。加密
HTTP/1.0 200 OK Content-type: text/html Set-Cookie: xxx=dd
對該服務器發起的每一次新請求,瀏覽器都會將以前保存的Cookie再發送給服務器。code
GET /sample_page.html HTTP/1.1 Host: www.example.com Cookie: xxx=dd
2.2 會話期Cookie
會話期Cookie:瀏覽器關閉以後它會被自動刪除,也就是說它僅在會話期內有效。會話期Cookie不須要指定過時時間(Expires
)或者有效期(Max-Age)。
2.3 Cookie有效期
和關閉瀏覽器便失效的會話期Cookie不一樣,Cookie能夠指定一個特定的過時時間(Expires
)或有效期(Max-Age
)。
Set-Cookie: id=1; Expires=Wed, 21 Oct 2005 07:28:00 GMT;
當Cookie的過時時間被設定時,設定的日期和時間只與客戶端相關,而不是服務端。
2.4 Cookie的Secure 和HttpOnly
標記爲 Secure
的Cookie只應經過被HTTPS協議加密過的請求發送給服務端。
爲避免跨域腳本 (XSS) 攻擊,經過JavaScript的 Document.cookie
API沒法訪問帶有 HttpOnly
標記的Cookie,它們只應該發送給服務端。若是 Cookie 不想被客戶端 JavaScript 腳本調用,那麼就應該爲其設置 HttpOnly
標記。
Set-Cookie: id=1; Expires=Wed, 21 Oct 2005 07:28:00 GMT; Secure; HttpOnly
2.5 Cookie的Domain和Path
Domain
標識指定了哪些主機能夠接受Cookie。若是不指定,默認爲當前文檔的主機(不包含子域名)。若是指定了Domain
,則通常包含子域名。
Path
標識指定了主機下的哪些路徑能夠接受Cookie(該URL路徑必須存在於請求URL中)。以"/" 做爲路徑分隔符,子路徑也會被匹配。
例如,設置 Path=/xxx
,則如下地址都會匹配:
/xxx
/xxx/Web/
/xxx/Web/HTTP
2.6 JavaScript經過Document.cookies訪問Cookie
經過Document.cookie
屬性可建立新的Cookie,也可經過該屬性訪問非HttpOnly
標記的Cookie。