所謂HTTP cookie又稱之爲 web cookie或browser cookie, 在形式上是由服務端發送給用戶瀏覽器端的一小段數據。它會自動地被瀏覽器存儲而後在下一次請求該服務器網絡資源時又返還給該服務器。因爲HTTP 通訊是無狀態的,在登陸頁面設計的時候,咱們每每利用cookie做爲瀏覽器狀態信息來確認當前用戶是否處於登陸狀態。node
cookies有如下三個主要應用場景:git
Session管理 如:登陸、購物車、遊戲積分、或者任何由瀏覽器操做記錄並同時應記錄在服務端的數據。web
個性設置 如:用戶偏好、web 主題、其餘個性化設置express
跟蹤 如:記錄和分析用戶習慣瀏覽器
cookies曾經是客戶端存儲數據的惟一方式,可是因爲現代瀏覽器的普及,以及在數據量較大時,攜帶cookies的通訊會下降網絡通訊的效率,愈來愈多的客戶端信息傾向於將客戶端數據存儲在
localStorage
和sessionStorage
以及IndexedDB
裏。安全
當一個瀏覽器向一個服務器發送請求的時候該服務器就會在response的時候自動發送Set-Cookie header
給到瀏覽器。bash
通常狀況下格式以下:服務器
Set-Cookie: key=value
Set-Cookie: key=value; Expires=<date>
Set-Cookie: key=value; Max-Age=<non-zero-digit>
Set-Cookie: key=value; Secure
Set-Cookie: key=value;; HttpOnly
複製代碼
瀏覽器端cookie類型分爲session cookie
和permanent cookie
,他們之間的區別在於前者只要在瀏覽器關閉後cookie就會消失,而permanent cookie
則不會,兩者設置的區別在於cookie設置的時候是否添加了expires
或者max-age
屬性。cookie
在瀏覽器端,若是用戶但願可以在代碼層面獲取cookie,能夠直接調用document.cookie.網絡
console.log(document.cookie);
複製代碼
但這裏會有一個漏洞,一旦網絡遭遇XSS 跨站攻擊,惡意代碼能夠輕易經過document.cookie
獲取到當前用戶cookie中的敏感信息,如userID, token等。因此在應用設計的時候,有些cookie會設置爲httpOnly cookie
,這樣,cookie只能被服務端讀取,而瀏覽器端獲取不到任何cookie信息。因此從在這裏必須強調若是是token這類的敏感信息,絕對不能存儲在HTTP cookie中,由於很是容易受到劫持。原則上,cookie設置HTTPS讀取是起碼的規定,若是能夠的話,最好放置在httpOnly cookies中。
儘管express原班人馬後來離職建立了Koa,在國內還有阿里的egg。可是express目前來講依然是全球最大的node.js 框架,基於這個緣由。咱們就利用express的cookie機制來從實戰角度來看cookie.
當網絡請求到達node.js服務器後,在服務器response的時候設置,代碼以下:
res.cookie('key','value',{});
// 前兩個參數比較好理解,也就是你要在cookie中要放入的某個鍵值對,第三個參數是一個可設可不設的對象,是對鍵值對的額外規定,好比咱們在給某個cookie設置有效時間期限的時候,就須要用到他。
res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true });
複製代碼
下面有一張表格詳細描述了第三個參數相關配置:
屬性 | 類型 | 描述 |
---|---|---|
domain | httpURL string | 默認值:本機服務器域名,通常不設置,能夠設置其餘服務器域名 |
encode | function | 默認值:encodeURIComponent,通常不設置,其做用在於對於cookie值進行加密 |
expires | Date | 若是不設置,cookies的類型則爲 session cookie, 值爲0. 若是設置則cookies的類型則爲 permanent cookie,值得類型爲GMT時間格式 |
httpOnly | boolean | 默認值:false, 若是設置的話,那麼cookie的值只有服務器能夠讀取,瀏覽器端沒法讀取,每每用於極其嚴格的token加密 |
maxAge | number | 它的做用和expires很是類似,設置毫秒值便可,用於登陸token類的設置 |
path | string | 默認值:"/",通常不設置,通常爲指定路由的cookie的設置 |
secure | boolean | cookies只能用於https通訊,在目前商業應用中,強烈建議設置 |
signed | boolean | cookies是否被簽名 |
res.clearCookie('keyname');
複製代碼