【解決策】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
TypeScript で学ぶミドルウェア設計パターン:Express・NestJS の応用例
- article
Node.js と Express:API サーバーを高速構築
- article
【対処法】expressのIPを取得するメソッド req.connectionの非推奨による対応
- article
Next.js + Custom Server(Express)でTypeScript保存時にnodemon再起動する設定
- article
mkcertでオレオレ認証局とオレオレ証明書を作成しNode.js ExpressサーバーをSSL起動する設定
- article
【解決策】express-sessionでセッションが保存されない問題の原因と対応
- article
JavaScript のオブジェクト操作まとめ:Object.keys/entries/values の使い方
- article
【実践編】JavaScript の正規表現活用術:効率的に文字列を処理する方法
- article
JavaScript の this キーワードを完全理解!初心者がつまずくポイント解説
- article
【徹底比較】JavaScript での null と undefined の違いと正しい使い分け
- article
JavaScript のクロージャ完全ガイド:スコープとメモリの仕組みを深掘り
- article
【保存版】JavaScript のイベントループとタスクキューを図解で理解する
- article
【実践】NestJS で REST API を構築する基本的な流れ
- article
TypeScript × GitHub Copilot:型情報を活かした高精度コーディング
- article
Motion(旧 Framer Motion)Variants 完全攻略:staggerChildren・when で複雑アニメを整理する
- article
JavaScript のオブジェクト操作まとめ:Object.keys/entries/values の使い方
- article
GitHub Actions で CI/CD パイプラインを構築する方法
- article
Nginx インストール完全ガイド:Linux・macOS・Windows・Docker 対応
- blog
Googleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
- blog
【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
- blog
Googleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
- blog
Pixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
- blog
フロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
- blog
失敗を称賛する文化はどう作る?アジャイルな組織へ生まれ変わるための第一歩
- review
今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
- review
ついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
- review
愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
- review
週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
- review
新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
- review
科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来