이메일/비밀번호 인증
이 페이지의 내용
개요
이메일/비밀번호 인증은 사용자가 이메일 주소를 사용해 가입하고 로그인할 수 있도록 하는 기능입니다. Atlas App Services는 사용자가 로그인하기 전에 반드시 사용자의 이메일/비밀번호를 확인해야 합니다.
다음 다이어그램은 로그인을 위한 프로세스 흐름을 보여줍니다.
참고
사용자 이메일 주소는 대소문자를 구분합니다. 예를 들어, 이메일 주소가 TestAccount@example.com
인 사용자는 testaccount@example.com
주소를 사용해 로그인할 수 없습니다.
구성
왼쪽 탐색에서 인증을 클릭합니다.
인증 제공자 목록에서 Email/Password 을(를) 선택합니다. 이 화면에서 제공자 를 구성하고 활성화 할 수 있습니다. 다음 섹션을 사용하여 프로세스 를 가이드 합니다.
App Services CLI 를 사용하여 이메일/비밀번호 인증 제공자 를 활성화 하고 구성하려면 /auth/providers.json
에서 구성 객체 를 정의합니다.
이메일/비밀번호 제공자 구성의 형식은 다음과 같습니다.
{ "local-userpass": { "name": "local-userpass", "type": "local-userpass", "config": { "autoConfirm": <boolean>, "emailConfirmationUrl": <string>, "confirmEmailSubject": <string>, "runConfirmationFunction": <boolean>, "confirmationFunctionName": <string>, "resetPasswordUrl": <string>, "resetPasswordSubject": <string>, "runResetFunction": <boolean>, "resetFunctionName": <string>, }, "disabled": <boolean> } }
팁
인증 제공자의 name
은 항상 해당 type
과 동일합니다.
사용자 확인
이메일/비밀번호 사용자가 인증하려면 먼저 앱에서 사용자의 새 계정을 등록하고 확인해야 합니다. 이메일/비밀번호 사용자를 등록하면 새 사용자 객체가 만들어집니다. 그런 다음 App Services에서 계정 확인을 요청합니다. 세 가지 방법 중 하나를 선택하여 새 사용자 계정을 확인할 수 있습니다.
다음 다이어그램은 사용자 확인 프로세스의 흐름을 보여줍니다.
새 사용자 계정 상태
사용자 계정은 보류 또는 확인, 두 가지 상태 중 하나일 수 있습니다.
확인 프로세스가 시작되면 Atlas App Services는 사용자 계정을 생성하고 상태를 Pending Confirmation으로 설정합니다. 이 상태에서는 사용자가 로그인할 수 없습니다. 이제 이메일 주소가 사용자 계정과 연결되어 있으므로 동일한 이메일을 다시 등록하려는 시도는 실패합니다.
계정이 대기 중 상태인 경우 사용자는 로그인 전에 본인의 계정을 확인해야 합니다. 사용자가 본인의 계정을 확인하면 Atlas App Services가 상태를 Confirmed(으)로 설정한 후에 사용자가 로그인할 수 있습니다.
사용자를 자동으로 확인하는 경우에는 상태가 Confirmed로 설정된 상태로 계정이 생성되며 사용자는 등록 후 바로 로그인할 수 있습니다.
경고
앱을 개발 및 테스트할 때만 자동 확인을 사용하세요. 프로덕션 애플리케이션은 항상 보안 확인 프로세스를 사용해야 합니다.
대기 중인 사용자 계정 목록은 UI에서 또는 App Services API를 통해 확인할 수 있습니다.
왼쪽 탐색의 Data Access에서 App Users을 클릭합니다.
사용자 목록 상단에서 Pending 필터를 선택합니다.
Realm CLI 를 사용하여 대기 중인 사용자를 보려면 appservices users list 명령을 사용하고 --pending
옵션을 포함합니다.
Admin API 를 사용하여 대기 중인 사용자를 보려면 List Users 엔드포인트를 사용합니다.
확인 이메일 전송하기
이 확인 방법을 사용하면 사용자는 등록 시 이메일에 응답해야 합니다. 이메일에는 확인 URL 링크가 포함되어 있습니다. 사용자는 30분 이내에 이 링크를 방문하여 자신이 이메일 주소를 제어하고 있는지 확인해야 합니다.
다음과 같이 설정을 구성해 App Services가 자동으로 확인 이메일을 보내도록 할 수 있습니다.
Email Confirmation URL: 모든 확인 이메일에 포함된 URL의 기준입니다. App Services가 이 URL에 고유한
token
및tokenId
를 추가합니다. 이는 모든 확인에 대해 고유한 링크를 생성하는 쿼리 매개변수 역할을 합니다. 사용자를 확인하려면 먼저 사용자의 고유 URL에서 이러한 쿼리 매개변수를 추출하세요. 그런 다음token
과tokenId
를 클라이언트 SDK의confirmUser
함수에 전달합니다.모바일 애플리케이션은 앱 에서 직접 이메일 확인을 처리하다 할 수 있습니다. 이렇게 하려면 딥링킹 을(를)iOS 구성합니다. Android 또는 유니버설 링크 에서
Email Confirmation Subject: App Services에서 보내는 이메일의 제목 줄입니다. 이 값은 선택 사항이며 생략하면 App Services에서 대신 기본값 제목 줄을 사용합니다. 사용자 지정 이메일 확인 제목은 최대 256자까지 포함할 수 있습니다.
참고
확인 이메일의 사용자 지정은 현재 기본 URL 및 제목 표시줄 외에는 불가능합니다. 특히 확인 이메일의 발신자 주소는 항상 mongodb.com
입니다.
프로덕션 앱의 경우 내장된 확인 이메일 메서드 대신 확인 함수를 사용할 수 있습니다. 확인 함수를 사용하면 사용자 지정 이메일 확인을 완전히 구축할 수 있습니다. 자세한 내용은 확인 함수 실행 을 참조하세요.
확인 기능 실행
새 사용자가 등록하면 Run a Confirmation Function을 할 수 있습니다. App Services는 사용자가 만든 함수에 확인 토큰, 토큰 ID, 사용자 이메일을 전달합니다. 그러면 함수가 사용자를 확인하는 데 필요한 논리를 수행하고 다음과 같은 결과 객체 중 하나를 반환합니다. 자세한 내용은 아래에 설명되어 있습니다.
{ status: 'success' }
{ status: 'fail' }
{ status: 'pending' }
이 함수 내에서는 사용자 확인을 위한 사용자 지정 로직을 정의합니다. 그 예로 해당 함수는 다음 작업을 수행할 수 있습니다.
특정 도메인에서 사용자 지정 확인 이메일을 발송합니다. 외부 서비스를 사용하여 특정 템플릿과 함께 전송합니다.
MongoDB Atlas 의 컬렉션 또는 외부 REST 서비스에서 사용자 권한을 읽습니다.
SMS 등 이메일 이외의 서비스를 통해 확인 메시지를 발송합니다.
이 사용자 지정 확인 함수 서명에는 매개변수가 한 개 있습니다. 이 매개변수는 사용자 데이터와 확인 토큰이 담긴 객체입니다. 이러한 필드는 다음과 같습니다.
필드 | 설명 |
---|---|
username | 사용자의 이메일 주소입니다. |
token | 사용자의 ID를 확인하는 데 사용되는 고유 값. SDK의 Confirm User(사용자 확인) 함수를 호출할 때 사용합니다. |
tokenId | 사용자의 ID를 확인하는 데 사용되는 고유 값. SDK의 Confirm User(사용자 확인) 함수를 호출할 때 사용합니다. |
사용자 지정 사용자 확인 함수는 상태 필드가 있는 객체를 반환합니다. 다음 표에서는 이 필드의 가능한 값에 대해 설명합니다.
상태 | 효과 |
---|---|
success | App Services가 사용자의 신원을 확인해 사용자가 새 계정에 로그인할 수 있도록 합니다. |
pending | App Services는 사용자의 확인 상태를 Pending Confirmation 으로 변경합니다. 이는 사용자의 ID를 확인하거나 로그인을 허용하지 않습니다. 클라이언트 애플리케이션은 SDK의 Confirm User(사용자 확인) 함수를 호출하여 프로세스를 마무리해야 합니다. |
fail | App Services가 사용자 계정을 생성하지 않습니다. 사용자는 다시 가입해야 계정 확인을 다시 시도할 수 있습니다. 이전 계정이 존재하지 않으므로 동일한 사용자 이름(이메일)을 다시 사용할 수 있습니다. |
아래 내용은 다음에 해당하는 사용자 확인 기능의 예시입니다.
입력한 이메일이 유효한 이메일인지 확인합니다.
지정된 이메일 주소가 특정 서비스에 대한 액세스 권한이 있는지 확인합니다.
사용자에게 SMS 메시지를 보냅니다.
메시지가 성공적으로 전송되면 Atlas App Services에 상태를 보류 중으로 설정해 새 계정을 만들도록 알립니다.
exports = ({ token, tokenId, username }) => { // Validate the username const isValidEmail = myCustomValidatorService.validate(username); // Check if the user has access to this service const isPrivileged = myCustomAuthorizationService.hasAccess(username) // Send a message to the user so that they can confirm themselves const msgSendSuccessful = isValidEmail && isPrivileged && mySmsService.send(username, token, tokenId) if ( msgSendSuccessful ) { return { status: 'pending' }; } else { return { status: 'fail' }; } }
사용자 정의 함수가 자동으로 사용자를 확인하지 않는 한, 함수가 실행된 후 사용자가 확인 프로세스를 완료할 수 있는 수단을 제공해야 합니다. 추가 확인 단계를 완료한 후 SDK의 Confirm User(사용자 확인) 메서드를 호출하여 Atlas App Services에서 사용자 계정 생성을 마무리합니다.
사용자 자동 확인
제공자를 Automatically Confirm Users로 구성할 수 있습니다. 이 옵션을 선택하면 App Services에서 등록 후 즉시 새 이메일/비밀번호 사용자를 확인합니다.
경고
App Services는 자동으로 확인된 이메일 주소의 유효성을 검사하지 않습니다. 따라서 이메일을 통해 이러한 사용자에게 연락할 수 없는 몇 가지 이유가 있습니다.
자동으로 확인된 사용자의 이메일 주소가 실제 사용자의 이메일 주소가 아닐 수 있습니다. (예: 사용자가
steve.jobs@apple.com
라는 이메일 주소로 가입했을 수 있습니다.)사용자의 이메일 주소가 유효한 이메일 주소가 아닐 수도 있습니다. (예: 사용자가
my.name@gmail
,asdavaskljj
등을 사용해 가입했을 수 있습니다)
이 옵션을 사용할 때는 주의해야 합니다. 유효한 연락처 정보가 없는 사용자 계정의 비밀번호를 안전하게 재설정하는 것은 매우 어려울 수 있습니다.
비밀번호 재설정
이메일/비밀번호 사용자가 본인의 비밀번호를 잊어버리면 재설정을 해야 할 수 있습니다. 보안상의 이유로 사용자의 신원을 확인한 후에 비밀번호 재설정을 완료해야 합니다. App Services는 이를 수행하는 두 가지 방법을 다음과 같이 제공합니다.
사용자 신원을 확인한 후 비밀번호 재설정 요청을 완료할 수 있습니다. 비밀번호 재설정이 완료되면, 사용자는 새로운 비밀번호를 사용하여 로그인할 수 있습니다.
비밀번호 재설정 이메일 보내기
사용자가 비밀번호 재설정을 요청하면 App Services에서 사용자의 이메일 주소로 비밀번호 재설정 URL을 보내도록 제공자를 Send a Password Reset Email.로 구성할 수 있습니다. 사용자는 30분 이내에 이 URL을 방문해야 합니다.
비밀번호 재설정 이메일을 구성할 때 다음 설정을 구성할 수 있습니다.
Password Reset URL: 모든 비밀번호 재설정 이메일에 포함된 URL의 기본값입니다. App Services는 이 URL에 고유한
token
과tokenId
를 추가합니다. 이는 모든 비밀번호 재설정에 대한 고유 링크를 생성하기 위한 쿼리 매개 변수 역할을 합니다. 사용자의 비밀번호를 재설정하려면 사용자의 고유 URL에서 이러한 쿼리 매개 변수를 추출합니다. token과 tokenId를 클라이언트 SDK의resetPassword
함수에 전달합니다.Reset Password Email Subject: App Services에서 보내는 이메일의 제목 줄입니다. 이 값은 선택 사항입니다. 생략하면 App Services에서 대신 기본값 제목 줄을 사용합니다. 사용자 지정 비밀번호 재설정 제목은 최대 256자까지 포함할 수 있습니다.
모바일 애플리케이션은 앱에서 직접 비밀번호 재설정을 처리할 수 있습니다. Android에서 딥 링킹을 구성하거나 IOS에서 범용 링크를 구성합니다.
참고
비밀번호 재설정 이메일은 현재 기본 URL 및 제목 줄 외에는 사용자 지정할수 없습니다. 특히 확인 이메일의 발신자 주소는 항상 mongodb.com
입니다.
프로덕션 앱의 경우 기본 제공 비밀번호 재설정 이메일 방법 대신 사용자 지정 비밀번호 재설정 기능을 사용할 수 있습니다. 사용자 지정 기능을 사용하면 완전히 사용자 지정 이메일 확인을 빌드하거나 이메일이 아닌 다른 방법을 사용하여 비밀번호 재설정 요청을 확인할 수 있습니다.
비밀번호 재설정 함수 실행
제공자를 Run a Password Reset
Function으로 구성할 수 있습니다. SDK에서 callResetPasswordFunction()
를 사용하는 경우 실행할 App Services에 대한 함수를 정의합니다. App Services는 사용자의 이메일, 원하는 새 비밀번호, 확인 토큰 및 토큰 ID를 사용자가 만든 함수에 전달합니다. 그러면 함수는 비밀번호를 재설정하기 전에 사용자의 신원을 확인하는 데 필요한 로직을 수행합니다.
App Services에서는 사용자의 비밀번호를 즉시 재설정할 수 있습니다. 아니면 클라이언트 애플리케이션에 추가 확인을 요청할 수도 있습니다.
App Services 함수는 status
키가 포함된 객체를 반환해야 합니다. 키는 다음 값 중 하나를 사용하여 문자열에 매핑됩니다. 이에 대한 자세한 내용은 아래에 설명되어 있습니다.
{ status: 'success' }
{ status: 'fail' }
{ status: 'pending' }
경고
Realm SDK 함수 callResetPasswordFunction()
이 인증되지 않았습니다. 비밀번호 복구는 본인 계정에 로그인할 수 없는 사용자를 위한 기능입니다. 그래서 이 함수로 전송된 호출을 특정 App Services 사용자와 연결할 수 없습니다. success
상태를 반환하면 비밀번호가 함수의 password
매개 변수에 있는 새 값으로 영구적으로 변경됩니다. 따라서 success
를 반환하면 모든 사용자가 다른 애플리케이션 사용자의 비밀번호를 재설정할 수 있게 됩니다. 보안을 위해 신뢰할 수 있는 통신 모드를 통해 계정 소유자에게 메시지를 보내고 pending
을 반환해야 합니다.
사용자 지정 비밀번호 재설정 기능을 사용해 비밀번호 재설정 흐름을 원하는 대로 정의할 수 있습니다.
외부 서비스를 이용하여 특정 템플릿으로 특정 도메인에서 사용자 지정 비밀번호 재설정 이메일을 보내세요.
MongoDB Atlas 컬렉션에 연결해 비밀번호 재설정 "휴지 기간"을 구현합니다. 이렇게 하면 특정 기간 동안 단일 계정에서 과도한 비밀번호 재설정 시도를 할 수 없도록 방지할 수 있습니다.
이메일이 아닌 다른 서비스를 통해 사용자 지정 비밀번호 재설정 메시지를 발송합니다.
참고
비밀번호 재설정 함수를 사용하는 작업은 비밀번호 재설정 이메일을 보내도록 App Services를 구성하는 작업과 함께 사용할 수 없습니다. 사용자 지정 함수를 사용하도록 비밀번호 재설정을 구성할 경우, 클라이언트 SDK에서 sendResetPasswordEmail()
을(를) 호출하면 오류가 반환됩니다.
사용자 지정 비밀번호 재설정 함수 서명은 가변적이라 원하는 수의 매개 변수를 사용할 수 있습니다. 첫 번째 매개 변수는 언제나 사용자 데이터와 확인 토큰을 포함하는 객체이며, 이후의 모든 매개 변수는 사용자 지정 매개 변수입니다. 이러한 매개 변수는 클라이언트 SDK에 인수 컬렉션으로 전달됩니다. 예를 들어, 다음 클라이언트 SDK 호출은
callResetPasswordFunction("myUsername", "newPassword", ["Security Question Answer 1", "Security Question Answer 2", "securityCode:0510"])
다음과 같은 비밀번호 재설정 기능을 위한 사용자 지정 서명이 됩니다.
resetFunc({username, password, token, tokenId, currentPasswordValid}, securityAnswer1, securityAnswer2, securitySMSCode)
사용자 지정 비밀번호 재설정 함수에서는 첫 번째 매개변수로 객체를 전달해야 합니다. 다음 표에서는 이 객체에 있는 필드에 대해 설명합니다.
필드 | 설명 |
---|---|
username | 사용자의 이메일 주소입니다. |
password | 사용자에게 새로 제안된 비밀번호. 이 함수가 성공 상태를 반환하는 경우 이는 사용자의 새 비밀번호가 됩니다. |
token | 사용자의 비밀번호를 업데이트하는 데 사용되는 고유 값입니다. |
tokenId | SDK confirmUser 함수를 사용하여 사용자의 신원을 확인하는 데 사용되는 고유 값입니다. |
currentPasswordValid | 사용자가 자신의 비밀번호를 기존 비밀번호로 변경하도록 요청하는 경우 참인 부울입니다. |
사용자 지정 비밀번호 재설정 함수는 status
필드가 포함된 객체를 반환해야 합니다. 이 status
필드의 값은 다음 중 하나일 수 있습니다.
상태 | 비밀번호 재설정 상태 | SDK의 영향 |
---|---|---|
success | App Services 사용자의 비밀번호를 제공된 password 매개 변수로 즉시 변경합니다. 사용자 지정 함수에서 사용자의 신원을 인증하는 경우에만 success 를 반환합니다. 보안 질문 또는 기타 보안 수단을 사용하여 이 작업을 수행할 수 있습니다. | 사용자 지정 함수 호출이 success 를 반환하면 클라이언트 앱은 오류가 없는 것을 비밀번호 재설정에 성공한 것으로 해석할 수 있고, 사용자는 새 비밀번호를 사용해 로그인할 수 있습니다. |
pending | App Services는 클라이언트 애플리케이션이 추가 조치를 취해서 비밀번호 재설정을 완료할 때까지 기다립니다. 그 예로 사용자 지정 비밀번호 재설정 함수는 이메일 또는 SMS를 통해 token 및 tokenId 를 전송하여 사용자의 신원을 확인할 수 있습니다. | 이 함수를 호출하는 SDK 메서드는 반환 값을 받지 않으므로 pending 사례를 직접 처리하다 하지 않습니다. 비밀번호 재설정 프로세스 를 완료하려면 애플리케이션 에 사용자 지정 로직을 구현 해야 합니다. 예를 예시 클라이언트 에서 딥링크 또는 유니버설 링크를 구현 하여 token 및 tokenId 를 추출한 다음 resetPassword 메서드를 호출하여 재설정을 완료할 수 있습니다. |
fail | 아무 일도 일어나지 않습니다. | SDK는 사용자 지정 비밀번호 재설정 기능을 호출할 때 반환된 fail 을 오류 또는 예외로 해석합니다. |
사용자 지정 비밀번호 재설정 함수에는 이 예와 유사한 요소가 포함될 수 있습니다.
exports = ({ token, tokenId, username, password, currentPasswordValid }) => { // check if the username corresponds to a real user const isUser = myCustomValidator.validate(username); // check if the user is attempting to reset their password to their current password if (currentPasswordValid) { myCustomNotifier.sendMessage(username, "Cannot reset password to current password."); return { status: 'fail' }; } // check if the user has requested a password reset too often recently const isNotCoolingDown = myCustomCooldownService.canReset(username, 'myCustomService') // send a message to the user in some way so that the user can confirm themselves const msgSendSuccessful = isUser && isNotCoolingDown && myCustomMsgr.send(username, token, tokenId) if ( msgSendSuccessful ) { return { status: 'pending' }; } else { return { status: 'fail' }; } }
예시
이메일/비밀번호 인증을 사용한 등록, 로그인 및 비밀번호 재설정 흐름의 예는 Realm SDK를 참조하세요.
요약
이메일/비밀번호 인증을 통해 사용자는 사용자 이름과 비밀번호를 기반으로 애플리케이션에서 ID를 생성할 수 있습니다.
이메일/비밀번호 인증을 활성화하려면 애플리케이션에서 이메일 확인 방법과 사용자 비밀번호 재설정 방법을 지원해야 합니다. 이러한 각 요구 사항에는 여러 가지 구현 옵션이 있습니다.