隨著 Web
應(yīng)用程序的出現(xiàn),直接在客戶端存儲(chǔ)用戶信息的需求也隨之出現(xiàn)。這背后的想法是合理的:與特定用戶相關(guān)的信息應(yīng)該保存在用戶的機(jī)器上。無論是登錄信息、個(gè)人偏好,還是其他數(shù)據(jù),Web
應(yīng)用程序提供者都需要有辦法把它們保存在客戶端。對(duì)該問題的第一個(gè)解決方案就是 cookie
。
cookie
cookie
是 HTTP
請(qǐng)求標(biāo)頭,其中含有先前由服務(wù)器通過 set-cookie
標(biāo)頭投放或通過 Javascript
的 Document.cookie
方法設(shè)置,然后存儲(chǔ)到客戶端的 HTTP cookie
。例如下面是包含這個(gè)頭部的一個(gè) HTTP
響應(yīng):
HTTP/1.1 200 ok
Content-type: text/html
Set-Cookie: name=value
這個(gè) HTTP
響應(yīng)會(huì)設(shè)置一個(gè)名為 name
,值為 value
的 cookie
。名和值在發(fā)送時(shí)都會(huì)經(jīng)過 URL
編碼。瀏覽器乎存儲(chǔ)這些會(huì)話信息,并在之后的每個(gè)請(qǐng)求中都會(huì)通過 HTTP
頭部 cookie
再將它們分會(huì)服務(wù)器,比如:
GET /index.js HTTP/1.1
Cookie: name=value
這些發(fā)送會(huì)服務(wù)器的額外信息可用于唯一標(biāo)識(shí)發(fā)送請(qǐng)求的客戶端。
為什么 HTTP 需要 cookie
HTTP
是一種無狀態(tài)的協(xié)議,這意味著服務(wù)器無法在連續(xù)的請(qǐng)求之間保持客戶端的任何記憶。
接下來我們就來舉一個(gè)生活的例子:
假設(shè)你假設(shè)去一家麥當(dāng)勞,他們提供了一個(gè)優(yōu)惠活動(dòng),就是買滿 2 杯可樂可以送一只炸雞。
你進(jìn)入這家店店了一杯可樂,收銀員會(huì)將你的點(diǎn)單信息輸入他們的系統(tǒng)中。如果沒有 cookie
的話,這服務(wù)員在你下次來的時(shí)候,壓根就不知道你是新客還是之前就已經(jīng)點(diǎn)過了;
服務(wù)器為你分配一個(gè)唯一的會(huì)話標(biāo)識(shí)符,并將其存儲(chǔ)在一個(gè)名為 session_id
的 cookie
中。這個(gè) cookie
會(huì)存儲(chǔ)在你的瀏覽器中;
在你買完付款后,服務(wù)器會(huì)將一些與你的購買相關(guān)的信息存儲(chǔ)在 cookie
中,如購買的可樂數(shù)量和金額;
在你繼續(xù)購買咖啡的過程中,服務(wù)器會(huì)在每個(gè)請(qǐng)求中檢查你的 session_id
cookie
,并根據(jù)其中存儲(chǔ)的購買信息來判斷是否滿足送咖啡的條件;
當(dāng)你購買的可樂數(shù)量達(dá)到 2 杯時(shí),服務(wù)器會(huì)識(shí)別出你已經(jīng)滿足了送炸雞的條件。它會(huì)在你的購買信息中添加一條記錄,表示你可以獲得一只免費(fèi)的炸雞;
當(dāng)你下次訪問咖啡店并購買咖啡時(shí),服務(wù)器會(huì)讀取你的 cookie
中的購買信息,并在檢查后繼續(xù)更新送咖啡的記錄;
當(dāng)你結(jié)賬時(shí),服務(wù)器會(huì)檢查購買信息中的送咖啡記錄,如果滿足條件,會(huì)從賬單中減去相應(yīng)的金額,表示免費(fèi)咖啡的抵扣;
通過使用 cookie
,麥當(dāng)勞的服務(wù)器可以跟蹤你的購買數(shù)量,并根據(jù)設(shè)定的條件來提供送炸雞的優(yōu)惠。這樣,當(dāng)你購買滿足要求的數(shù)量時(shí),服務(wù)器可以自動(dòng)判斷并為你提供一杯免費(fèi)的咖啡,使你在購買咖啡時(shí)能夠享受到優(yōu)惠和獎(jiǎng)勵(lì)。
cookie 的限制
cookie
是與特定域綁定的,設(shè)置 cookie
后,它會(huì)與請(qǐng)求一起發(fā)送到創(chuàng)建它的域,這個(gè)限制能保證 cookie
中存儲(chǔ)的信息只對(duì)被認(rèn)可的接收者開發(fā),不被其他域訪問。
因?yàn)?cookie
存儲(chǔ)在客戶端機(jī)器上,所以為保證它不會(huì)被惡意利用,瀏覽器會(huì)施加限制,同時(shí) cookie
也不會(huì)占用太多磁盤空間。
通常,只要遵守以下大致的限制,就不會(huì)在任何瀏覽器中碰到問題:
容量限制: 每個(gè) cookie
的存儲(chǔ)容量通常被限制在幾個(gè) kb
到幾十 kb
之間,不同瀏覽器可能會(huì)有不同的限制,如果超過了這個(gè)限制,瀏覽器可能會(huì)拒絕保存 cookie
或?qū)⑵浣財(cái)?
數(shù)量限制: 瀏覽器對(duì)每個(gè)域名或整個(gè)瀏覽器的 cookie
數(shù)量也有限制,如果超過了這個(gè)數(shù)量限制,舊的 cookie
可能會(huì)被覆蓋或丟棄;
安全限制: 瀏覽器實(shí)施了一些安全策略來限制 cookie
的使用,例如它使用 HttpOnly
屬性來來防止通過 Javascript
訪問 cookie
,從而減少了被跨站腳本攻擊(Cross-site-scripting,XSS
) 對(duì) cookie
的信息竊取。同樣使用 Secure
屬性用于限制僅在 HTTPS
安全連接時(shí),才可以發(fā)送 Cookie
;
域名和路徑限制: cookie
可以設(shè)置域名和路徑限制,指定了可以接收該 cookie
的域名范圍和 URL
路徑。這樣 cookie
只能在指定的域名和路徑下被發(fā)送和接收。例如,如果將 cookie
的域名限制為 .example.com
,則只有以 example.com
結(jié)尾的子域名可以接受該 cookie
;
需要注意的是,不同的瀏覽器和設(shè)備可能存在差異,對(duì) cookie
的限制和實(shí)施策略可能會(huì)有所不同。此外,隨著隱私和安全意識(shí)的提高,相關(guān)的法規(guī)和標(biāo)準(zhǔn)也可能對(duì) cookie
的使用提出更嚴(yán)格的要求。因此,在開發(fā)和使用 cookie
時(shí),需要遵守相關(guān)的法規(guī)和最佳實(shí)踐,以確保用戶隱私和數(shù)據(jù)安全。
cookie 的構(gòu)成
一個(gè)標(biāo)準(zhǔn)的 HTTP
cookie
通常由以下幾個(gè)組成部分構(gòu)成:
名稱(name
): cookie
的名稱通常用于標(biāo)識(shí)和引用該 cookie
;
值(value
): cookie
的值是否于名稱相關(guān)聯(lián)的信息,它可以是任意文本或數(shù)據(jù);
域(Domain
): cookie
的域定義了可以訪問該 cookie
的域名范圍,只有與該域匹配的網(wǎng)站才能讀取發(fā)送該 cookie
;
路徑(Path
): 路徑規(guī)定了可以訪問該 cookie
的 URL
路徑,只有與指定匹配的頁面才能訪問該 cookie
;
過期時(shí)間(Expiration
): cookie
的過期時(shí)間指定了該 cookie
的有效期限。一旦超過了過期時(shí)間,瀏覽器將刪除該 cookie
。如果沒有指定過期時(shí)間,那么該 cookie
將成為會(huì)話 cookie
,只在當(dāng)前會(huì)話期間有效,即關(guān)閉瀏覽器后將被刪除;
安全標(biāo)志(Secure
):如果設(shè)置了安全標(biāo)志為 true
,那么瀏覽器只會(huì)在通過加密的安全連接 HTTPS
發(fā)送該 cookie
。這可以增加 cookie
的安全性,防止在傳輸過程中被竊取或篡改;
HTTPOnly
標(biāo)志: 如果設(shè)置了 HTTPOnly
標(biāo)志為 true
,那么該 cookie
將不允許通過客戶端的 Javascript
代碼訪問。這有助于減少跨站腳本攻擊 XSS
對(duì) cookie
的利用;
這些組成部分以鍵值對(duì)的形式存儲(chǔ)在 cookie
中,并由瀏覽器在 HTTP
請(qǐng)求和響應(yīng)中進(jìn)行傳輸。這些標(biāo)志用于告訴瀏覽器什么情況下應(yīng)該在請(qǐng)求中包含 cookie
,這些參數(shù)并不會(huì)隨請(qǐng)求發(fā)送個(gè)服務(wù)器,實(shí)際發(fā)送的只有 cookie
的 鍵/值 對(duì)。
cookie 的缺點(diǎn)
盡管 HTTP
cookie
是廣泛使用的機(jī)制,但它也存在一些缺點(diǎn):
隱私問題: Cookie
可以用于跟蹤用戶的行為和偏好,這引發(fā)了隱私方面的擔(dān)憂。第三方 cookie
可以在不同的網(wǎng)站之間共享和跟蹤用戶信息,可能導(dǎo)致用戶的隱私泄露和個(gè)人數(shù)據(jù)被濫用的風(fēng)險(xiǎn);
安全風(fēng)險(xiǎn): 由于 cookie
存儲(chǔ)在用戶的瀏覽器中,攻擊者可能會(huì)通過各種手段竊取 cookie
,如 網(wǎng)絡(luò)嗅探
、跨站腳本攻擊 XSS
和跨站請(qǐng)求偽造 CSRF
等。一旦攻擊者獲取了 cookie
,他們可能會(huì)模擬用戶的身份,并訪問敏感信息或執(zhí)行未經(jīng)授權(quán)的操作;
性能影響: 每個(gè) HTTP
請(qǐng)求中都會(huì)包含所有與當(dāng)前域相關(guān)的 cookie
信息,這會(huì)增加數(shù)據(jù)傳輸?shù)拇笮?對(duì)于每個(gè) HTTP
請(qǐng)求,瀏覽器都需要將 cookie
信息發(fā)送給服務(wù)器,這會(huì)增加網(wǎng)絡(luò)流量和延遲,特別是當(dāng) cookie
的數(shù)量或大小較大時(shí);
容量限制: 每個(gè) cookie
的存儲(chǔ)容量是有限的,通常在幾 KB
到幾十 KB
之間。對(duì)于需要存儲(chǔ)大量數(shù)據(jù)的應(yīng)用程序,cookie
的容量限制可能會(huì)成為問題;
跨域限制: 瀏覽器實(shí)施了一些安全策略,限制了對(duì)其他域名的 cookie
訪問,跨域請(qǐng)求(跨域 ajax 請(qǐng)求
)不能訪問其他域的 cookie
,這對(duì)于某些應(yīng)用程序可能會(huì)帶來限制;
用戶控制性不足: 盡管瀏覽器提供了一些控制 cookie
的選項(xiàng),如禁用第三方 cookie
或使用 隱身模式,但用戶對(duì)于如何管理和控制 cookie
的細(xì)粒度控制有限;
鑒于這些缺點(diǎn),對(duì)于保護(hù)用戶隱私和數(shù)據(jù)安全的考慮,開發(fā)人員和網(wǎng)站運(yùn)營者應(yīng)該謹(jǐn)慎使用 cookie
,并遵循隱私和安全最佳實(shí)踐,以確保合理使用和保護(hù)用戶的個(gè)人信息。
總結(jié)
為了合理使用 Cookie
并保護(hù)用戶隱私,開發(fā)人員應(yīng)遵循隱私和安全最佳實(shí)踐,限制 Cookie
的使用,并提供用戶對(duì) Cookie
的控制選項(xiàng)。用戶也可以通過瀏覽器設(shè)置來管理和刪除 Cookie
,以控制其數(shù)據(jù)的使用和共享。
不要在 cookie
中存儲(chǔ)重要或敏感的信息,cookie
數(shù)據(jù)不是保存在安全的環(huán)境中,因此任何人都可能獲得,應(yīng)該避免把信用卡號(hào)或個(gè)人地址等信息保存在 cookie
中。
原文鏈接
該文章在 2023/6/26 14:40:09 編輯過