【解決策】express-sessionでセッションが保存されない問題の原因と対応

express-sessionでセッション保存時にエラーにはならないがセッションが保存されない問題の対応についてメモしました。
経緯
本番環境でexpress-sessionを利用しセッションの保存先のストアをredisを指定しました。
そして実際にセッションの保存を行った際にエラーにはならないが保存されないという問題が発生しました。
構成
構成としては外側はSSLですが内部はhttpで通信しています。
clinent → proxy(https)
proxy → webアプリ(http)
設定
express-sessionへ渡している設定はこのようになります。
javascriptsession({
secret: 'secret_key',
resave: true,
saveUninitialized: true,
store: new RedisStore({ client: redisClient }),
cookie: {
httpOnly: true,
secure: true,
maxAge: 1000 * 60 * 30,
},
})
環境
- Node 14.15.3
- express 4.17.1
- express-session 1.17.2
- redis 3.1.2
事象の再現手順
下記の手順で再現します。
テスト用のエンドポイント作成
テスト用のエンドポイントを作成してセッションの中身を確認します。
javascriptapp.get(
'/sessin-test',
(req: express.Request, res: express.Response): void => {
console.log(req.session.hoge)
req.session.hoge = "hoge"
console.log(req.session.hoge)
}
);
エンドポイントへリクエスト
エンドポイントへリクエストします。
zsh$ crul https://XXXXXX.XX//sessin-test
ログを確認
ログを確認すると2回目のhogeは出力されています。
console
hoge
再リクエスト
再リクエストを実施するとログは下記になります。
console
hoge
セッションへ保存されているのであれば本来はこのようになって欲しいのですが。
consolehoge
hoge
trust proxyを指定して解決
かなりハマったのですが、proxy下でexpressを利用する場合
trust proxyの設定が必要でした。
expressへtrust proxyをセット
下記のようにexpressへtrust proxyをセットをセットします。
javascriptconst app = express();
app.set("trust proxy", 1);
再度ログを確認
無事セッションが保存されていました。
consolehoge
hoge
原因
cookieのオプションのsecureをtrueにしている場合
javascript cookie: {
secure: true,
},
proxy配下だとexpress自体はhttpで起動しているため信頼できずcookieが発行されないことが原因でした。
app.set( 'trust proxy')を介して「trustproxy」設定を有効にすることにより
expressは、プロキシの背後にあることおよびX-Forwarded- *ヘッダーフィールドが信頼されているという認識へ変わるため
Secureなcookieを発行することができるようになります。
- article
【対処法】expressのIPを取得するメソッド req.connectionの非推奨による対応
- article
Next.js + Custom Server(Express)でTypeScript保存時にnodemon再起動する設定
- article
mkcertでオレオレ認証局とオレオレ証明書を作成しNode.js ExpressサーバーをSSL起動する設定
- article
【解決策】express-sessionでセッションが保存されない問題の原因と対応
- article
Node.js + Express + Redisを使った簡単なログイン機能の実装
- article
Node.jsのExpressで環境構築し簡単なAPIをサクッと作成する手順
- review
もう無駄な努力はしない!『イシューからはじめよ』安宅和人著で身につけた、99%の人が知らない本当に価値ある問題の見つけ方
- review
もう朝起きるのが辛くない!『スタンフォード式 最高の睡眠』西野精治著で学んだ、たった 90 分で人生が変わる睡眠革命
- review
もう「なんとなく」で決めない!『解像度を上げる』馬田隆明著で身につけた、曖昧思考を一瞬で明晰にする技術
- review
もう疲れ知らず!『最高の体調』鈴木祐著で手に入れた、一生モノの健康習慣術
- review
人生が激変!『苦しかったときの話をしようか』森岡毅著で発見した、本当に幸せなキャリアの築き方
- review
もう「何言ってるの?」とは言わせない!『バナナの魅力を 100 文字で伝えてください』柿内尚文著 で今日からあなたも伝え方の達人!