初識cookie

http是無狀態的請求響應。每次的請求響應之後,連接會立即斷開或延時斷開(保持一定的連接有效期)。斷開後,下一次請求再重新建立。在http連接時,通過cookie進行會話跟蹤,第一次響應時設置的Cookie在隨後的每次請求中都會發送出去。Cookie還可以包括登陸認證後的身份信息。

大多數瀏覽器限制每個域能有50個cookies左右。存儲的cookies最大值約為4kb,若超過這個值,瀏覽器就會刪除一些cookie。

刪除策略因瀏覽器而已。有興趣的朋友可以自己做深入研究。

刪除cookie的操作只需要設置過期值為過去的時間即可。cookie無法跨瀏覽器存在。

cookie的作用

同域內瀏覽器中發出的任何一個請求都會帶上cookie,無論請求什麼資源,請求時,cookie會出現在請求頭的cookie欄位中。

服務端響應頭的set-cookie欄位可以添加,修改和刪除cookie,大多數情況下,客戶端通過JS也可以添加,修改和刪除cookie。cookie經常用來存儲用戶的會話信息。比如,用戶登陸認證後的session,之後同域內發出的請求都會帶上認證後的會話信息,非常方便。所以攻擊者特別喜歡盜取cookie,這相當於盜取了在目標網站上的用戶許可權。

Secure Cookie機制

Secure Cookie機制指的是設置了secure標誌的cookie。Secure Cookie僅在https層面上安全傳輸,如果是http請求,就不會帶上這個cookie。

這樣能降低重要的cookie被中間人截獲的風險。

不過,也不是說可以萬無一失。因為secure cookie對於客戶端腳本來說是可讀可寫的,可讀就意味著secure cookie能被盜取,可寫意味著能被篡改,所以還是存在一定的風險。

HttpOnly屬性

Cookie的HttpOnly屬性,指瀏覽器不要在除HTTP(和 HTTPS)請求之外暴露Cookie。

一個有HttpOnly屬性的Cookie,不能通過非HTTP方式來訪問,例如通過調用JavaScript(例如,引用document.cookie),因此,不可能通過跨域腳本(一種非常普通的攻擊技術)來偷走這種Cookie。Facebook 和 Google 正在廣泛地使用HttpOnly屬性。

然而,目前的技術手段還是可以通過xss攻擊獲取httpOnly的cookie。有興趣的朋友可以延伸閱讀該篇:Stealing HttpOnly Cookie via XSS

Same-Site屬性

當用戶從a.com發起b.com的請求也會攜帶上Cookie,而從a.com攜帶過來的Cookie稱為第三方Cookie。

為了防止CSRF(Cross-site request forgrey)攻擊,可以使用SameSite屬性。

Set-Cookie: CookieName=CookieValue; SameSite=Lax; Set-Cookie: CookieName=CookieValue; SameSite=Strict;

  • strict:瀏覽器在任何跨域請求中都不會攜帶Cookie,這樣可以有效的防禦CSRF攻擊,但是對於有多個子域名的網站採用主域名存儲用戶登錄信息的場景,每個子域名都需要用戶重新登錄,造成用戶體驗非常的差。
  • lax:相比較strict,它允許從三方網站跳轉過來的時候使用Cookie。

更多延伸閱讀:Using the Same-Site Cookie Attribute to Prevent CSRF Attacks

本地cookie與內存cookie

本地cookie與內存cookie,區別在於cookie設置的expires欄位。

如果沒有設置過期時間,就是內存cookie。隨著瀏覽器的關閉而從內存中消失。

如果設置了過期時間是未來的某一個時間點,那這個cookie就會以文本的形式保存在操作系統本地,待過期時間到了才會消失。

很多網站為了提升用戶的體驗,省去每次用戶登陸的麻煩,採用本地cookie的方式,讓用戶可以在未來的一個月,或者半年,永久等時間段內不需要進行登陸操作。

這也意味著,用戶被攻擊的風險變大了。攻擊者通過xss得到這樣的本地cookie後,能夠在未來很長一段時間內,甚至是永久控制這目標用戶的賬號許可權。

然而,即使採用內存cookie也存在一定的風險,攻擊者可以給內存cookie加一個過期時間,使其變成本地cookie,這樣還是無法避免以上的安全問題。說到底,用戶賬號是否安全與伺服器端校驗有關,包括重要cookie的唯一性(是否可預測),完整性(是否被篡改),過期等校驗。

web性能與cookie

cookie在服務端和瀏覽器的通信中,主要依靠HTTP的響應頭和請求頭傳輸的,所以cookie會佔據一定的帶寬。

前面提到瀏覽器會為每一次HTPP請求自動攜帶上Cookie信息,但是對於同站內的靜態資源,伺服器並不需要處理其攜帶的Cookie,這無形中便浪費了帶寬。

在最佳實踐中,一般都會將靜態資源部署到獨立的域名上,從而可以避免無效Cookie的影響。

LocalStorage

LocalStorage也是瀏覽器本地存儲數據的一個地方,是HTML5的特性。目前已經十分普及了。然而,localStorage並不會像cookie那樣可以設置數據存活的時間限制。

只要用戶不主動刪除,localstorage存儲的數據就會永久存在。

因此不建議將敏感信息存儲在localstorage中,尤其用於身份驗證的數據。localStorage沒有對xss攻擊做任何防禦機制,一旦出現xss漏洞,存儲在localstorage的數據及其容易被獲取到。


作者:陌未央

鏈接:imooc.com/article/28653

來源:慕課網

本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作


推薦閱讀:
相關文章