Closed ErickCReis closed 2 years ago
@ErickCReis muito obrigado por reportar! Estou investigando! Você saberia dizer se isso aconteceu do nada?
Sim, ontem a noite tenho quase certeza que estava logado com meu usuário, e hoje de manhã só abri o site e estava assim.
@ErickCReis qual seu usuário dentro do TabNews?
erickreis
@ErickCReis estou verificando se alguma sessão conflitou 👍
Ué, roubou minha sessão? 😱
@ErickCReis você poderia enviar um email para contato@tabnews.com.br com o valor que está em session_id
nos Cookies?
Enviado
Investigando!
Vou reportando aqui qualquer informação que eu encontrar, mas por enquanto de fato no banco de dados a sessão que o @ErickCReis enviou por email aponta para o user_id
do @aprendendofelipe e essa sessão foi criada 2022-05-26 00:25:19.423693+00
UTC e continua sendo revalidada.
Investigando 🤝
@ErickCReis invalidei a sessão, se possível peço que ao tentar fazer um refresh da página você está deslogado.
Aconteceu o mesmo comigo
@GuiLra você poderia me enviar o seu session_id
para o email contato@tabnews.com.br?
Estou desconfiado que a nova rota das thumbnails esteja cacheando os cookies, ou alguma outra rota.
@ErickCReis invalidei a sessão, se possível peço que ao tentar fazer um refresh da página você está deslogado.
Eita! Acabou de revogar o acesso no meu celular. Devia ser essa a sessão original com esse id
@aprendendofelipe faz sentido 🤝 você lembra de ter compartilhado alguma publicação com o novo sistema de thumbnail dinâmica?
@aprendendofelipe faz sentido 🤝 você lembra de ter compartilhado alguma publicação com o novo sistema de thumbnail dinâmica?
Não compartilhei, mas cliquei no link dos exemplos que você enviou ontem
E fiz isso pelo celular
@filipedeschamps Eu acho que tem a ver com esses links. Eu tmb consegui acessar a conta do @ErickCReis
@aprendendofelipe obrigado pelas informações! Estou tentando vazar minha session_id para confirmar o bug 🤝
Consegui confirmar o bug 🤝 através de uma aba logada, eu acessei uma thumbnail e isso fez o endpoint da API que gera ela ser cacheando, inclusive o cookie. Em seguida, eu peguei essa URL da thumbnail e acessei numa aba anônima e a CDN da Vercel retornou o cache, incluindo o cookie.
Está sendo feito um deploy nesse exato momento que exclui esse cache e em seguida vou invalidar todas as sessões.
Em paralelo, com este novo deploy, todos os caches já foram invalidados.
Confirmei que com o novo deploy, o session_id não está mais sendo cacheado, nem vazado.
Em paralelo, notei o seguinte:
Na implementação do /thumbnail
, a linha que definia o cache era a seguinte:
response.setHeader('Cache-Control', 's-maxage=60, stale-while-revalidate');
Porém, temos outras rotas que também definem o cache de stale-while-revalidate
, como por exemplo /status
, mas ese bug nunca aconteceu antes. E no endpoint de /status
, está implementado assim:
response.setHeader('Cache-Control', 'public, s-maxage=1, stale-while-revalidate');
nota que tem a flag public
.
Estou investigando aqui se isso foi o ponto central do problema 🤝
Em paralelo, com este novo deploy, todos os caches já foram invalidados.
Precisa excluir os deploys recentes da Vercel, pois se estiverem no ar podem ser usados para roubar a sessão
Será que dois acessos dentro do mesmo segundo na rota status não gera o mesmo problema?
Estou longe de qualquer computador agora, então não consigo dar uma ajuda melhor.
Precisa excluir os deploys recentes da Vercel, pois se estiverem no ar podem ser usados para roubar a sessão
Perfeito! Exclui todos que foram criados a partir da primeira implementação, foram 19 (inclui tanto todos os testes em ambiente de Homologação quanto Produção).
Será que dois acessos dentro do mesmo segundo na rota status não gera o mesmo problema?
Essa é uma ótima pergunta, pois eu também pensava que numa lamba é possível entrar duas requests ao mesmo tempo, mas depois que eu fiz aquela bateria de testes para construir o pool do banco de dados, consegui confirmar que isso não acontece, é uma request por lambda, e se precisar paralelizar, a AWS invoca uma nova lambda. Isso também foi confirmado pelo pessoal que contribui para o módulo pg
🤝
Mas nesse momento não quero descartar nada, só afunilar um pouco a pesquisa, porque a todo momento estou acessando o /status
e esse problema pipocou em quantidade só agora (com o deploy do /thumbnail
) e com a raiz sendo o a sessão do seu celular. Mas novamente, esse não é o momento para descartar nada 🤝
Estou longe de qualquer computador agora, então não consigo dar uma ajuda melhor.
Sua ajuda já foi fundamental @aprendendofelipe 🤝 você ter reportado que clicou na URL da thumbnail pelo celular e ao invalidar a sessão foi a sua do celular aumentou muito a definição do problema 👍
@ErickCReis e @GuiLra uma pergunta para ter mais informações sobre a origem do bug: vocês chegaram a interagir com a URL da thumbnail lá daquela issue, ou qualquer URL de thumbnail?
@ErickCReis e @GuiLra uma pergunta para ter mais informações sobre a origem do bug: vocês chegaram a interagir com a URL da thumbnail lá daquela issue, ou qualquer URL de thumbnail?
Sim, ontem acessei as 3 urls que vc colocou no pr.
@ErickCReis e @GuiLra uma pergunta para ter mais informações sobre a origem do bug: vocês chegaram a interagir com a URL da thumbnail lá daquela issue, ou qualquer URL de thumbnail?
Eu acessei as 3 urls que colocou no pr.
Está sendo feito um deploy nesse exato momento que exclui esse cache e em seguida vou invalidar todas as sessões.
@filipedeschamps, você falou em invalidar todas as sessões, quer dizer de todos os usuários do TabNews? Mas ainda não fez isso, né? É que acabei de verificar em um computador que a minha sessão ainda está ativa.
@filipedeschamps, você falou em invalidar todas as sessões, quer dizer de todos os usuários do TabNews? Mas ainda não fez isso, né? É que acabei de verificar em um computador que a minha sessão ainda está ativa.
Correto! Assim que eu terminar a investigação no PR #546 e ter certeza desse comportamento vou invalidar. Estou no último teste e conseguindo isolar ou não, eu vou invalidar todas sessões e publicar no TabNews um postmortem 🤝
Identifiquei onde está o problema.
Bom, continuando as pesquisas aqui, rodei a mesma bateria de testes em produção no /status
que rodei no /thumbnail
e não é possível replicar o mesmo bug. No /thumbnail
foi zero atrito replicar o bug (no momento que a rota estava cacheada, o cookie estava lá), e no /status
não consigo de forma alguma. Então minha pesquisa foi o seguinte:
public
do Cache-Control
, pois essa foi a única mudança que fiz para evitar que o Cookie fosse armazenado. Comecei a cavucar um monte de artigo, como esse aqui e também perguntas no Stack Overflow, e nenhuma delas respondeu com clareza o que o public
faz, a não ser falando que isso faz um cache ficar público (mas não exatamente quais informações ficam cacheadas)./status
no Ambiente de Homologação.60
segundos de cache que tinha no /thumbnail
(diferente do cache de 1
segundo que originalmente essa rota tinha).public
o bug não se replica. Eu não sei se os servidores de CDN para o cache em ambiente de homologação são diferentes do de produção./thumbnail
e identifiquei o maior ofensor, que é isso aqui./status
não faz. Então o cache do stale-while-revalidate
está de fato cacheando tudo, mas isso não é um problema se você não injetar nessa rota a sessão do usuário e por consequência não cachear o Set-Cookie
de retorno.Set-Cookie
de retorno que devolve a sessão atualizada ficar cacheado na CDN, qualquer navegador que ler esse comando vai de fato setar o cookie de sessão no lado do client./status
e agora consigo replicar o bug 100% das vezes.Estou invalidando todas as sessões, criando o postmortem (vou publicar eles juntos) e criar outro PR para remover a injeção do usuário naquela rota, mesmo que ela por enquanto não esteja mais sendo cacheada.
Em paralelo, nas rotas com cache, podemos pedir para não fazer o cache do Set-Cookie a pesar de que o resultado não é garantido, mas isso é o início para ficar mais protegido nesse ponto.
Muito obrigado a todos pela ajuda nos dados!!!
Assim que resetar as sessões, publicar o postmortem e fazer o merge do PR que remove a injeção do usuário irei fechar essa issue 🤝
Sessões invalidadas e postmortem criado: https://www.tabnews.com.br/filipedeschamps/postmortem-todas-as-sessoes-foram-invalidadas-por-conta-do-endpoint-thumbnail
Vou fazer o PR removendo a injeção do usuário no endpoint /thumbnail
🤝
Feito o merge do PR #547 que faz parar a injeção da sessão do usuário no /thumbnail
.
Note que o session_id
é retornado no Set-Cookie
do response
como esperado, pelo fato do endpoint estar injetando e revalidando a sessão do usuário:
Set-Cookie
não está sendo mais retornado no response
, e agora esse retorno pode voltar a ter cache:
Set-Cookie
também consegue ser cacheado na CDN.no-cache="Set-Cookie"
e se é possível definir isso de forma global (e se tem algum efeito).Estou fechando esta issue, mas qualquer outra informação peço que volte a abrir ela ou dependendo do quão sensível a informação é, entrar em contato através de contato@tabnews.com.br
🤝
Acabei de entrar no TabNews e me deparei com isso:
Por algum motivo estou logado com outro usuário, estou no trabalho agora então não vou conseguir investigar isso agora, mas me parece algo urgente.
Não tentei fazer publicação ou usar os tabcoins para ver se a api apresenta algum erro, mas já atualizei a página e continuei assim.
@filipedeschamps @aprendendofelipe