web-dev-qa-db-ja.com

エクスプレスセッションとCookieセッションの違いは何ですか?

Expressが初めてです。なので Express 4.xはバンドルされたミドルウェアを削除しました。使用したいミドルウェアが必要です。 githubでREADMEと express-session および cookie-session を読んだとき、違いを理解するのは難しいと感じています。

それで、私はそれを理解するために簡単なコードを書きます。ミドルウェアごとに2回実行します。

var express = require('express')
  , cookieParser = require('cookie-parser')
  , session = require('cookie-session')
  , express_sess = require('express-session')
  , app = express();

app.use(cookieParser())
app.use(session({ keys: ['abc'], name: 'user' }));
//app.use(express_sess({ secret: 'abc', key: 'user'}));
app.get('/', function (req, res, next) {
    res.end(JSON.stringify(req.cookies));
    console.log(req.session)
    console.log(req.cookies)
});

app.listen(3000);

にとって cookie-session、端末には常に{}が表示されます。

にとって express-session、私はこのようなものを得る。

req.session: { cookie: { 
     path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true 
   } 
}

req.cookie: {user: 's:aJ97vKA5CCwxqdTj0AV1siRQ.fWusS5+qfCKICtwkfrzcZ/Gq8P0Qdx/kx8mTBhoOhGU'}

それは本当に私を混乱させます。では、基本的な使用方法で結果を説明する方法は?そして、それらの違いは何ですか?いつ使用するべきですか?

38
Tinple

基本的に、 express-sessionはより抽象的で、さまざまなセッションストア(ファイル、DB、キャッシュなど)をサポートします。

そしてcookie-sessionは、シンプルで軽量なCookieベース(Cookieがサポートされる唯一のストレージエンジンです。すべてのセッション情報は、Cookie内のクライアントに保存されます)セッション実装です。この種のセッションは、おそらく Rails実装 で最も有名です。

36
bredikhin

これらの両方の基本的な違いは、セッションデータがどのように、どこに保存されるかに関するものです。 Cookieセッションは基本的に、セッションデータがCookieに格納されているがclient [ブラウザ]内にある軽量セッションアプリケーションに使用されます。一方、Express Sessionは、クライアント側のCookie内に単なるセッションIDを保存するだけで、セッションデータをサーバー上に完全に保存します。 Cookieセッションは、バックエンドでデータベースが使用されていないアプリケーションで役立ちます。ただし、セッションデータはCookieのサイズを超えることはできません。データベースが使用される条件では、キャッシュのように機能し、頻繁なデータベース検索を停止しますが、これは高価です。

10
Doomed93

express-sessionはセッション識別子をCookieに保存しますが、実際のセッションデータはconnect-redisのようなバックエンドセッションストアに存在します。ここで、cookie-sessionはセッションデータをCookie(クライアント側)に保存できます。

cookie-sessionのドキュメントから:

ユーザーセッションは、主に2つの方法でCookieを使用して保存できます。サーバー上またはクライアント上です。このモジュールは、セッションデータをCookie内のクライアントに保存しますが、エクスプレスセッションのようなモジュールは、Cookie内のクライアントにセッション識別子のみを保存し、セッションデータをサーバー(通常はデータベース)に保存します。

cookie-sessionを使用する主な利点は、クラスター化されたnode.jsアプリがある場合、分岐したプロセス間でセッションデータを共有することに依存する必要がないことです。

7
Abhijeet

私が見つけた重要な違いを共有させてください:安全なクッキー

SSLを処理するnginxプロキシの背後にノードプロセスがあります。

Express-sessionで試しましたが、セキュアCookieを有効にできませんでした。 issue here を参照してください。

それから私はほとんど同じコードで試しましたが、代わりにcookie-session

_   const expressSession = require('cookie-session')

   var expiryDate = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); // 7 days

    const session = expressSession({
      secret: sessionSecret,
      resave: false,
      saveUninitialized: true,
      cookie: {
        secureProxy: true,
        httpOnly: true,
        domain: 'example.com',
        expires: expiryDate
      }
    })

    app.use(session)
_

私はちょうどrequire('express-session')require('cookie-session')に変更し、_secureProxy: true,_を追加しました:すべてが箱から出して動作しました。

また、両方のパッケージが expressjs によって維持されていることに注意してください。そのため、おそらく私の使用例では、cookie-sessionがニーズに合っていることがわかりました。

4
Gianluca Casati

v4-> cookie-sessionは(-cookieベースのセッションを確立します。)等しい-> ​​v3 express.cookieSession

v4-> express-sessionは(サーバーベースのセッションを確立する(開発のみ))。 -> v3 express.sessionに等しい

0
猪八戒

ロギングの前にセッション値を設定する必要がある空でないconsole.log(req.session)を取得します。

Cookie-sessionリポジトリから( https://github.com/expressjs/cookie-session ):

app.get('/', function (req, res, next) {
 req.session.views = (req.session.views || 0) + 1
 console.log(req.session)
 res.end(req.session.views + ' views')
})

Req.sessionオブジェクトに情報を設定したことがない場合、空を返します。

0
LeoGonzalez