저희는 DiscourseSSO를 사용 중이며, 간헐적으로 사용자가 로그인 문제를 겪고 있습니다 (Sporadic issue wp-discourse/SSO: Nonce has already expired 와 유사함). 이를 디버깅하기 위해 추가 로깅을 시도했고, 다행히 며칠 만에 해당 문제를 재현할 수 있었습니다. 명확히 하자면, 대부분의 경우 로그인은 정상적으로 작동하지만, 간헐적으로(하루에 약 5분 정도) 사용자가 로그인 문제를 겪습니다.
저희는 멀티노드 클러스터에서 서브폴더 설정을 사용하며, 외부 공유 DB와 Redis를 사용 중입니다. 이 점이 차이를 만드는지 모르겠습니다. 실패하는 시나리오는 두 가지입니다:
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(',')}")) 서버에 해당 쿠키가 기록되는 것을 확인했습니다.
로그인은 완료되지만 화면에 로그인 오류가 표시됨
사용자가 /session/sso_login으로 리다이렉트될 때, SessionController는 SSO 데이터를 검증하고 사용자를 로그인할 수 있습니다(로그에 Verbose SSO log: User was logged on user5가 표시됩니다). 그러나 사용자가 /forums/latest로 리다이렉트될 때 화면에 오류가 표시됩니다. 정상적인 플로우에서는 이 액션이 “cn” 쿠키를 삭제하거나 빈 값으로 반환하는 반면, 실패하는 시나리오에서는 단순히 “_t” 쿠키만 업데이트하고 반환하는 것을 확인했습니다. 이 시나리오도 세션 데이터 누락과 관련이 있을 것으로 추정됩니다.
약 5분 정도 기다린 후 다시 시도하면 모든 것이 정상적으로 작동하기 시작합니다.
해당 시간대에 사이트를 방문한 모든 사용자가 문제를 겪는지 여부는 테스트해 보지 않았지만, 익명으로 전해진 정보에 따르면 여러 사용자가 저희 인스턴스에서 한 번씩 해당 문제를 겪었다고 합니다.
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