UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

Node.jsでセッションを管理する | Express + Node.js + express-sessionでセッション管理を行うためのメモ

Express.jsでセッション管理を行うためのフレームワークとして最も一般的に利用されているのがexpress-sessionです。

www.npmjs.com

express-sessionの上にpassportなどのフレームワークを利用してOauth認証に対応させることも可能になります。

セッションの仕組み

express-sessionの使い方に移る前にセッションの仕組みについて復習します。

最初に注意しなければいけないのはインターネットでは、「状態」を維持することはできないということ、つまり、PCやスマホでインターネットを閲覧している人はサーバーと接続したままにすることはできません。「このページが見たい!」というリクエストを送ってサーバーが対応したページを返す。という単純なやり取りしかできません。

そこでサーバーとクライアント(PCやスマホでインターネットを見る人)の間で共通のタグをもつことで、一種の状態を管理しようというわけです。これを「セッション」と呼びます。そして、このやり取りのために使用する「タグ」を管理するために利用されるのが「Cookie(クッキー)」です。

セキュリティに十分注意した上で、セッション管理を行うのは実は非常に面倒なことです。そのため、基本的にどのWebアプリケーションでも専用のライブラリをを利用するのが一般的です。

Cookieはどこにあるの?

通常、Webページにアクセスした時に、サーバーから返されるデータにはあなたが目で確認することのできるデータ本体(ボディ)と追加的な情報(メタデータ)が書いてある(ヘッダ)部分があります。

クッキーが含まれているのはヘッダの部分です。

Node.jsでクッキーを使うには?

client-sessions

www.npmjs.com

Mozillaが開発したライブラリです。

express-session

www.npmjs.com

最も一般的に利用されているライブラリです。

この2つの使い方は実に似ていますが、express-sessionはpassportなどのアドオンが豊富にありますので、こちらの方がはるかに人気です。

今回はexpress-sessionの使い方を説明したいと思います。

sudo npm i express-session --save

ライブラリを読み込む

const session = require('express-session');

Expressと連携 - app.use()で読み込みます

app.use(session());

sessionの引数として設定値を与えることができます。

なおデフォルト値は

デフォルト値
path ‘/’
httpOnly true
secure false
maxAge null

となっています。

設定が可能なオプションは

expires

クッキーの有効期限が切れる年月を設定します。一般的には直接設定せずにmaxAgeを設定することが推奨されています。

maxAge

クッキーの有効時間を設定します。 単位はミリ秒です。

secure

クッキーを安全に取り扱うように指示します。 このオプションはHTTPSを有効化している時にのみ有効です。もしHTTPの場合に利用するとクッキーが利用できなくなる場合があります。

httpOnly

httpOnlyを有効化するかを選択します。

saveUninitialized

passportを利用して、セッション管理を行う場合はfalseに設定します。

secret

セキュリティのためにセッションデータに署名するための暗号化キーを設定します。

store

セッションをサーバーサイドで管理するためのストレージを設定します。デフォルトではメモリーに格納されますが、実運用ではDBを利用すべきでしょう。

req.session

express-sessionでセッションを有効化すると任意のルーティングでreq.sessionオブジェクトを利用できるようになります。このreq.sessionオブジェクトへの変更はセッションに反映されます。

コールバック

express-sessionではsessionについてのイベントに対してコールバック関数を設定することができます。

req.session.regenerate

セッションが再生成される時に発火するメソッドです

req.session.regenerate((err) =>{

}):

req.session.destroy

セッションが破棄される時に発火するメソッドです。

req.session.destroy((err) =>{

})


req.session.reload

ストレージからセッション情報を読みだして、req.sessionに格納する時に発火します。

req.session.save

セッション情報の変更をストレージに格納する時に発火します。HTTPリクエストでセッションを更新する時に自動的に発火します。

req.session.cookie

セッション情報を格納するクッキーの設定を行います。

req.session.cookie.maxAge

クッキーの有効期限を設定します。

単位はミリ秒単位です。

req.session.cookie.secure

セキュアな設定にします。HTTPSを利用している時にだけ有効化すべきでしょう。

設定例


app.use(session({{
  secret: 'b87ef9fb4a152dbfe4cf4ea630444474',
  resave : false,
  saveUninitialized : false,
  cookie: {
    maxAge: 24 * 60 * 60 * 1000 // 1日有効
  },
 }));