【解決策】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を発行することができるようになります。
articlehtmx × Express/Node.js 高速セットアップ:テンプレ・部分テンプレ構成の定石
articleTypeScript で学ぶミドルウェア設計パターン:Express・NestJS の応用例
articleNode.js と Express:API サーバーを高速構築
article【対処法】expressのIPを取得するメソッド req.connectionの非推奨による対応
articleNext.js + Custom Server(Express)でTypeScript保存時にnodemon再起動する設定
articlemkcertでオレオレ認証局とオレオレ証明書を作成しNode.js ExpressサーバーをSSL起動する設定
articleJavaScript 時刻の落とし穴大全:タイムゾーン/DST/うるう秒の実務対策
articleJavaScript Web Animations API:滑らかに動く UI を設計するための基本と実践
articleJavaScript Service Worker 運用術:オフライン対応・更新・キャッシュ戦略の最適解
articleJavaScript パフォーマンス最適化大全:レイアウトスラッシングを潰す実践テク
articleJavaScript IntersectionObserver レシピ集:無限スクロール/遅延読込を最短実装
articleJavaScript Web Workers 実践入門:重い処理を別スレッドへ逃がす最短手順
articleGrok プロンプト・テンプレ 100 連発:要約/翻訳/コード/分析 早見表
articleGitHub Copilot Workspace と Cursor/Cline の比較検証:仕様駆動の自動化能力はどこまで?
articleGitHub Actions 署名戦略を比べる:SHA ピン留め vs タグ参照 vs バージョン範囲
articlegpt-oss が OOM/VRAM 枯渇で落ちる:モデル分割・ページング・バッチ制御の解決策
articleGPT-5 ツール呼び出しが暴走する時の診断フロー:関数設計/停止条件/リトライ制御
articleGit の index.lock 残留問題を解決:並行実行・クラッシュ後の正しい対処法
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来