만료된 nonce로 인한 Sporadic DiscourseSSO 로그인 문제

저희는 DiscourseSSO를 사용 중이며, 간헐적으로 사용자가 로그인 문제를 겪고 있습니다 (Sporadic issue wp-discourse/SSO: Nonce has already expired 와 유사함). 이를 디버깅하기 위해 추가 로깅을 시도했고, 다행히 며칠 만에 해당 문제를 재현할 수 있었습니다. 명확히 하자면, 대부분의 경우 로그인은 정상적으로 작동하지만, 간헐적으로(하루에 약 5분 정도) 사용자가 로그인 문제를 겪습니다.

저희는 멀티노드 클러스터에서 서브폴더 설정을 사용하며, 외부 공유 DB와 Redis를 사용 중입니다. 이 점이 차이를 만드는지 모르겠습니다. 실패하는 시나리오는 두 가지입니다:

  1. Nonce 만료
    사용자가 /session/sso_login으로 리다이렉트될 때, SessionController가 세션에서 session_id를 가져오지 못하여 nonce를 조회할 수 없습니다. 세션을 로깅해 보았더니(Rails.logger.warn("Verbose SSO log: Session #{session.keys.map {|key| [key, session[key]].join('=')}.join(',')}")) 빈 세션이 출력되었습니다. 브라우저가 이전 요청에서 받은 “_forum_session” 쿠키를 보내고 있으며, SessionController에서 로깅을 활성화하면(Rails.logger.warn("Verbose SSO log: Cookies #{cookies.map {|cookie| cookie.join('=')}.join(',')}")) 서버에 해당 쿠키가 기록되는 것을 확인했습니다.

  2. 로그인은 완료되지만 화면에 로그인 오류가 표시됨
    사용자가 /session/sso_login으로 리다이렉트될 때, SessionController는 SSO 데이터를 검증하고 사용자를 로그인할 수 있습니다(로그에 Verbose SSO log: User was logged on user5가 표시됩니다). 그러나 사용자가 /forums/latest로 리다이렉트될 때 화면에 오류가 표시됩니다. 정상적인 플로우에서는 이 액션이 “cn” 쿠키를 삭제하거나 빈 값으로 반환하는 반면, 실패하는 시나리오에서는 단순히 “_t” 쿠키만 업데이트하고 반환하는 것을 확인했습니다. 이 시나리오도 세션 데이터 누락과 관련이 있을 것으로 추정됩니다.

약 5분 정도 기다린 후 다시 시도하면 모든 것이 정상적으로 작동하기 시작합니다.

해당 시간대에 사이트를 방문한 모든 사용자가 문제를 겪는지 여부는 테스트해 보지 않았지만, 익명으로 전해진 정보에 따르면 여러 사용자가 저희 인스턴스에서 한 번씩 해당 문제를 겪었다고 합니다.

안녕하세요!

서브폴더 설정에 어떤 것을 사용하시나요? Discourse 앞에某种 웹 애플리케이션 방화벽(WAF)이 있다면 캐싱 문제를 확인해 보는 것이 좋습니다. 저희 경험상 가장 먼저 배제해야 할 것이 바로 그것입니다.

Leonardo, 답변 감사합니다. 우리는 nginx를 메인 게이트웨이로 사용하며, 이 nginx가 경로 기반 URL을 Discourse 컨테이너 내부의 nginx로 전달합니다.

session_controller.rb/sso 및 session_controller.rb/sso_login 파일의 시작 부분에 다음 두 줄을 추가했습니다.

    if SiteSetting.verbose_discourse_connect_logging
      Rails.logger.warn("Verbose SSO log: Cookies #{cookies.map {|cookie| cookie.join('=')}.join(',')}")
      Rails.logger.warn("Verbose SSO log: Session #{session.keys.map {|key| [key, session[key]].join('=')}.join(',')}")
    end

위에서 언급한 첫 번째 실패 시나리오의 경우, 멀티노드 클러스터의 node1에서 /sso에 대해 다음 결과를 얻었습니다.

Verbose SSO log: Cookies cn=12,_forum_session=ZjBveGorRVN1bU0zeGRKVHZtWUZDamUxTUJSUkJHUDZDaHhLMkh3U0lXMlpCYS9PTnpJWEovcTlZVDFTSTJuNkVNUE9NdlNvVWlidStIdk9SeTlRYzZ5YVp0N0pXdmhnTldlaSt4d1o3TC9mUm1nSUhsOUtiWFRyVGZBYkJLRHRRR0lFZmM0RkVxLzl0V2JEODR4NGMxQUJvOGhpdVc0c2JsdDFESHo2TWxJPS0tRXZTL0FHZlM1Yy9QVWJkc2xaaTYvUT09--36fa626c698a401db1e7f13276ee6bfde16dea77,sessid=6b4afa7755dc9aa54e3fb16453a28324,<ADDITIONAL_COOKIES_REDACTED>
Verbose SSO log: Session 
Verbose SSO log: Setting nonce 8199453c67e347124ecb2e57e5738336 with key SSO_NONCE_8199453c67e347124ecb2e57e5738336

그리고 멀티노드 클러스터의 node2에서 /sso_login에 대해 다음 결과를 얻었습니다.

Verbose SSO log: Cookies cn=12,_forum_session=WFRkNThYYUZwUnlOQjF5VHdUZGRUWE1UNUx2a3Z5ZlJCOGl0VFRRUlF2bm5vQUQzMWdaUVZVUnJkNmdIUjlRTE52d1B5MXJnV0svWkJMRWZrOU5XellvV0IzMTBScERwM0lzT3VIUWc2SEppb2xpTlkxaFpuc1dvU2d4SkdZRXFYYjJzakRQTXFmS2lYTlhxVEd5Zi9nQ3dZQnVUR1pDSndScGZhcVNJOW1ZPS0tNFduSE1YRDk5cWdMRXNsWnBzbDVhZz09--00ab1b89ff4cf05c9f3f3ed71eec9c0c4557f032,sessid=6b4afa7755dc9aa54e3fb16453a28324,<ADDITIONAL_COOKIES_REDACTED>
Verbose SSO log: Session 
Verbose SSO log: Checking nonce 8199453c67e347124ecb2e57e5738336 with key SSO_NONCE_8199453c67e347124ecb2e57e5738336
Verbose SSO log: Nonce is incorrect, was generated in a different browser session, or has expired

Redis 서버에서는 nonce 키를 확인할 수 있습니다.

redis:6379[3]> KEYS "*NONCE*"
1) "default:3aa05452fdd8fd4a93481eb8afa90f3aSSO_NONCE_8199453c67e347124ecb2e57e5738336"
2) "default:21639ca4bef85f68c1d72824e3a49bd6SSO_NONCE_7d54c965762e6861799f62ef7c5cfa60"
3) "default:_CACHE:USED_SSO_NONCE_86886a948684ff110d4830919d4e6de5"
4) "default:_CACHE:USED_SSO_NONCE_d04fdbf483fe61129a6fcc54087cb4e4"
5) "default:f7c87c11539908b30f9e307ef05d3f18SSO_NONCE_90a6a6997b7bd5d75eac1ac0cfc6dee2"

/sso_login에서 Session이 비어 있는 것이 제 우려 사항입니다.

혹시 조언이 있는 분이 계신지 확인차 이 토픽을 다시 올립니다.

혹시 사이트가 공개되어 있나요? 온라인에서 디버깅을 할 수 있으면 도움이 될 것 같습니다.

네, 맞아요. 주소를 비공개 메시지로 보내드릴게요.

업데이트: 비공개 메시지로 전송했습니다.

로그인이 모든 사용자에게 동시에 중단됩니까? 아니면 사용자마다 중단 시점이 다른가요?

일정 시간이 지나면 다시 작동하기 시작한다는 점이 궁금하여 캐시가 관여되어 있는지 의심해 봅니다. NGINX 설정이나 기타 중간 프록시(예: Cloudflare)에서 캐싱을 수행하고 있습니까?

그 짧은 시간 동안 모든 사용자에게 문제가 발생합니다. 제 첫 번째 추측은 중간 노드가 데이터를 조작하고 있다는 것이었으나, 위에서 설명한 대로 컨트롤러에서 쿠키를 로깅했을 때 쿠키를 확인할 수 있었습니다. 이 외에도 확인해야 할 사항이 있을까요?

다시 한번 토픽을 핑합니다.