cookie
1、什麼是cookie
是指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(通常經過加密)。
Cookie是由服務端生成的,發送給客戶端(通常是瀏覽器)的。Cookie總是保存在客戶端中。
2、爲什麼要使用cookie?
這是因爲http是無狀態的,兩次請求間,服務器不知道用戶上一次執行了什麼操作,這嚴重的阻礙了交互式web應用程序的實現。服務器可以通過設置或者讀取cookie中存儲的信息,藉此維護用戶和服務器會話中的狀態
3、cookie有哪些優點
cookie機制將信息存儲於用戶硬盤,因此可以作爲跨頁面全局變量
4、cookie有哪些缺陷
- cookie的安全性不夠高
cookie的信息是存儲在瀏覽器中的,所以容易被篡改,因此我們不會將很重要的信息存儲在cookie中 - cookie可能被禁用
- cookie可能被用戶刪除
- cookie的存儲空間很小(只有4kb左右)
cookie由於每次請求都要向後臺發送數據,所以容量要有限制,否則會大大降低網絡傳輸效率。 - cookie會被附加在每個HTTP請求中,所以無形中增加了流量。
5、一般在什麼場合使用cookie
- 保持用戶的登陸狀態
- 跟蹤用戶的行爲,比如記錄用戶瀏覽數據,進行商品(廣告)推薦
- 創建購物車
6、如何使用cookie
- 服務器端給客戶端發送cookie
const express = require('express');
var server = express();
server.use('/aaa/a.html',function(req,res){//只能對aaa目錄下的a.html起作用
res.cookie('user','blue',{
path:'/aaa',//cookie存儲的路徑,匹配該路徑才發送這個 cookie。
maxAge:30*24*3600*1000//以毫秒爲單位,表示過期時間
});
res.send('ok');
});
server.listen(8080);
- 使用cookie-parser中間件讀取cookie
const express = require('express');
const cookieParser = require('cookie-parser');
var app = express();
app.listen(8080);
app.use(cookieParser('aass'));
//這裏要注意的是,我們之前在/aaa中請求了cookie,而我們在/中能讀取到,是因爲cookie是向上級讀取的
app.get('/',function (req,res) {
res.secret='aass';
res.cookie('name','GeZi',{
path:'/',//訪問哪一個路徑的時加上cookie
maxAge:20*60*1000,//cookie的存活時間,單位毫秒
signed:true//是否加簽名
});
console.log('沒有簽名的cookie:',req.cookies);
console.log('簽名後的cookie:',req.signedCookies);
res.send(req.cookies);
});
- 清除cookie
res.clearCookie('name')
session
什麼是session
Session代表服務器與瀏覽器的一次會話過程,這個過程是連續的,也可以時斷時續的。Session是一種服務器端的機制,Session 對象用來存儲特定用戶會話所需的信息。
Session由服務端生成,保存在服務器的內存、緩存、硬盤或數據庫中。
爲什麼要使用session
- cookie不夠安全
cookie是保存在客戶端的數據,容易被篡改,session保存在服務器端,不會被篡改。 - cookie可以存儲的內容太少了
session
那麼問題來了,既然cookie相對於session有那麼大的不足,爲什麼還需要cookie呢?
因爲session是基於cookie實現的,當建立一個新session的時候,向客戶端下發一個session-id,讓客戶端保存session-id在cookie中,下一次發起請求的時候,將session-id發回後臺,後臺通過session-id,在很多session中查找到相應session-id對應的session進行操作。
一般在什麼場合使用session
- 會話管理 登錄,購物車,遊戲分數或服務器應記住的任何其他內容
- 個性化用戶首選項,主題和其他設置
- 跟蹤記錄和分析用戶行爲
如何使用session
這裏用到cookie-session中間件
const express = require('express');
const cookieParser = require('cookie-parser');
const cookieSeesion = require('cookie-session');
var server = express();
server.listen(8080);
server.use(cookieParser('這段簽名的字符串可以是隨意的'));
(function () {
var arr = [];
for(var i = 0;i<10000;i++){
arr.push('keys_'+Math.random());
}
server.use(cookieSeesion({
keys:arr,
name:'session_id',//加密的cookie的名字,最後通過這個來從服務端查找到對應的人 maxAge:20*60*1000
}))
})();
server.get('/',function (req,res) {
console.log(req.session['test']);
if(typeof req.session['test'] == 'undefined'){
req.session['test'] = 'xixi';
res.send('這是第一次訪問');
}else{
res.send('這不是第一次訪問');
}});
cookie和session的區別
-
存放位置不同
Cookie保存在客戶端,Session保存在服務端。 -
存取方式的不同
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二進制數據,需求先進行編碼。Cookie中也不能直接存取Java對象。若要存儲略微複雜的信息,運用Cookie是比擬艱難的。
而Session中能夠存取任何類型的數據,包括而不限於String、Integer、List、Map等。Session中也能夠直接保管Java Bean乃至任何Java類,對象等,運用起來十分便當。能夠把Session看做是一個Java容器類。 -
安全性(隱私策略)的不同
Cookie存儲在瀏覽器中,對客戶端是可見的,客戶端的一些程序可能會窺探、複製以至修正Cookie中的內容。而Session存儲在服務器上,對客戶端是透明的,不存在敏感信息泄露的風險。 假如選用Cookie,比較好的方法是,敏感的信息如賬號密碼等儘量不要寫到Cookie中。最好是像Google、Baidu那樣將Cookie信息加密,提交到服務器後再進行解密,保證Cookie中的信息只要本人能讀得懂。而假如選擇Session就省事多了,反正是放在服務器上,Session裏任何隱私都能夠有效的保護。 -
有效期上的不同
只需要設置Cookie的過期時間屬性爲一個很大很大的數字,Cookie就可以在瀏覽器保存很長時間。 由於Session依賴於名爲JSESSIONID的Cookie,而Cookie JSESSIONID的過期時間默許爲–1,只需關閉了瀏覽器(一次會話結束),該Session就會失效。 -
跨域支持上的不同
Cookie支持跨域名訪問,例如將domain屬性設置爲“.baidu.com”,則以“.baidu.com”爲後綴的一切域名均能夠訪問該Cookie。跨域名Cookie如今被普遍用在網絡中。而Session則不會支持跨域名訪問。Session僅在他所在的域名內有效。 -
對服務器造成的壓力不同
Session是保管在服務器端的,每個用戶都會產生一個Session。假如併發訪問的用戶十分多,會產生十分多的Session,耗費大量的內存。而Cookie保管在客戶端,不佔用服務器資源。假如併發閱讀的用戶十分多,Cookie是很好的選擇。