proxy reverso com múltiplas sessões no mesmo navegador

proxy reverso com múltiplas sessões no mesmo navegador

Meu proxy reverso parece estar funcionando principalmente, mas quando abro sessões em diferentes servidores back-end, no mesmo navegador, recebo esta mensagem do navegador (testado com Chrome e IE):

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

Assim que abro a 2ª sessão, as duas sessões interferem de tal forma que uma delas fica desconectada.

Os dois URLs de solicitação são:

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

O proxy reverso mapeia essas solicitações para:

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

Eu acho que isso está relacionado aos cookies? Então, comparei-os e cada um possui um conteúdo de cookie exclusivo, por exemplo:

Session to backend1:
  QSESSIONID: c1f9468714084ee2fePE6l5x3FqyPl

Session to backend2:
  QSESSIONID: 06b2468a5a0509eb1aWoJRH8TpslxC

O que preciso configurar no proxy reverso para evitar que essas sessões interfiram umas nas outras?

Obrigado,
Matt.

Responder1

Respondendo à minha própria pergunta... Para ir direto à resposta, precisei adicionar ProxyPassReverseCookiePathà minha <VirtualHost>:

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

Para descobrir o que eu precisava adicionar, era necessário rastrear o Set-Cookiecabeçalho no servidor back-end, bem como no servidor proxy.

No backend estou usando lighttpd. Para rastrear a solicitação/resposta de back-end:

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"

O Reverse-Proxy está executando o Apache, então adicionei isso ao meu <VirtualHost>...

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

Agora armado com detalhes de registro, pude ver o que estava acontecendo...

Após a tela de login inicial, uma sessão é estabelecida e o servidor backend cria o conteúdo do Cookie e o adiciona ao Set-Cookiecabeçalho. A pista que eu precisava era que ela especificasse Set-Cookiecom Path=/. Para impedir que sessões de diferentes servidores back-end interfiram entre si, precisei tornar o Pathatributo dependente do nome do servidor back-end. Isso é o que ProxyPassReverseCookiePathfaz por mim.

O Proxy vê o Set-Cookiecabeçalho e mapeia o Pathatributo.

Os logs mostraram, no lighttpd (editado para visualização):

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

E depois que essa resposta passa pelo Proxy, ela é modificada pela ProxyPassReverseCookiePathdiretiva para ser:

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

Agora o caminho do cookie depende do nome do servidor backend.

Matt.

informação relacionada