Discourse에서 Microsoft, Google 등 외부 신원 제공자에 의존하지 않고 진정한 로컬 패스워드리스(비밀번호 없는) 플로우를 지원해 주셨으면 합니다.
현재로선 제가 아는 한, Discourse에는 이미 이 기능의 일부가 존재하지만, 실제로 필요한 구성 조합은 빠져 있습니다.
현재 존재하는 것
Discourse에는 이미 다음 기능들이 있습니다:
- 로컬 계정
enable local logins via email을 통한 이메일 로그인 링크 / 비밀번호 없는 로그인 방식의 동작- 비밀번호를 나중에 설정하도록 할 수 있는 초대(invite) 플로우
- OIDC / OAuth / SAML / DiscourseConnect를 통한 외부 인증 자동 프로비저닝
하지만 빠져 있는 부분은 이메일 기반 로컬 로그인이 여전히 일반적인 로컬 로그인과 묶여 있다는 점입니다. 즉, 다음과 같은 설정을 깔끔하게 분리할 수 없습니다:
- 로컬 이메일 매직 링크 로그인 허용
- 로컬 이메일 매직 링크 가입 / 온보딩 허용
- 로컬 비밀번호 인증 금지
제가 원하는 조합이 바로 이것입니다.
사용 사례
저는 Discourse가 이 모델을 네이티브로 지원하길 원합니다:
- 사용자가 사이트에 접속합니다.
- 사용자가 이메일을 입력합니다.
- Discourse가 사용자에게 일회용 / 단기 유효한 로그인 링크를 이메일로 전송합니다.
- 계정이 아직 없다면, Discourse가 계정을 생성합니다.
- 사용자가 로그인됩니다.
- 이후 로그인도 동일한 방식으로 계속됩니다.
- 관리자가 명시적으로 허용하지 않는 한 로컬 비밀번호는 필요하지 않습니다.
즉, 다음과 같은 형태입니다:
로컬 계정
로컬 이메일 소유권 검증
로컬 비밀번호 불필요
왜 이것이 중요한가
현재 비밀번호 없는 경험을 원한다면 가장 깔끔한 우회책은 외부 신원 제공자를 사용하는 것 같습니다. 하지만 모든 사이트에서 이것이 이상적이지는 않습니다.
그 이유는 다음과 같습니다:
- 모든 커뮤니티가 Microsoft / Google / Auth0 등에 의존하기를 원하지는 않습니다.
- 일부 커뮤니티는 더 단순하고 프라이버시를 더 잘 보존하는 로컬 인증 플로우를 원합니다.
- 일부 커뮤니티는 신원을 외부에 아웃소싱하지 않으면서도 비밀번호 사용의 번거로움을 줄이기를 원합니다.
- 일부 관리자는 비밀번호 관리에 서툰 사용자를 위해 이메일 링크는 잘 처리할 수 있는 사용자를 지원하기를 원합니다.
Discourse에는 이미 이메일 링크를 통한 비밀번호 없는 로그인에 대한 선례가 있으므로, 이는 완전히 새로운 개념이라기보다는 부족한 제품 모드(product mode)에 가깝다고 느껴집니다.
요청하는 사항
이 문제는 다음 개념들을 **분리(decoupling)**함으로써 해결될 수 있다고 생각합니다:
현재 동작
enable local loginsenable local logins via email
요청하는 동작
관리자가 독립적으로 제어할 수 있게 해주세요:
- 로컬 비밀번호 로그인 허용
- 로컬 이메일 링크 로그인 허용
- 로컬 비밀번호 가입 허용
- 로컬 이메일 링크 가입 / 계정 생성 허용
원하는 설정 모델 예시
다음과 같은 형태입니다:
enable local password loginsenable local email loginsenable local password signupenable local email signuplocal email signup creates account automatically(자동으로 계정 생성)local email signup requires staff approval(스태프 승인 필요)local email login link expiry minutes(이메일 로그인 링크 만료 시간)
꼭 이러한 설정 이름일 필요는 없으며, 개념이 중요합니다.
원하는 UX
로그인
사용자가 다음을 선택할 수 있어야 합니다:
- 비밀번호로 계속하기
- 또는 로그인 링크를 이메일로 보내기
비밀번호 로그인이 비활성화되어 있다면, 이메일 링크 옵션만 표시되어야 합니다.
가입
사용자가 다음을 선택할 수 있어야 합니다:
- 비밀번호로 계정 만들기
- 또는 이메일 링크로 계정 만들기
비밀번호 가입이 비활성화되어 있다면, 사이트는 이메일 링크 가입만 수행해야 합니다.
왜 초대(Invite)만으로는 부족한가
초대는 온보딩에 도움이 되지만, 진정한 로컬 비밀번호 없는 인증 모드와 같은 것은 아닙니다.
제가 이해한 바로는:
- 초대는 주로 수락 / 교환(redemption)을 위한 것입니다.
- 사용자의 지속적 로그인 자격 증명이 아닙니다.
- 세션이 만료된 후에도 사용자는 여전히 일반적인 로그인 경로가 필요합니다.
따라서 초대는 관련이 있지만, 문제를 완전히 해결하지는 못합니다.
왜 외부 인증만으로는 부족한가
OIDC / OAuth / SAML은 비밀번호 없는 또는 OTP 기반의 경험을 제공할 수 있고, auth skip create confirm이在那里 많은 도움이 됩니다.
하지만 이는 사이트가 이제 제3자 신원 제공자에 의존하게 된다는 뜻입니다.
일부 커뮤니티에는 괜찮지만, 다른 커뮤니티에는 불필요한 복잡성과 원치 않는 의존성이 됩니다.
보안에 대한 생각
이메일 링크 인증에는 보안상의 함의가 있다는 점을 인지하고 있습니다. 하지만 Discourse에는 이미 관련 패턴이 있습니다:
- 이메일을 통한 비밀번호 재설정
- 이메일 링크를 통한 로그인
- 이메일을 통한 초대 수락
따라서 이는 이메일 기반 제어권 증명의 개념을 처음부터 도입하는 것이 아닙니다.
합리적인 안전장치는 다음과 같을 수 있습니다:
- 단기 유효 링크
- 공격적인 레이트 리밋(rate limit)
- 일회용 토큰
- 이메일 링크 로그인 후 선택적 2FA
- 매직 링크 인증 후 이메일 / 비밀번호 변경 전 선택적 쿨다운(cooldown)
- 이메일 링크 로그인에 대한 관리자 가시성 / 로그
요약
저는 Discourse에서 1급(first-class) 로컬 비밀번호 없는 모드를 요청합니다. 이 모드에서:
- 사용자는 이메일에 대한 제어권을 증명하여 인증합니다.
- Discourse는 이 플로우를 통해 로컬 계정을 생성할 수 있습니다.
- 관리자는 로컬 비밀번호 인증을 완전히 비활성화할 수 있습니다.
- Microsoft / Google / 다른 SSO 제공자 없이도 작동합니다.
신원을 외부에 아웃소싱하지 않으면서도 낮은 마찰의 온보딩을 원하는 커뮤니티에 매우 유용한 기능이 될 것이라고 생각합니다.