cookie
什么是 cookie
cookie是指某些網(wǎng)站為了辨別用戶身份而存儲在用戶本地終端(client side)上的數(shù)據(jù)(通常經(jīng)過加密)。cookie通過HTTP請求報(bào)文和響應(yīng)報(bào)文配合完成爪瓜。
cookie是存儲于訪問者的計(jì)算機(jī)中的變量史汗。每當(dāng)同一臺計(jì)算機(jī)通過瀏覽器請求同一個(gè)頁面時(shí)瘫辩,就會發(fā)送這個(gè) cookie 。
通俗的說就是當(dāng)一個(gè)用戶通過HTTP協(xié)議訪問一個(gè)服務(wù)器的時(shí)候,這個(gè)服務(wù)器會將一些key/Value鍵值對返回給客戶端瀏覽器圾叼,并給這些數(shù)據(jù)加上一些限制條件朱庆,在條件符合時(shí)這個(gè)用戶下次訪問這個(gè)服務(wù)器的時(shí)候盛泡,數(shù)據(jù)又被完整的帶回給服務(wù)器。
cookie是瀏覽器提供的一種機(jī)制娱颊,可以由 javascript 對其進(jìn)行控制傲诵,而不是 javascript 本身的性質(zhì)。
HTTP 無狀態(tài)
HTTP協(xié)議是無狀態(tài)的協(xié)議箱硕。一旦數(shù)據(jù)交換完畢拴竹,客戶端與服務(wù)器的連接就會關(guān)閉,再次交換數(shù)據(jù)需要建立新的連接剧罩。這就意味著服務(wù)器無法從連接上跟蹤會話栓拜。
而cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,而session機(jī)制采用的是在服務(wù)器端保持狀態(tài)的方案惠昔。
cookie 的不可跨域名性
cookie是存于用戶硬盤的一個(gè)文件幕与,這個(gè)文件通常對應(yīng)于一個(gè)域名。cookie可以跨越同一個(gè)域名下的多個(gè)網(wǎng)頁镇防,但不能跨越多個(gè)域名使用啦鸣。
cookie 的使用場景
- 購物車
沒有登錄之前商品數(shù)據(jù)是保存在cookie中 - 記住用戶名
利用cookie保存用戶名 - 記住窩
利用cookie來保存用戶名和密碼(加密后保存的)
cookie 的缺點(diǎn)
- cookie體積過大會造成請求和響應(yīng)速度變慢。
- 默認(rèn)瀏覽器會任何請求都把cookie帶上去营罢,哪怕是靜態(tài)資源赏陵。
- cookie可以在前后端修改,數(shù)據(jù)容易篡改或偽造饲漾。
- cookie對于敏感數(shù)據(jù)的保護(hù)基本是無效的蝙搔。
- 有些用戶是禁用掉cookie的
session
除了cookie,web應(yīng)用程序中還經(jīng)常使用session來記錄客戶端的登錄狀態(tài)考传。不同于cookie吃型,session保存在服務(wù)器上。session相當(dāng)于程序在服務(wù)器上建立一份客戶檔案僚楞,客戶來訪時(shí)只需要查詢客戶檔案表就可以了勤晚。
webStorage
webStorage是HTML5中本地存儲的解決方案之一枉层,在 html5 中的 WebStorage 概念引入并不是為取代 cookie 而制定的標(biāo)準(zhǔn),cookie 作為HTTP協(xié)議的一部分用來處理客戶端和服務(wù)器通信是不可或缺的赐写, session正是依賴于實(shí)現(xiàn)的客戶端狀態(tài)保持鸟蜡。
webStorage的意圖在于解決本地本來不應(yīng)該用 cookie 做,卻不得不用cookie的本地存儲挺邀。
webStorage 的優(yōu)勢
- 從容量上講WebStorage一般瀏覽器提供5M的存儲空間揉忘。
- 安全性上WebStorage 并不作為 HTTP header 發(fā)送的瀏覽器,所以相對安全端铛。
- 從流量上講泣矛,因?yàn)閃ebStorage不傳送到服務(wù)器,所以不必要的流量可以節(jié)省禾蚕。
Html 5的Web Storage分兩種您朽,一個(gè)是sessionStorage,另一個(gè)是localStorage换淆,兩者差別就差在生命周期的不同而已哗总。
sessionStorage 用于本地存儲一個(gè)會話(session)中的數(shù)據(jù),這些數(shù)據(jù)只有在同一個(gè)會話中的頁面才能訪問并且當(dāng)會話結(jié)束后數(shù)據(jù)也隨之銷毀倍试。因此 sessionStorage 不是一種長久化的本地存儲魂奥,僅僅是會話級別的存儲。
而localStorage則正好相反易猫,除非主動刪除數(shù)據(jù),否則數(shù)據(jù)是永遠(yuǎn)不會過期的具壮。
cookie和session的區(qū)別
- session 保存在服務(wù)器准颓,客戶端不知道其中的信息;cookie 保存在客戶端棺妓,服務(wù)器能夠知道其中的信息攘已。
- session 中保存的是對象,cookie 中保存的是字符串怜跑。
- session 不能區(qū)分路徑样勃,同一個(gè)用戶在訪問一個(gè)網(wǎng)站期間,所有的session在任何地方都可以訪問到性芬。而 cookie 中如果設(shè)置了路徑參數(shù)峡眶,那么同一個(gè)網(wǎng)站不同路徑下的 cookie 互相是不可以訪問的。
- cookie 不是很安全植锉,本人可以分析存放在本地的 COOKIE 并進(jìn)行 COOKIE欺騙
- session 會在一定時(shí)間內(nèi)保存在服務(wù)器上辫樱。當(dāng)訪問增多,會占用你服務(wù)器的性能俊庇∈ㄊ睿考慮到減輕服務(wù)器性能方面鸡挠,應(yīng)該使用 COOKIE。
- 單個(gè) cookie 保存的數(shù)據(jù)不能超過 4k 搬男,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存 20 個(gè) cookie拣展。
- session 是通過 cookie來工作的。
cookie 和 sessionStorage 缔逛、localStorage之間的區(qū)別
- 共同點(diǎn):都是保存在瀏覽器端备埃,且同源的。
- 區(qū)別:
- cookie數(shù)據(jù)始終在同源的http請求中攜帶(即使不需要)译株,即cookie在瀏覽器和服務(wù)器間來回傳遞瓜喇。而sessionStorage和localStorage不會自動把數(shù)據(jù)發(fā)給服務(wù)器,僅在本地保存歉糜。
- cookie數(shù)據(jù)還有路徑(path)的概念乘寒,可以限制cookie只屬于某個(gè)路徑下。
- 存儲大小限制也不同匪补,cookie數(shù)據(jù)不能超過4k伞辛,同時(shí)因?yàn)槊看蝖ttp請求都會攜帶cookie,所以cookie只適合保存很小的數(shù)據(jù)夯缺,如會話標(biāo)識蚤氏。sessionStorage和localStorage 雖然也有存儲大小的限制,但比cookie大得多踊兜,可以達(dá)到5M或更大竿滨。
- 數(shù)據(jù)有效期不同,
sessionStorage:僅在當(dāng)前瀏覽器窗口關(guān)閉前有效捏境,自然也就不可能持久保持于游;
localStorage:始終有效,窗口或?yàn)g覽器關(guān)閉也一直保存垫言,因此用作持久數(shù)據(jù)贰剥;
cookie只在設(shè)置的cookie過期時(shí)間之前一直有效,即使窗口或?yàn)g覽器關(guān)閉筷频。 - 作用域不同蚌成,
sessionStorage不在不同的瀏覽器窗口中共享,即使是同一個(gè)頁面凛捏;
localStorage 在所有同源窗口中都是共享的担忧;
cookie也是在所有同源窗口中都是共享的。 - Web Storage 支持事件通知機(jī)制葵袭,可以將數(shù)據(jù)更新的通知發(fā)送給監(jiān)聽者涵妥。
- Web Storage 的 api 接口使用更方便。
sessionStorage與頁面 js 數(shù)據(jù)對象的區(qū)別
頁面中一般的 js 對象或數(shù)據(jù)的生存期是僅在當(dāng)前頁面有效,因此刷新頁面或轉(zhuǎn)到另一頁面這樣的重新加載頁面的情況蓬网,數(shù)據(jù)就不存在了窒所。
而 sessionStorage 只要同源的同窗口(或tab)中,刷新頁面或進(jìn)入同源的不同頁面帆锋,數(shù)據(jù)始終存在吵取。也就是說只要這個(gè)瀏覽器窗口沒有關(guān)閉,加載新頁面或重新加載锯厢,數(shù)據(jù)仍然存在皮官。
參考自: