同じブラウザで複数のセッションを実行するリバースプロキシ

同じブラウザで複数のセッションを実行するリバースプロキシ

私のリバース プロキシはほぼ動作しているようですが、同じブラウザー内で異なるバックエンド サーバーへのセッションを開くと、ブラウザーから次のメッセージが表示されます (Chrome と IE でテスト済み)。

Already a session is running in this browser, so opening the same session

2 番目のセッションを開くと、2 つのセッションが干渉し、一方のセッションがログアウトされます。

2 つのリクエスト URL は次のとおりです。

https://proxy-server/backend1/index.html
https://proxy-server/backend2/index.html

リバース プロキシはこれらの要求を次のようにマッピングします。

https://backend1:1234/index.html  and
https://backend2:1234/index.html

これはクッキーに関係しているのでしょうか? 比較してみたところ、それぞれに固有のクッキーの内容がありました。例:

Session to backend1:
  QSESSIONID: c1f9468714084ee2fePE6l5x3FqyPl

Session to backend2:
  QSESSIONID: 06b2468a5a0509eb1aWoJRH8TpslxC

これらのセッションが相互に干渉しないようにするには、リバース プロキシで何を構成する必要がありますか?

ありがとう、
マット。

答え1

私自身の質問に答えます... 答えをすぐに出すために、私はProxyPassReverseCookiePath次のことを追加する必要がありました<VirtualHost>:

<Location "/backend1">
  ...
  ProxyPass https://backend1:1234/
  ProxyPassReverse https://backend1:1234/
  ...
  ProxyPassReverseCookiePath / /backend1
  ...
</Location>

何を追加する必要があるかを調べるには、Set-Cookieバックエンド サーバーとプロキシ サーバーのヘッダーをトレースする必要がありました。

バックエンドでは lighttpd を使用しています。バックエンドのリクエスト/応答をトレースするには:

server.modules += ("mod_accesslog")
accesslog.use-syslog = "enable"
accesslog.syslog-level = 6
accesslog.format = "%h %l %u %t \"%r\" \"C:%{Cookie}i\" \"S-C:%{Set-Cookie}o\" %>s %b"

リバース プロキシは Apache を実行しているので、これを<VirtualHost>...に追加しました。

LogFormat "%h %l %u %t \"%r\" \"C:%{Cookie}i\" \"S-C:%{Set-Cookie}o\" %>s %b"
TransferLog "/store/log/httpd_access_log"

ログの詳細がわかったので、何が起こっているのかがわかりました...

最初のログイン画面の後、セッションが確立され、バックエンド サーバーが Cookie コンテンツを作成してヘッダーに追加しますSet-Cookie。必要な手がかりは、Set-Cookieで が指定されていることですPath=/。異なるバックエンド サーバーのセッションが互いに干渉しないようにするには、Path属性をバックエンド サーバー名に依存させる必要がありました。これがProxyPassReverseCookiePathの役割です。

プロキシはSet-Cookieヘッダーを確認し、Path属性をマップします。

lighttpd 上のログは次のようになりました (閲覧用に編集済み):

"POST /api/session HTTP/1.1" "C:i18next=en-us" "S-C:SID=3bmx; path=/; secure"

この応答がプロキシを通過した後、 ProxyPassReverseCookiePathディレクティブによって次のように変更されます。

POST /backend1/api/session HTTP/1.1 C:i18next=en-us S-C:SID=3bmx; path=/backend1;secure

現在、Cookie パスはバックエンド サーバーの名前に依存します。

マット。

関連情報