회원가입 시 기본값으로 "이미 사용 중인 이메일" 숨기기

배경

현재 기본 설정에서는 이미 등록된 이메일로 계정을 가입하려고 할 경우, 가입 양식이 해당 사실을 알려줍니다:

이 정보를 제공하지 않도록 기본 설정을 변경합니다. 이제 이메일이 이미 등록되었든 아니든 상관없이 가입 양식은 다음과 같은 모습으로 표시됩니다:

비밀번호 재설정에도 유사한 방식으로 적용됩니다. 설정이 비활성화되어 있으면, 양식이 해당 이메일이 시스템에 존재한다는 즉각적인 피드백을 제공합니다:

설정이 활성화되어 있으면 해당 정보를 노출하지 않습니다:

왜 변경하나요?

악성 행위자는 이 피드백을 이용하여 계정 열거 공격(account enumeration)을 수행할 수 있으며, 이를 통해 특정 사용자가 이 포럼에 존재하는지 알 수 있고, 이후 해당 사용자를 대상으로 피싱 공격을 가할 수 있습니다.

이것이 legitimate한 사용자에게 부정적인 영향을 미치진 않나요?

해당 경우는 사용자가 이미 계정이 있다는 사실을 잊고, 동일한 이메일로 가입을 시도하거나 비밀번호를 재설정하는 경우입니다. 이는 비교적 드문 상황이어야 합니다. 하지만 설령 그런 경우라도, 이미 계정이 있다는 사실을 알려주는 이메일을 받게 됩니다.

결국 이 변경 사항은 legitimate한 사용자의 가입 또는 계정 접근 능력에 영향을 미치지 않습니다.

하지만 기존 기본 설정을 선호합니다

언제든 이 설정을 변경한 적이 있다면, 새로운 기본 설정이 사용자 지정 설정을 대체하지 않습니다. 기존 기본 설정으로 되돌리고 싶다면 hide_email_address_taken 설정을 false로 다시 설정하면 됩니다.

참고: 향후 관리자 설정 페이지에서 이 사이트 설정을 숨기는 것을 고려하고 있습니다.

10개의 좋아요

사용자가 가입 시 사용한 이메일 주소를 잘못 기억하는 경우 어떻게 되나요?

예를 들어, 사용자가 자신이 example@gmail.com으로 가입했다고 생각했지만 실제로는 example@yahoo.com으로 가입했다고 가정해 보겠습니다. 사용자는 example@gmail.com이라는 이메일 주소를 제공하며 비밀번호 재설정을 시도하겠지만, 해당 이메일 주소로 된 계정은 존재하지 않습니다.

ted@discourse.org 계정에 해당한다면, 곧 비밀번호 재설정 방법에 대한 지시 사항이 포함된 이메일을 받게 됩니다.

이 경우 사용자가 단순히 이메일을 받지 못한다면, 잘못된 이메일 주소를 제공했다는 사실을 알 수 없고, 언제 다른 이메일 주소로 다시 시도해야 하는지(또는 시도해야 하는지) 알 수 없습니다.

대신, 메시지는 단순히 "곧 비밀번호 재설정 방법에 대한 지시 사항이 포함된 이메일을 받게 됩니다"라고만 표시하고, 사용자는 "누군가가 example@gmail.com에 대한 비밀번호 재설정을 요청했지만, 해당 이메일 주소로 된 계정은 없습니다."라는 설명이 담긴 이메일을 받아야 합니다.

이 방법은 누구나 계정 열거(account enumeration)를 수행하는 것을 허용하지는 않지만, 사용자가 잘못된 이메일 주소를 제출했음을 알 수 있게 하고 다른 이메일 주소를 시도할 수 있게 해 줍니다.

5개의 좋아요

이 방식의 문제는 악의적인 행위자가 자신의 인스턴스와 상호작용한 적 없거나 존재하지 않는 주소로 이메일 전송을 트리거할 수 있다는 점입니다.

이로 인해 발송되는 이메일의 수가 크게 증가하여 상당한 금전적 비용이 발생할 수 있습니다. 또한 스팸으로 신고하는 사용자가 크게 증가하고 바운스율(bounce rate)이 높아져 Gmail과 같은 운영자가 해당 발신자로부터의 이메일을 블랙리스트에 등록할 수 있습니다.

5개의 좋아요

공격자는 이미 새로운 계정을 등록하는 것만으로 이를 수행할 수 있습니다. 공격자가 10만 개의 이메일 주소를 알고 있다면, 10만 개의 계정을 등록할 수 있으며, Discourse는 각 사용자에게 활성화 이메일을 보내게 됩니다. 이 경우 각 사용자는 해당 이메일을 스팸으로 신고할 수 있습니다.

존재하지 않는 계정의 이메일 주소로 "비밀번호를 재설정할 수 없으며, 해당 계정은 존재하지 않습니다"라는 이메일을 보내는 것은 이러한 공격을 더 쉽게 만들거나 더 어렵게 만들지 않습니다.

이 공격은 대부분의 사이트에는 문제가 되지 않지만, 이를 우려하고 있다면 공격자의 비용을 증가시키는 Discourse hCaptcha 플러그인을 사용하는 것이 좋습니다. (Meta는 이를 사용하지 않으며, Discourse가 호스팅하는 대부분의 포럼도 이를 사용하지 않습니다.)

Discourse가 제 제안, 즉 존재하지 않는 계정의 이메일 주소로 "비밀번호를 재설정할 수 없으며, 해당 계정은 존재하지 않습니다"라는 이메일을 보내기 시작하는 것을 수용한다면, hCaptcha 플러그인이 가입 양식뿐만 아니라 비밀번호 재설정 양식에서도 작동하는 것이 합리적일 것입니다. (저는 여전히 hCaptcha를 필요로 하거나 사용하지 않을 것입니다.)

3개의 좋아요

네, 맞는 말씀입니다. 저는 해당 사례만 단독으로 고려해서 다른 영역에서는 이미 가능하고, 실제로는 방지하는 것이 완전히 비현실적인 경우를 고려하지 못했습니다.

그렇지 않나요?

  1. 비밀번호를 잊어서 이 사이트에 접근하고 싶습니다. 제가 생각하기에 맞는 이메일을 입력합니다.
  2. 비밀번호 재설정 링크를 받지 못합니다.

이제 자동으로 두 가지 가능성 중 하나를 알게 됩니다. 첫째, 잘못된 이메일을 입력했거나, 둘째, 사이트가 제대로 작동하지 않는 것입니다.

제 선택지는 이제 다음과 같습니다. 다른 이메일을 시도하거나, 사이트를 운영하는 사람에게 연락하는 것입니다.

그런데 제안을 따르게 되면 계정이 존재하지 않는다는 이메일을 받게 됩니다. 선택지는 여전히 다른 이메일을 시도하거나, 사이트를 운영하는 사람에게 연락하는 것입니다. 결국 같은 지점에 도달하며 추가 단계는 0입니다.

1개의 좋아요

하지만… 대부분의 일반 사용자는 그렇게 생각하지 않거나, 아예 생각조차 하지 않습니다.

1개의 좋아요