初識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的唯一性(是否可預測),完整性(是否被篡改),過期等校驗。
資源搜索網站大全 https://www.renrenfan.com.cn 廣州VI設計公司https://www.houdianzi.com
web性能與cookie
cookie在服務端和瀏覽器的通信中,主要依靠HTTP的響應頭和請求頭傳輸的,所以cookie會占據一定的帶寬。
前面提到瀏覽器會為每一次HTPP請求自動攜帶上Cookie信息,但是對於同站內的靜態資源,服務器並不需要處理其攜帶的Cookie,這無形中便浪費了帶寬。
在最佳實踐中,一般都會將靜態資源部署到獨立的域名上,從而可以避免無效Cookie的影響。
LocalStorage
LocalStorage也是瀏覽器本地存儲數據的一個地方,是html5的特性。目前已經十分普及了。然而,localStorage並不會像cookie那樣可以設置數據存活的時間限制。
只要用戶不主動刪除,localstorage存儲的數據就會永久存在。
因此不建議將敏感信息存儲在localstorage中,尤其用於身份驗證的數據。localStorage沒有對xss攻擊做任何防御機制,一旦出現xss漏洞,存儲在localstorage的數據及其容易被獲取到。