世界上任何一個擁有用戶數據的 web 應用都必須處理 sessions。作為一名開發者,我們必須要知道它們是什么以及如何處理它們。
在這篇文章中,我想要分享的是:
session 是什么?
session 如何存儲數據?
你如何決定存放 session 數據的位置?
在 sessions 工作時,你必須意識到的安全性上的影響有哪些?
在一些示例代碼中,我將會運用?session npm module ,它很有可能是最常見的 session 庫。
session 是存儲你通過請求獲取到的數據的地方。每一個訪問你網站的用戶都有一個唯一的 session。當他們瀏覽你應用的時候,你就可以使用 session 去存儲和獲取用戶數據。
session 對 web 應用開發來講是必須有的,因為 session 允許應用去存儲狀態。基于用戶在頁面 A 上的一個動作,我們就可以展示出一個不同的頁面 B。如果沒有 session,應用將是無狀態的,而且很無用。
這里展示了你如何使用 Express 去建立一個簡單的 session
import express from "express"; import session from "express-session"; var app = express(); app.use(session());
如果你的應用已經有了可使用的 sessions, 你可以在一個路由處理中設置一些數據:
app.use(session({ secret: "this-is-a-secret-token", cookie: { maxAge: 60000 }})); // Access the session as req.session app.get("/", function(req, res, next) { var sessData = req.session; sessData.someAttribute = "foo"; res.send("Returning with some text"); });
在另一個路由處理中讀到它:
app.get("/bar", function(req, res, next) { var someAttribute = req.session.someAttribute; res.send(`This will print the attribute I set earlier: ${someAttribute}`); });
sessions 可以用不同的方式存儲它們的信息。存儲 session 數據最受歡迎的方式有:
在應用內存中
在 cookie 中
在內存緩存中
在數據庫中
使用應用內存存儲 session 數據這是常見的最簡單的存儲方式,但在生產環境中不用。
用這種方式存儲從根本上意味著數據在應用執行時間中的有效期內被存儲,一旦你的 web 應用服務器宕機了或停止運行了,所有的 session 數據都會被移除。
在內存中存儲 session 數據也會導致內存泄露。當你的應用保持運行的時候,越來越多的內存被占用,直到應用因為內存不足而退出。
為了開發的目的,把 session 數據存在內存中經常很有用。然而,這兒還有更好的存儲 session 數據的方式。
cookie 通常是從 web 服務器發送到你的 web 瀏覽器上的一小塊數據。它允許服務器存儲一個具體用戶相關的信息。
cookies 的一種常見用法就是存儲 session 數據,它的工作流程是:
1、服務器發送一個 cookie 給 web 瀏覽器,并且在客戶端存儲一段時間(稱為 expiration time)。
2、當用戶隨后向 web 服務器發起一個請求時,這個 cookie 會和這個請求一起發送,服務器可以讀到 cookie 中包含的信息。
3、如果需要的話,服務器可以修改 cookie,然后再把它返回給瀏覽器。
每次你發起一個請求,你的瀏覽器都會把 cookie 發送給服務器,直到 cookie 過期為止。
類似 express-session 這樣的模塊會給你提供一個友好的 API 和 sessions 一起工作(讓你可以獲取 & 設置 session 里的數據 ),但是在底層,它可以通過 cookie 保存和恢復這個數據。
Express-session?也提供一些方法來保證你 cookies 的安全性。我們在這不會講述安全細節,但是我推薦你通過閱讀文檔來詳細研究安全細則。這對于確保你應用里的 cookie 信息不被暴露是非常重要的。
使用 cookie 存儲 session 數據也帶來了一些問題:
1、可以存儲的數據量很小,大約只有 4kb。
2、因為每次發送請求都會攜帶 cookie,如果你在 cookie 中存儲了一堆數據,它將會增加請求中的數據量,從而導致你的網站性能降低。
3、如果攻擊者弄清楚了你的 cookies 是如何加密的,那么你的 cookies 就危險了。攻擊者將能讀到 cookies 中存儲的信息,這可是用戶敏感信息啊!
內存緩存是可以存儲一小堆鍵值數據的地方。使用內存緩存存儲 session 信息的最出名的兩個例子就是 ?Redis 和 ?Memcached。
在內存緩存中存儲 session 數據的時候,服務器仍然使用 cookie,但是這個 cookie 只包含一個唯一的 sessionId。這個 sessionId 在服務器對儲存庫進行查找的時候使用。
使用內存緩存的時候,你的 cookie 只包含一個 session ID。它避免了私人用戶信息被暴露在 cookie 中的危險。
使用內存緩存存儲 session 數據的優點:
1、基于鍵值對數據存儲,便于查找。
2、它們和你的應用服務器分隔開來。這種分隔降低了依賴。
3、多帶帶一個內存存儲可以服務好多個應用。
4、通過移除老的 session 數據來自動管理內存。
當然,這種存儲方式也有一些缺點:
1、它們是另一臺服務器,需要進行建立和管理。
2、對一些小應用來說可能是殺雞用了牛刀。一般這種情況的話,使用數據庫存儲或者 cookies 存儲效果更好。
3、重置緩存的唯一辦法就是移除所有存儲在它里面的 sessions。
下面的示例告訴你如何來用 express-session 來建立一個類似 Memcached 的內存緩存,通過 ?connect-memcached 模塊。
var express = require("express"); var session = require("express-session"); var cookieParser = require("cookie-parser"); var app = express(); var MemcachedStore = require("connect-memcached")(session); app.use(cookieParser()); app.use(session({ secret : "some-private-key", key : "test", proxy : "true", store : new MemcachedStore({ hosts: ["127.0.0.1:11211"], //this should be where your Memcached server is running secret: "memcached-secret-key" // Optionally use transparent encryption for memcache session data }) }));使用數據庫存儲 session 數據
最后,我們談一下在傳統的數據庫中存儲 session 數據,比如 MySQL 和 PostgreSQL。在大多數情況下,它以一種類似于在內存中存儲 session 數據的方式來工作。
session cookie 仍然只含有一個 sessionId。在這種情況下,它將會匹配數據庫里的 session 表中的第一個 key 值。
總的來講,我不推薦使用數據庫來存儲 session 數據,我這么做的唯一的理由是它需要花費大量精力去建立 ?Memcached? 或 Redis。
從數據庫中恢復數據比用內存緩存恢復要慢的多,因為數據存儲在硬盤上,而不是內存中。當你把 session 數據存在數據庫里的時候,你會被數據庫暴擊的。。。。
另外,你必須自己全權管理老的 session 數據。如果你沒有移除老的 session 數據,你的數據庫將被成千上萬條無用數據行占用。
這里有許多數據庫存儲,你可以使用 express-session。在 ?README 中查看完整列表。
我們討論了常用的三種方式存儲來存儲你的 session 數據。那么你應該在哪存儲你的 session 數據呢?
總的來說,我遵循這個規則:“內存第一(譯者注:這里應該是指內存緩存),cookie 第二,最后是數據庫”。
如果你使用 Memcached 或 Redis,我會和你相伴。如果不是,把你的 session 數據存在 cookie,但一定要確保你私鑰的安全。最后,你可以把你的 session 數據存在數據庫里,但一定要有一個移除老 session 數據的計劃。
原文地址:http://nodewebapps.com/2017/0...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/61881.html
摘要:首先安裝單元測試環境使用模塊來模擬定義的模型。根據刪除這是單元測試的最后一小節。需要根據需求和單元測試用例來編寫應用邏輯,使我們的程序更加穩定。我們會運行自動測試用例,一直重構,直到所有單元測試都通過。 本文轉載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/746原文:https://semaphoreci.com/community/tutoria...
摘要:首先安裝單元測試環境使用模塊來模擬定義的模型。根據刪除這是單元測試的最后一小節。需要根據需求和單元測試用例來編寫應用邏輯,使我們的程序更加穩定。我們會運行自動測試用例,一直重構,直到所有單元測試都通過。 本文轉載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/746原文:https://semaphoreci.com/community/tutoria...
摘要:感謝使用框架本文檔涵蓋構建應用所需的基礎知識。用于數據校驗的組件及相關文件在此目錄進行管理。除了自定義中間件外,還是用了諸多第三方的中間件,它們是五測試我們使用組件對服務端代碼進行測試。識別當前導航從已有導航中刪除給定標識的導航配置。 本文同步至個人博客 MEAN.js 文檔,轉載請注明出處。 Overview 感謝使用 MEAN.js 框架! 本文檔涵蓋構建 MEAN 應用所需的基礎...
摘要:事件處理器,則是當指定事件觸發時,執行的一段代碼。事件循環以一個無限循環的形式啟動,存在于二進制文件里函數的最后,當沒有更多可被執行的事件處理器時,它就退出。 前言 如果你了解過Node.js,那么你一定聽說過事件循環。你一定想知道它為什么那么特殊,并且為什么你需要關注它?此時此刻的你,可能已經寫過許多基于Express.js的后端代碼,但沒有接觸到任何的循環。 在下文中,我們會先在一...
閱讀 2984·2023-04-26 00:23
閱讀 3399·2021-09-13 10:28
閱讀 2178·2021-08-31 14:18
閱讀 2884·2019-08-30 15:54
閱讀 1938·2019-08-30 15:43
閱讀 1276·2019-08-29 16:56
閱讀 2799·2019-08-29 14:16
閱讀 2052·2019-08-28 17:51