제가 알고 있는 최악의 시나리오는 다음과 같은 조건이 필요합니다:
- 외부 사이트에서 이메일 주소가 검증되지 않은 경우
- SSO 페이로드에
require_activation=true가 설정되지 않은 경우 - Discourse 사이트에
SingleSignOnRecord가 연관되어 있지 않은 기존 계정이 있는 경우 (계정 소유자가 SSO를 사용하여 Discourse에 로그인해 본 적이 없는 경우)
이러한 경우, 누군가 SSO로 로그인해 본 적이 없는 Discourse 사용자의 이메일 주소를 사용하여 외부 사이트에서 가입할 수 있습니다. 그러면 외부 사이트의 미검증 계정이 동일한 이메일 주소를 사용하는 Discourse 계정을 탈취할 수 있게 됩니다. 해당 계정이 Discourse의 관리자 계정이라면 특히 심각한 문제가 됩니다.
실제로 외부 사이트가 이메일 검증을 처리하지 않는 경우, Discourse가 이메일 검증을 처리하도록 권장됩니다:
다만, 이메일 검증을 외부 사이트에서 처리하는 것이 더 좋은 이유는 몇 가지 있습니다:
- 사용자에게 Discourse에서 확인 이메일을 받도록 강제하면 사용자가 처음 Discourse에 로그인하려고 할 때 일부 마찰이 발생합니다. (현실적으로 그 마찰은 어딘가에서 발생해야 합니다 - Discourse 측이거나 외부 사이트 측일 수 있습니다.)
- SSO 페이로드에
require_activation이true로 설정되어 있으면, Discourse는 이메일 주소에 기반하여 기존 Discourse 계정을 외부 로그인과 일치시키지 않습니다. 이는 일부 계정이 사용자명/비밀번호로 등록되어 Discourse에 생성된 후에 DiscourseConnect를 활성화할 경우 문제가 됩니다. 또한 어떤 이유로든 Discourse에서SingleSignOnRecord항목을 삭제해야 할 경우에도 문제가 됩니다. 사용자가 Discourse에 다시 로그인하려고 할 때 Discourse가 자동으로 새SingleSignOnRecord항목을 생성하지 않기 때문입니다.