**Cookie **是當(dāng)你瀏覽某網(wǎng)站時(shí),網(wǎng)站存儲(chǔ)在你機(jī)器上的一個(gè)小文本文件,它可以記錄你的用戶ID,密碼、瀏覽過的網(wǎng)頁、停留的時(shí)間等信息,當(dāng)你再次來到該網(wǎng)站時(shí),網(wǎng)站通過讀取Cookie,得知你的相關(guān)信息,就可以做出相應(yīng)的動(dòng)作,例如在頁面顯示歡迎你的標(biāo)語,或者讓你不用輸入ID、密碼就直接登錄等。
** Session **存儲(chǔ)在服務(wù)器端,一般放在服務(wù)器的內(nèi)存中。Session 對象存儲(chǔ)特定用戶會(huì)話所需的信息。這樣,當(dāng)用戶在應(yīng)用程序的 Web 頁之間跳轉(zhuǎn)時(shí),存儲(chǔ)在 Session 對象中的變量將不會(huì)丟失,而是在整個(gè)用戶會(huì)話中一直存在下去。當(dāng)用戶請求來自應(yīng)用程序的 Web 頁時(shí),如果該用戶還沒有會(huì)話,則 Web 服務(wù)器將自動(dòng)創(chuàng)建一個(gè) Session 對象。當(dāng)會(huì)話過期或被放棄后,服務(wù)器將終止該會(huì)話。
1.Cookie的設(shè)置與發(fā)送過程
一個(gè)cookie的設(shè)置以及發(fā)送過程分為以下四步:
(1)客戶端發(fā)送一個(gè)http請求到服務(wù)器端
(2)服務(wù)器端發(fā)送一個(gè)http響應(yīng)到客戶端,其中包含Set-Cookie頭部
(3)客戶端發(fā)送一個(gè)http請求到服務(wù)器端,其中包含Cookie頭部
(4)服務(wù)器端發(fā)送一個(gè)http響應(yīng)到客戶端
查看筆記功能:
2、如何防止session超時(shí)?
眾所周知,當(dāng)用戶登錄網(wǎng)站后較長一段時(shí)間沒有與服務(wù)器進(jìn)行交互,將會(huì)導(dǎo)致服務(wù)器上的用戶會(huì)話數(shù)據(jù)(即session)被銷毀。此時(shí),當(dāng)用戶再次操作網(wǎng)頁時(shí),如果服務(wù)器進(jìn)行了session校驗(yàn),那么瀏覽器將會(huì)提醒用戶session超時(shí)。
那么,如何解決用戶登錄后較長時(shí)間未操作而導(dǎo)致的session失效的問題呢?
導(dǎo)致這個(gè)問題的關(guān)鍵詞有兩個(gè):一個(gè)是「長時(shí)間」,一個(gè)是「未操作」。
如果用戶未操作的「長時(shí)間」超過了服務(wù)器配置的session超時(shí)時(shí)間,并導(dǎo)致session失效,那么我們延長session的超時(shí)時(shí)間,讓用戶原來的「長時(shí)間」與超時(shí)時(shí)間相比,變得不「長」,不就可以解決了嗎?
如果用戶是長時(shí)間「未操作」導(dǎo)致session失效,那么我們想辦法產(chǎn)生「操作」,讓用戶每隔一小段時(shí)間就「操作」一次,與服務(wù)器產(chǎn)生交互,那么session自然也不會(huì)失效。
3、Cookie 和Session 的區(qū)別與應(yīng)用
Cookie和session由于實(shí)現(xiàn)手段不同,因此也各有優(yōu)缺點(diǎn)和各自的應(yīng)用場景:
** 應(yīng)用場景**
Cookie的典型應(yīng)用場景是Remember Me服務(wù),即用戶的賬戶信息通過cookie的形式保存在客戶端,當(dāng)用戶再次請求匹配的URL的時(shí)候,賬戶信息會(huì)被傳送到服務(wù)端,交由相應(yīng)的程序完成自動(dòng)登錄等功能。當(dāng)然也可以保存一些客戶端信息,比如頁面布局以及搜索歷史等等。
Session的典型應(yīng)用場景是用戶登錄某網(wǎng)站之后,將其登錄信息放入session,在以后的每次請求中查詢相應(yīng)的登錄信息以確保該用戶合法。當(dāng)然還是有購物車等等經(jīng)典場景;
安全性
Cookie將信息保存在客戶端,如果不進(jìn)行加密的話,無疑會(huì)暴露一些隱私信息,安全性很差,一般情況下敏感信息是經(jīng)過加密后存儲(chǔ)在cookie中,但很容易就會(huì)被竊取。而session只會(huì)將信息存儲(chǔ)在服務(wù)端,如果存儲(chǔ)在文件或數(shù)據(jù)庫中,也有被竊取的可能,只是可能性比cookie小了太多。
Session安全性方面比較突出的是存在會(huì)話劫持的問題,這是一種安全威脅。
總體來講,session的安全性要高于cookie。
性能
Cookie存儲(chǔ)在客戶端,消耗的是客戶端的I/O和內(nèi)存,而session存儲(chǔ)在服務(wù)端,消耗的是服務(wù)端的資源。但是session對服務(wù)器造成的壓力比較集中,而cookie很好地分散了資源消耗,就這點(diǎn)來說,cookie是要優(yōu)于session的;
但是Cookie會(huì)增加網(wǎng)絡(luò)流量。
** 時(shí)效性**
Cookie可以通過設(shè)置有效期使其較長時(shí)間內(nèi)存在于客戶端,而session一般只有比較短的有效期(也可以通過用戶主動(dòng)銷毀session或關(guān)閉瀏覽器后引發(fā)超時(shí));
其他
Cookie的處理在開發(fā)中沒有session方便。而且cookie在客戶端是有數(shù)量和大小的限制的,而session的大小卻只以硬件為限制,能存儲(chǔ)的數(shù)據(jù)無疑大了很多。
Cookie基礎(chǔ)實(shí)驗(yàn)
Cookie的屬性如下:
Cookie名稱,Cookie名稱必須使用只能用在URL中的字符,一般用字母及數(shù)字,不能包含特殊字符,如有特殊字符想要轉(zhuǎn)碼。如js操作cookie的時(shí)候可以使用escape()對名稱轉(zhuǎn)碼。
Cookie值,Cookie值同理Cookie的名稱,可以進(jìn)行轉(zhuǎn)碼和加密。
Expires,過期日期,一個(gè)GMT格式的時(shí)間,當(dāng)過了這個(gè)日期之后,瀏覽器就會(huì)將這個(gè)Cookie刪除掉,當(dāng)不設(shè)置這個(gè)的時(shí)候,Cookie在瀏覽器關(guān)閉后消失。
Path,一個(gè)路徑,在這個(gè)路徑下面的頁面才可以訪問該Cookie,一般設(shè)為“/”,以表示同一個(gè)站點(diǎn)的所有頁面都可以訪問這個(gè)Cookie。
Domain,子域,指定在該子域下才可以訪問Cookie,例如要讓Cookie在a.test.com下可以訪問,但在b.test.com下不能訪問,則可將domain設(shè)置成a.test.com。
Secure,安全性,指定Cookie是否只能通過https協(xié)議訪問,一般的Cookie使用HTTP協(xié)議既可訪問,如果設(shè)置了Secure(沒有值),則只有當(dāng)使用https協(xié)議連接時(shí)cookie才可以被頁面訪問。
HttpOnly,如果在Cookie中設(shè)置了"HttpOnly"屬性,那么通過程序(JS腳本、Applet等)將無法讀取到Cookie信息。
1、初始化項(xiàng)目并安裝必要的包
#mkdir cookie
#npm init
#npm npm install express cookie-parser --save
2、編寫Cookie程序(設(shè)置與讀取cookie)
編寫如下程序:
首先調(diào)用read,沒有相應(yīng)的cookie信息。
調(diào)用write,可以看到response中有set-Cookie
再次調(diào)用read,可以看到resquest中附帶了,之前設(shè)置的cookie信息。
3、設(shè)置Cookie中的域名
缺省為當(dāng)前域名
首先清除該域名下的所有cookie。
調(diào)用write,設(shè)置cookie
調(diào)用read,沒有cookie信息,因?yàn)橛蛎灰恢隆?/p>
在客戶端通過修改host文件,來模擬一個(gè)域名
再次調(diào)用write,設(shè)置cookie。
調(diào)用read,可以看到cookie信息。
4、設(shè)置Cookie的Path
缺省為"/"
首先清除該域名下的所有cookie。
調(diào)用write,設(shè)置cookie,path='/abc'
調(diào)用abc,可以看到cookie信息。
5、設(shè)置Cookie的Expires
該值缺省為:session ;瀏覽器關(guān)閉后失效
調(diào)用write,設(shè)置cookie,失效時(shí)間為2分鐘。
上面的時(shí)間中,GMT的含義是格林尼治標(biāo)準(zhǔn)時(shí)間。
調(diào)用read
2分鐘后調(diào)用read,已經(jīng)沒有cookie信息了。
通過maxAge設(shè)置Cookie失效時(shí)間
6、設(shè)置Cookie的 httponly
缺省為false
調(diào)用write,設(shè)置Cookie
下面通過腳本來讀取cookie,只能讀出a的值。
可以修改未設(shè)置為httponly的數(shù)據(jù)。
6、設(shè)置Cookie的signed
對cookie的值進(jìn)行簽名,防止用戶篡改其值
b已經(jīng)被簽名
簽名的數(shù)據(jù)在req.signedCookies中。
可以使用unescape進(jìn)行解碼。
8、Cookie可能存在的問題:
(1)瀏覽器向服務(wù)器發(fā)起的每個(gè)請求都會(huì)帶上cookie;加大了網(wǎng)絡(luò)流量。
(2)在客戶端,Cookie會(huì)存在本地計(jì)算機(jī)中,存在安全隱患;
(3)http協(xié)議本身是是無狀態(tài)的,但是現(xiàn)代站點(diǎn)很多都需要維持登錄態(tài),也就是維持會(huì)話。因此可能會(huì)把用戶的信息存儲(chǔ)在Cookie中;
(4)有些服務(wù)器對請求頭的大小有限制。
2、安全性問題:
(1)偽造Cookie:可以采用加密的方式防止偽造。
Cookie截獲:使用Https協(xié)議。
(2)跨站腳本攻擊(Cross Site Scripting,常簡寫作XSS),可以借助httpOnly屬性來防止該攻擊。
(3)Cookie截獲:使用Https協(xié)議。