proxy inverso con múltiples sesiones en el mismo navegador

proxy inverso con múltiples sesiones en el mismo navegador

Mi proxy inverso parece funcionar en su mayor parte, aunque cuando abro sesiones en diferentes servidores backend, dentro del mismo navegador, recibo este mensaje del navegador (probado con Chrome e IE):

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

Una vez que abro la segunda sesión, las dos sesiones interfieren de tal manera que una de ellas cierra la sesión.

Las dos URL de solicitud son:

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

El proxy inverso asigna estas solicitudes a:

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

¿Supongo que esto está relacionado con las cookies? Entonces los comparé y cada uno tiene contenidos de cookies únicos, por ejemplo:

Session to backend1:
  QSESSIONID: c1f9468714084ee2fePE6l5x3FqyPl

Session to backend2:
  QSESSIONID: 06b2468a5a0509eb1aWoJRH8TpslxC

¿Qué necesito configurar en el proxy inverso para evitar que estas sesiones interfieran entre sí?

Gracias,
Matt.

Respuesta1

Respondiendo a mi propia pregunta... Para ir directamente a la respuesta, necesitaba agregar ProxyPassReverseCookiePatha mi <VirtualHost>:

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

Para descubrir lo que necesitaba agregar, fue necesario rastrear el Set-Cookieencabezado en el servidor backend y en el servidor proxy.

En el backend estoy usando lighttpd. Para rastrear la solicitud/respuesta del backend:

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"

El proxy inverso ejecuta Apache, así que agregué esto a mi <VirtualHost>...

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

Ahora armado con los detalles de registro, pude ver lo que estaba sucediendo...

Después de la pantalla de inicio de sesión inicial, se establece una sesión y el servidor backend crea el contenido de la cookie y lo agrega al Set-Cookieencabezado. La pista que necesitaba era que especifica Set-Cookiecon Path=/. Para evitar que las sesiones de diferentes servidores backend interfirieran entre sí, necesitaba hacer que el Pathatributo dependiera del nombre del servidor backend. Eso es lo que ProxyPassReverseCookiePathhace por mí.

El Proxy ve el Set-Cookieencabezado y asigna el Pathatributo.

Los registros mostraban, en lighttpd (editado para placer visual):

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

Y después de que esta respuesta pasa por el Proxy, la directiva la modifica ProxyPassReverseCookiePathpara que sea:

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

Ahora la ruta de las cookies depende del nombre del servidor backend.

Mate.

información relacionada