摘要:背景是一種無狀態的協議,它不對請求和響應之間的通信狀態進行保存,即無法根據之前的狀態進行本次請求的處理。為了保留無狀態協議這個特征的同時又要解決類似的矛盾問題,于是引入了。主要目的是為防止跨站腳本攻擊對的信息竊取。
需求場景
一個Vue單頁應用,A、B、C 三個頁面都引用了一個公用的時間選擇器。用戶在各自頁面選擇完時間后,A,B,C頁面互相切換時保存選擇的時間,在關閉瀏覽器tab后,清除選擇的時間,恢復初識值。一開始的想法是使用會話 cookie(不手動設置過期時間),但是會話 cookie 在關閉瀏覽器 tab 的時候不會被清除。所以決定研究下會話 cookie 何時清除。
cookie背景
HTTP 是一種無狀態的協議,它不對請求和響應之間的通信狀態進行保存,即無法根據之前的狀態進行本次請求的處理。假如要求登錄驗證的 web 頁面本身無法進行狀態的管理,那么每次跳轉新頁面就要再次登錄,或者要在請求報文中附加參數來管理登錄狀態。無狀態協議有它的優點,由于不必保存狀態,可以減少服務器的 CPU 及內存資源。為了保留無狀態協議這個特征的同時又要解決類似的矛盾問題,于是引入了 cookie。
原理
cookie 技術通過在請求和響應報文中寫入 cookie 信息來控制客戶端的狀態。cookie 會根據從服務器端發送的響應報文內的一個叫做 Set-Cookie 的首部字段信息,通知客戶端保存。當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入 cookie 值后發送出去。
服務端發現客戶端發送過來的 cookie 后,會去檢查究竟是從哪一個客戶端發來的連接請求,然后對比服務器上的記錄,最后得到之前的狀態信息。
客戶端設置
// 屬性之間由一個分號和一個空格隔開
document.cookie = "name=value; expires=date; path=path"
// 設置多個cookie
document.cookie = "name=irene; domain=www.baidu.com";
document.cookie = "age=18; path=/welcome";
document.cookie 一次只能設置一條 cookie,如果需要設置多條,需要多次設置。客戶端可以設置的屬性有:expires、max-age、domain、path、secure(https協議下才能設置成功),不能設置 HttpOnly。
服務器端設置Set-Cookie: name=value[; expires=date][; domain=domain][; path=path][; secure] // 設置多個cookie Set-Cookie: name=irene; domain=www.baidu.com; Set-Cookie: age=18; path=/welcome;
一個 Set-Cookie 只能設置一條 cookie,如果需要設置多條,需要多次使用 Set-Cookie。cookie 除了設置名稱和值之外,還可以設置其他的屬性。服務端可以設置的屬性有:expires、max-age、domain、path、secure、HttpOnly 等。
屬性設置 cookie 的失效時間。expires 的值是一個時間點(cookie 失效時刻 = expires),max-age?的值是秒數(cookie 失效時刻 = 創建時刻 + max-age)。expires?是 http/1.0 協議中的選項,在新的 http/1.1 協議中 expires 已經由?max-age?選項代替。如果兩者同時存在,max-age 的優先級高于 expires。max-age 有兩種可能值:小于等于0:有效期為能表示的最早時間;大于0:有效期為當前時間 + max-age。
// expires document.cookie="name=irene; expires=Wed, 13 Jun 2019 10:28:27 GMT" // max-age > 0 document.cookie="name=irene; max-age=3600" // max-age <= 0 document.cookie="name=irene; max-age=0"
注意:一旦 cookie 從服務器端發送至客戶端,服務器端就不存在可以顯式刪除 cookie 的方法。但可通過覆蓋 cookie,實現對客戶端 cookie 的刪除操作。
Domain 設置域名,默認是當前域名。path 設置路徑,默認是當前目錄。domain 和 path 一起限制了哪些請求可以帶上該 cookie。比如上面第二個的 cookie,若請求的 URL 的域名是 juejin.com 或 xxx.juejin.com,并且 URL 的路徑是 / 或 子路徑 "/home",則瀏覽器會將此 cookie 添加到該請求的 cookie 頭部中。
// 在 https://juejin.im/welcome/frontend 設置如下 cookie,則瀏覽器 Cookie 面板顯示的 domain=juejin.im,path=/welcome document.cookie = "name=irene" // 在 https://juejin.im/welcome/frontend 設置如下 cookie,則瀏覽器 Cookie 面板顯示的 domain=.juejin.im(有前綴.), document.cookie = "name=irene; domain=juejin.im; path=/welcome/frontend" // 關于 domain 有無前綴點可參考 http://www.it1352.com/548425.html
當設置了 HttpOnly,瀏覽器就不會將該 cookie 添加到非 HTTP 請求的頭部。
設置 cookie 是否能通過 js 去訪問(讀取、修改、刪除等)。默認情況下,cookie 不會帶 HttpOnly 選項,所以客戶端是可以通過 js 代碼去訪問這個 cookie 的。當 cookie 帶 HttpOnly 選項時,客戶端則無法通過 js 代碼去訪問這個cookie。主要目的是為防止跨站腳本攻擊對 cookie 的信息竊取。HttpOnly 只能從服務端設置,不能通過客戶端設置。
設置僅在 HTTPS 安全連接時,才可以發送 cookie。
瀏覽器對于是否攜帶 cookie 項的策略一個字符串(str)匹配(domain-matches)一個給定的域名字符串(domain str)至少需要滿足以下條件中的一個:
str 和 domain str 完全相同(轉成小寫后比較)。
或者同時滿足以下條件:
2.1 domain str 是 str 的后綴。
2.2 str 中最后一個不包含在 domain str 中的字符是點(.)。
domain str = google.com; str = map.googole.com => 符合 domain str = google.com; str = map.mgoogle.com => 最后一個不包含在 domain str 中的字符是 m,不符合
2.3 str 必須是一個域名,而不是 IP 地址。
一個請求路徑(request-path)匹配(path-matches)一個給定的 cookie-path 至少需要滿足以下條件中的一個:
request-path 和 cookie-path 完全一樣。
cookie-path 是 request-path 的前綴,并且 cookie-path 的最后一個字符是 / 。
cookie-path 是 request-path 的前綴,并且 request-path 中第一個不包含在 cookie-path 中的字符是 / 。
注意:domain-matching & path-matching 只是瀏覽器決定是否攜帶 cookie 諸多參考項中的其中兩個,瀏覽器還會參考諸如是否過期等項。
實踐cookie 不設置失效時間的話,默認是會話結束失效,這個會話結束是指瀏覽器的所有窗口都關閉,還是說這個網站的頁面全部關閉就可以了?
Chrome瀏覽器開了兩個窗口A B,A打開了網站1的兩個標簽頁(tab1 & tab2)和網站2的兩個標簽頁(tab3 & tab4),B打開了網站1的兩個標簽頁(tab1 & tab2)和網站2的兩個標簽頁(tab3 & tab4),如果想網站1的cookie失效的話,是不是把窗口A B關于網站1的tab頁關掉就行 還是 需要把瀏覽器的所有窗口都關閉?
https://segmentfault.com。它的 PHPSESSION 是會話結束失效,所以用來測試。
通過chrome://settings/cookies/detail?site=segmentfault.com查看該網站下的所有cookie。
瀏覽器的所有窗口都關閉,網站1的cookie(會話cookie)才失效。windows 在瀏覽器窗口都關閉的情況下,會退出程序,所以 cookie 會失效;mac 在瀏覽器窗口都關閉的情況下,不會退出程序,所以 cookie 不會失效,需要退出程序 cookie 才失效。
規范如果一個 cookie 同時設置了 Max-Age 和 Expires 屬性,Max-Age 的優先級更高。如果兩個都沒有設置,UA 會保存該 cookie 直到當前 會話結束。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/54077.html
摘要:保存中文上面我們的例子保存的是英文字符,下面我們來看下保存中文字符會怎么樣。出異常了中文屬于字符,英文數據字符,中文占個字符或者個字符,英文占個字符。如果為,則表示刪除該。的值規定為域名的隱私安全機制決定是不可跨域名的。 什么是會話技術 基本概念: 指用戶開一個瀏覽器,訪問一個網站,只要不關閉該瀏覽器,不管該用戶點擊多少個超鏈接,訪問多少資源,直到用戶關閉瀏覽器,整個這個過程我們稱為一...
摘要:追蹤記錄和分析用戶行為。屬性返回一個布爾值,表示瀏覽器是否打開功能不同瀏覽器對數量和大小的限制,是不一樣的。請求的發送瀏覽器向服務器發送請求時,每個請求都會帶上相應的。屬性必須為絕對路徑,默認為當前路徑。屬性值必須是當前發送的域名的一部分。 概述Cookie 與 HTTP 協議HTTP 回應:Cookie 的生成HTTP 請求:Cookie 的發送Cookie 的屬性Expires,M...
摘要:首先先來一段總結用于本地數據存儲,出現在服務器和瀏覽器交互的響應頭部和請求頭部中,受到單域名下的數量單個大小性能安全限制。子技術的出現緩解了單域名下的數量限制,關于子有一整套工具函數可以使用。 前言 本篇主要介紹Cookie技術的讀書總結,但是我認為邏輯上最好會和Web Storage技術放在一起進行對比,因此后續會再總結一篇關于WEB存儲的姊妹總結,敬請期待。 首先先來一段總結:Co...
摘要:首先先來一段總結用于本地數據存儲,出現在服務器和瀏覽器交互的響應頭部和請求頭部中,受到單域名下的數量單個大小性能安全限制。子技術的出現緩解了單域名下的數量限制,關于子有一整套工具函數可以使用。 前言 本篇主要介紹Cookie技術的讀書總結,但是我認為邏輯上最好會和Web Storage技術放在一起進行對比,因此后續會再總結一篇關于WEB存儲的姊妹總結,敬請期待。 首先先來一段總結:Co...
閱讀 2331·2021-11-24 10:27
閱讀 3576·2019-08-30 15:55
閱讀 3341·2019-08-30 15:53
閱讀 2342·2019-08-29 17:27
閱讀 1428·2019-08-26 13:47
閱讀 3547·2019-08-26 10:28
閱讀 913·2019-08-23 15:59
閱讀 2850·2019-08-23 15:19