Node.js の express で session を使ってみました

Node.js の express で session が使いたかったので調べました。

環境

  • Node.js v8.9.4
  • npm 5.7.1
  • express 4.16.2
  • express-session 1.15.6

Advanced topics

公式のサイトを見てみました。 セキュリティについてのページに次のように記載されていました。

Use cookies securely

To ensure cookies don’t open your app to exploits, don’t use the default session cookie name and set cookie security options appropriately. There are two main middleware cookie session modules:

  • express-session that replaces express.session middleware built-in to Express 3.x.
  • cookie-session that replaces express.cookieSession middleware built-in to Express 3.x.

The main difference between these two modules is how they save cookie session data. The express-session middleware stores session data on the server; it only saves the session ID in the cookie itself, not session data. By default, it uses in-memory storage and is not designed for a production environment. In production, you’ll need to set up a scalable session-store; see the list of compatible session stores.

In contrast, cookie-session middleware implements cookie-backed storage: it serializes the entire session to the cookie, rather than just a session key. Only use it when session data is relatively small and easily encoded as primitive values (rather than objects). Although browsers are supposed to support at least 4096 bytes per cookie, to ensure you don’t exceed the limit, don’t exceed a size of 4093 bytes per domain. Also, be aware that the cookie data will be visible to the client, so if there is any reason to keep it secure or obscure, then express-session may be a better choice.

Security Best Practices for Express in Production

express でセッションを扱うには、 express-session か cookie-session ミドルウェアを使うみたいです。 これらもビルトインから、 ミドルウェアに置き換えられたもののようです。

これら 2 つには、次のような違いがあるみたいです。

  • express-session: session ID だけクライアントの cookie に保存して、データはサーバーに保存する
  • cookie-session: すべてのデータをクライアントの cookie に保存する

なので、データの容量が多い場合、セキュアなデータを扱う場合は express-session の方が良いみたいです。

今回は express-session を使うことにしました。

express-session

npm でパッケージをインストールするため package.json を初期化します。

$ npm init -y

express と express-session をインストールします。

$ npm install --save express express-session

次のようなファイルを作成しました。

次のコマンドを入力して実行します。

$ node app.js
Example app listening on port 3000!

http://localhost:3000/ にアクセスします。

tap! のリンクをクリックすると、 counter をインクリメントします。 10 秒の有効期限を設定してありますので、それを過ぎてから tap! をクリックすると、また新しいセッションが始まります。

session destroy! のリンクをクリックすると、有効なセッションを破棄します。 そして、最初のページにリダイレクトして、また新しいセッションが始まります。

Options

cookie.maxAge

Specifies the number (in milliseconds) to use when calculating the Expires Set-Cookie attribute. This is done by taking the current server time and adding maxAge milliseconds to the value to calculate an Expires datetime. By default, no maximum age is set.

Note If both expires and maxAge are set in the options, then the last one defined in the object is what is used.

express-session - npm

cookie の有効期限について、標準だと設定されていないようで、 cookie.maxAge にミリ秒単位で指定するようです。

cookie.expires

Specifies the Date object to be the value for the Expires Set-Cookie attribute. By default, no expiration is set, and most clients will consider this a “non-persistent cookie” and will delete it on a condition like exiting a web browser application.

Note If both expires and maxAge are set in the options, then the last one defined in the object is what is used.

Note The expires option should not be set directly; instead only use the maxAge option.

express-session - npm

cookie.expires に直接指定するのではなく、 cookie.maxAge に指定することを推奨しているようです。

終わり

ミドルウェアで npm のパッケージをインストールしなければいけないところ、少しハードルが高くなってしまった感じを受けます。