質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

2493閲覧

Express + Nginxでセッションがうまく動作しない

tsuyo_244

総合スコア219

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2022/01/20 02:51

質問の概要

Express + nginxを使って開発をしているのですが、ログイン処理時にセッションが意図したように動作してくれません。
ログインAPIへの通信はうまくいっているようでログインしたユーザの情報が返ってきて特にエラーも出ないのですが、その時にブラウザにCookieがセットされていないようです。(レスポンスにSet-Cookieがそもそもない様子)
色々と調べてみたのですが自力での解決が難しそうでご質問させていただきました。どうぞよろしくお願いいたします。

構成など

React / nginx / express / MySQL
フロント側(React)とAPIは別のオリジン
JWTではなくCookieを使ったサーバ側でのセッション管理
expressではexpress-session、ログインの認証にpassport.jsを使用

状況

  • CORSの設定は対応済、フロント側からfetchでログインのAPIに接続し結果も問題なく受け取れる
  • Cookieはhttp-only, secure, Same-site=Noneとなるように設定、フロントおよびAPIはどちらもSSLを設定している
  • Chromeの開発者ツールでログインのAPIをPOSTした時のレスポンスを確認するとヘッダにSet-Cookieが見当たらない

試してみたこと

  • こちらの記事に書かれているような事象に近いのかなと思いapp.set("trust proxy", 1);を設定してみましたが動作は変わらずでした。

https://t-cr.jp/memo/1c317a5b828d92220

  • nginx側でX-Forwarded-Forの設定が必要なのかと思いproxy_set_header X-Forwarded-For $remote_addr;と追記してみましたがこちらも動作変わらずでした。他にも必要な記述があるのかなとおもったのですがnginxの知識が足りておらずどういう設定が必要なのかを調べることができませんでした。

  • ためしにログインのAPIをPOSTした際に適当なキー/値でCookieを設定してみたところこちらはうまくブラウザに保存されたのでセッション絡みのCookieがうまくいっていないようです

ソースコード

app.js

javascript

1const createError = require('http-errors'); 2const express = require('express'); 3const session = require('express-session') 4const cookieParser = require('cookie-parser'); 5const logger = require('morgan'); 6const cors = require('cors') 7 8//generate app 9const app = express(); 10app.set('trust proxy', 1); 11 12//set env 13require('dotenv').config(); 14 15//set middleware 16app.use(logger('dev')); 17app.use(cors({ 18 origin: process.env.CLIENTORIGIN, 19 credentials: true, 20 optionsSuccessStatus: 200, 21})) 22app.use(express.json()); 23app.use(express.urlencoded({ extended: false })); 24app.use(cookieParser()); 25app.use(session({ 26 secret: 'node_app_template', 27 resave: true, 28 saveUninitialized: false, 29 proxy: true, 30 cookie: { 31 httpOnly: true, 32 maxAge: 60000, 33 secure: true, 34 sameSite: 'none', 35 } 36})) 37...

login.js(API部分のソース)

javascript

1var express = require('express'); 2var router = express.Router(); 3const passport = require('../auth') 4 5router.use(passport.initialize()) 6router.use(passport.session()) 7 8router.post('/login', 9 passport.authenticate('local'), 10 (req, res) => { 11 // この記載を試しにコメントインするとこのCookieは問題なく保存される 12 // res.cookie('testCookie', 'testValue', { 13 // httpOnly: true, 14 // maxAge: 60000, 15 // secure: true, 16 // sameSite: 'none', 17 // }) 18 19 res.json( {result: req.user }) 20 } 21) 22 23router.post('/logout', (req, res) => { 24 // req.session.passport.user = undefined; 25 req.logout(); 26 res.json({ result: req.user }) 27}) 28 29module.exports = router;

nginx.conf

events{ } http{ server { listen 80 default; server_name localhost; } server { listen 443 ssl; location / { proxy_pass http://172.30.0.2:3000; proxy_set_header X-Forwarded-For $remote_addr; } ssl_certificate /etc/certs/localhost.pem; ssl_certificate_key /etc/certs/localhost-key.pem; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

別のキーワードで調査していたところ、同じ症状が出ている方のページを見つけ同じようにしてみたところ解決しました。
nginxの設定に下記の追加が必要でした。

proxy_set_header X-Forwarded-Proto $scheme;

https://www.digitalocean.com/community/questions/secure-cookies-not-working-despite-successful-https-connection

投稿2022/01/20 13:25

tsuyo_244

総合スコア219

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問