http://www.javascriptkit.com/javatutors/cookie.shtml
一方、セッションのみの Cookie は、ブラウザのメモリに情報を保存し、ブラウザ セッションの間使用できます。つまり、セッション Cookie 内に保存されたデータは、保存されてからブラウザが閉じられるまで利用できます。この間にページを移動しても、データは消去されません。
Express.jsを使用してこれを達成するにはどうすればよいですか?
http://www.javascriptkit.com/javatutors/cookie.shtml
一方、セッションのみの Cookie は、ブラウザのメモリに情報を保存し、ブラウザ セッションの間使用できます。つまり、セッション Cookie 内に保存されたデータは、保存されてからブラウザが閉じられるまで利用できます。この間にページを移動しても、データは消去されません。
Express.jsを使用してこれを達成するにはどうすればよいですか?
まず、そのウェブサイトは恐ろしい場所です。
それでは質問に移ります。
実際のセッションとは:
Session ID
これで、サーバーは、Cookie 内の ID (一般に、または略しSID
て呼ばれます) を、サーバーに保存されているセッション データに再度関連付けることができます。Express.js は、組み込みのセッションをサポートしています。
例が示すもの:
Redis のインストールにはかなりの作業が必要ですが、Express.js の組み込みメモリ ストアを使用することもできます。
var express = require('express');
var app = express.createServer();
var MemoryStore = require('connect/middleware/session/memory');
app.use(express.bodyDecoder());
app.use(express.cookieDecoder());
app.use(express.session({ store: new MemoryStore({ reapInterval: 60000 * 10 }) }));
app.get('/', function(req, res){
req.session.visitCount = req.session.visitCount ? req.session.visitCount + 1 : 1;
res.send('You have visited this page ' + req.session.visitCount + ' times');
});
app.listen(4000);
これは、ページにアクセスした回数、ブラウザを閉じて再度開いた回数を追跡するだけです。カウントはまだそこにあります。
MemoryStore
セッションの最大存続時間など、のオプションの詳細については、こちらを参照してください。
以下は私が欲しかったものです(一種)。ブラウザを閉じると情報が消えます。
var express = require('express');
var app = express.createServer();
var MemoryStore = require('connect/middleware/session/memory');
app.use(express.bodyDecoder());
app.use(express.cookieDecoder());
app.get('/remember', function(req, res) {
res.cookie('rememberme', 'yes', { expires: new Date() - 1, httpOnly: true });
});
app.get('/', function(req, res){
res.send('remember: ' + req.cookies.rememberme);
});
app.listen(4000, '127.0.0.1');
app.use(express.session({cookie: { path: '/', httpOnly: true, maxAge: null }, secret:'eeuqram'}));
上記は IE8、Firefox、および Chrome で動作します。重要な部分はmaxAge:nullです
以下は、 Alfred の回答(Express.js を使用したセッション)の更新されたコードです。
var express = require('express');
var app = express.createServer();
var MemoryStore = require('/home/node/node_modules/connect/lib/middleware/session/memory');
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({
key: 'some-key',
secret: 'some-We1rD sEEEEEcret!',
store: new MemoryStore({ reapInterval: 60000 * 10 })
}));
app.get('/', function(req, res) {
req.session.visitCount = req.session.visitCount ? req.session.visitCount + 1 : 1;
res.send('You have visited this page ' + req.session.visitCount + ' times');
});
app.listen(4000);
これは古い質問であることは知っていますが、ここでのすべての回答は時代遅れであるか、セキュリティ上の欠陥があるか、単に間違っているように見えるため、回答を追加しています。
現在のところ、express はMemoryStore
デフォルトで を使用しているため、明示的に処理する必要はありません。
また、現時点では、express-session の公式 readme ページには、最初に、本番用のセッション ストアとして使用しないようにという厳しい警告があり、次のMemoryStore
ように引用しています。
警告 デフォルトのサーバー側セッション ストレージである MemoryStore は、意図的に運用環境用に設計されていません。ほとんどの条件下でメモリ リークが発生し、単一のプロセスを超えてスケーリングされず、デバッグと開発を目的としています。
ストアのリストについては、互換性のあるセッション ストアを参照してください。
connect-mongodb-session
セッション ストレージに MongoDBStore を使用する場合の簡単なソリューションを次に示します。
import express from 'express';
import session from 'express-session';
import ConnectMongoDbSession from 'connect-mongodb-session';
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(session({
secret: < COOKIE_SECRET >,
name: 'sessionId', // Don't use the default name, see http://expressjs.com/en/advanced/best-practice-security.html
cookie: {
httpOnly: true,
secure: true, // Remove this if you're not using HTTPS, but it will be a massive security flaw
sameSite: 'strict',
},
store: getStore(),
// Boilerplate options, see:
// * https://www.npmjs.com/package/express-session#resave
// * https://www.npmjs.com/package/express-session#saveuninitialized
resave: true,
saveUninitialized: true,
}));
function getStore() {
const MongoDBStore = ConnectMongoDbSession(session);
const store = new MongoDBStore({
uri: < DATABASE_URI >,
collection: < SESSION_COLLECTION_NAME >,
connectionOptions: {
useNewUrlParser: true,
useUnifiedTopology: true,
},
});
store.on('error', (error: any) => {
console.error(error);
});
return store;
}