Azure Active Directory B2C에서 사용자 액세스 관리

이 문서에서는 Azure AD B2C(Azure Active Directory B2C)를 사용하여 애플리케이션에 대한 사용자 액세스를 관리하는 방법에 대해 설명합니다. 애플리케이션의 액세스 관리에는 다음 항목이 포함됩니다.

  • 미성년자 식별 및 애플리케이션에 대한 사용자 액세스 제어
  • 애플리케이션을 사용하는 미성년자에 대한 보호자의 동의 요구
  • 사용자의 생년월일 및 국가/지역 데이터 수집
  • 사용 약관 계약 캡처 및 액세스 제한

참고 항목

Azure Active Directory B2C에서 사용자 지정 정책은 주로 복잡한 시나리오를 해결하기 위해 설계되었습니다. 대부분의 시나리오에서 기본 제공 사용자 흐름을 사용하는 것이 좋습니다. 아직 수행하지 않았다면 Active Directory B2C에서 사용자 지정 정책 시작하기에서 사용자 지정 정책 스타터 팩에 대해 알아봅니다.

미성년자 액세스 제어

애플리케이션 및 조직은 미성년자를 대상으로 하지 않는 애플리케이션 및 서비스를 미성년자가 사용하지 못하도록 차단할 수 있습니다. 또는 애플리케이션 및 조직에서 미성년자를 받아들인 후 보호자의 동의를 관리하고 비즈니스 규칙에 규정되고 규정에 따라 허용되는 경험을 미성년자에게 제공할 수 있습니다.

사용자가 미성년자로 식별되면 Azure AD B2C에서 사용자 흐름을 다음 세 가지 옵션 중 하나로 설정할 수 있습니다.

  • 애플리케이션에 서명된 JWT id_token 보내기: 사용자가 디렉터리에 등록되고, 토큰이 애플리케이션으로 반환됩니다. 그런 다음, 애플리케이션에서 비즈니스 규칙을 적용하여 진행됩니다. 예를 들어, 애플리케이션이 보호자의 동의 프로세스를 진행할 수 있습니다. 이 방법을 사용하려면 프로그램으로부터 ageGroupconsentProvidedForMinor 클레임을 받도록 선택합니다.

  • 애플리케이션에 서명되지 않은 JSON 토큰 보내기: Azure AD B2C가 애플리케이션에 사용자가 미성년자임을 알리고 사용자의 보호자 동의 상태를 제공합니다. 그런 다음, 애플리케이션에서 비즈니스 규칙을 적용하여 진행됩니다. JSON 토큰이 애플리케이션 인증을 성공적으로 완료하지 못합니다. 애플리케이션은 JSON 토큰에 포함된 클레임에 따라 인증되지 않은 사용자를 처리해야 합니다. 여기에는 name, email, ageGroupconsentProvidedForMinor가 포함될 수 있습니다.

  • 사용자 차단: 사용자가 미성년자이고 보호자의 동의가 제공되지 않은 경우 Azure AD B2C에서 사용자에게 차단되었음을 알릴 수 있습니다. 토큰이 발급되지 않고 액세스가 차단되고 등록 과정에서 사용자 계정이 만들어지지 않습니다. 이 알림을 구현하려면 적합한 HTML/CSS 콘텐츠 페이지를 제공하여 사용자에게 알리고 적절한 옵션을 제시합니다. 애플리케이션에서 신규 등록을 위한 추가 작업이 필요하지 않습니다.

애플리케이션 규정에 따라 사용자가 성인으로 확인된 보호자의 동의를 받아야 할 수 있습니다. Azure AD B2C는 개인의 나이를 확인하여 확인된 성인이 미성년자에게 보호자 동의를 부여하는 환경을 제공하지 않습니다. 이러한 환경은 애플리케이션이나 다른 서비스 공급자가 제공해야 합니다.

다음은 보호자 동의를 수집하는 사용자 흐름의 예입니다.

  1. Microsoft Graph API 작업이 사용자를 미성년자로 식별하고 서명되지 않은 JSON 토큰의 형태로 사용자 데이터를 애플리케이션에 반환합니다.

  2. 애플리케이션에서 JSON 토큰을 처리하고, 보호자의 동의가 필요하다고 알리고 온라인으로 보호자의 동의를 요청하는 화면을 미성년자에게 표시합니다.

  3. Azure AD B2C에서 사용자가 정상적으로 로그인할 수 있는 로그인 경로를 보여 주고, legalAgeGroupClassification = “minorWithParentalConsent”가 포함되도록 설정된 토큰을 애플리케이션에 발급합니다. 애플리케이션에서 보호자 이메일 주소를 수집하고 보호자가 성인인지 확인합니다. 이를 위해 국가/지역 신분증, 면허증 확인 또는 신용카드 증명과 같은 신뢰할 수 있는 자료를 사용합니다. 성공적으로 확인되면 애플리케이션에서 미성년자에게 Azure AD B2C 사용자 흐름을 사용하여 로그인하라는 메시지를 표시합니다. 동의가 거부되면(예: legalAgeGroupClassification = “minorWithoutParentalConsent”) Azure AD B2C에서 동의 프로세스를 다시 시작하기 위해 애플리케이션에 JSON 토큰(로그인 아님)을 반환합니다. 필요에 따라 미성년자 또는 성인이 등록 코드를 미성년자의 메일 주소 또는 기록에 있는 성인의 메일 주소로 보내서 미성년자의 계정에 다시 액세스할 수 있도록 사용자 흐름을 사용자 지정할 수도 있습니다.

  4. 애플리케이션이 미성년자에게 동의 철회 옵션을 제공합니다.

  5. 미성년자 또는 성인이 동의를 철회하면 Microsoft Graph API를 사용하여 consentProvidedForMinordenied로 변경할 수 있습니다. 또는 애플리케이션이 동의가 철회된 미성년자를 삭제하도록 선택할 수도 있습니다. 필요에 따라 인증된 미성년자(또는 미성년자의 계정을 사용하는 보호자)가 동의를 철회할 수 있도록 사용자 흐름을 사용자 지정할 수도 있습니다. Azure AD B2C가 consentProvidedForMinordenied로 기록합니다.

legalAgeGroupClassification, consentProvidedForMinorageGroup에 대한 자세한 내용은 사용자 리소스 종류를 참조하세요. 사용자 지정 특성에 대한 자세한 내용은 사용자 지정 특성을 사용하여 소비자에 대한 정보를 수집합니다.를 참조하세요. Microsoft Graph API를 사용하여 확장된 특성을 처리하는 경우 긴 버전의 특성(예: extension_18b70cf9bb834edd8f38521c2583cd86_dateOfBirth: 2011-01-01T00:00:00Z)을 사용해야 합니다.

생년월일 및 국가/지역 데이터 수집

등록하는 동안 애플리케이션에서 Azure AD B2C를 사용하여 모든 사용자의 DOB(생년월일)와 국가/지역 정보를 수집할 수 있습니다. 이 정보가 아직 없으면 애플리케이션에서 다음 인증(로그인) 프로세스 중에 사용자에게 요청할 수 있습니다. 사용자는 자신의 DOB 및 국가/지역 정보를 제공하지 않으면 계속 진행할 수 없습니다. Azure AD B2C는 이 정보를 사용하여 해당 국가/지역의 규제 기준에 따라 해당 개인이 미성년자로 간주되는지 여부를 결정합니다.

사용자 지정된 사용자 흐름은 DOB 및 국가/지역 정보를 수집하고, Azure AD B2C 클레임 변환을 사용하여 ageGroup을 판별하고 디렉터리에서 결과를 유지하거나 DOB 및 국가/지역 정보를 직접 유지할 수 있습니다.

다음 단계에서는 사용자의 생년월일에서 ageGroup을 계산하는 데 사용되는 논리를 보여 줍니다.

  1. 목록에 있는 국가/지역 코드로 국가/지역을 찾습니다. 해당 국가/지역을 찾을 수 없는 경우 기본값으로 되돌립니다.

  2. MinorConsent 노드가 country/region 요소에 있는 경우:

    a. 성인으로 간주되기 위해 사용자가 출생한 날짜를 계산합니다. 예를 들어 현재 날짜가 2015년 3월 14일이고 MinorConsent가 18인 경우 생년월일은 2000년 3월 14일 이전이어야 합니다.

    b. 최소 생년월일과 실제 생년월일을 비교합니다. 최소 생년월일이 사용자 생년월일 이전이면, 계산은 연령 그룹 계산으로 Minor를 반환합니다.

  3. MinorNoConsentRequired 노드가 country/region 요소에 있으면, MinorNoConsentRequired의 값을 사용하여 2a 및 2b 단계를 반복합니다. 최소 생년월일이 사용자 생년월일 이전이면 2b의 출력은 MinorNoConsentRequired를 반환합니다.

  4. 두 계산에서 모두 true를 반환하지 않으면 Adult를 반환합니다.

애플리케이션이 DOB 또는 국가/지역 데이터를 다른 방법으로 안정적으로 수집한 경우, 애플리케이션은 Graph API를 사용하여 이 정보로 사용자 레코드를 업데이트할 수 있습니다. 예시:

  • 사용자가 성인으로 알려지면 디렉터리 특성인 ageGroup의 값을 Adult로 업데이트합니다.
  • 사용자가 미성년자인 것으로 확인되면 ageGroup 디렉터리 특성을 Minor 값으로 업데이트하고 consentProvidedForMinor를 적절하게 설정합니다.

미성년자 계산 규칙

나이 제한에는 두 개의 나이 값이 포함됩니다. 즉, 누군가가 더 이상 미성년자로 간주되지 않는 나이와 보호자의 동의를 받아야 하는 미성년자의 나이입니다. 다음 표에는 미성년자 및 보호자의 동의가 필요한 미성년자를 정의하는 데 사용되는 나이 규칙이 나와 있습니다.

국가/지역 국가/지역 이름 보호자의 동의가 필요한 미성년자의 나이 미성년자의 나이
기본값 없음 없음 18
AE 아랍에미리트 없음 21
AT 오스트리아 14 18
BE 벨기에 14 18
BG 불가리아 16 18
BH 바레인 없음 21
CM 카메룬 없음 21
CY 키프로스 16 18
CZ 체코 16 18
DE 독일 16 18
DK 덴마크 16 18
EE 에스토니아 16 18
EG 이집트 없음 21
ES 스페인 13 18
FR 프랑스 16 18
GB 영국 13 18
GR 그리스 16 18
HR 크로아티아 16 18
HU 헝가리 16 18
IE 아일랜드 13 18
IT 이탈리아 16 18
KR 한국 14 18
LT 리투아니아 16 18
LU 룩셈부르크 16 18
LV 라트비아 16 18
MT 몰타 16 18
해당 없음 나미비아 없음 21
NL 네덜란드 16 18
PL 폴란드 13 18
PT 포르투갈 16 18
RO 루마니아 16 18
SE 스웨덴 13 18
SG 싱가포르 없음 21
SI 슬로베니아 16 18
SK 슬로바키아 16 18
TD 차드 없음 21
TH 태국 없음 20
TW 대만 없음 20
US 미국 13 18

사용 약관 규약 포착

애플리케이션을 개발할 때 일반적으로 애플리케이션 내에서 사용자 디렉터리에 개입하지 않거나 약간만 개입하여 사용 약관에 대한 사용자의 동의를 캡처합니다. 하지만 Azure AD B2C 사용자 흐름을 사용하여 사용 약관에 대한 사용자의 동의를 수집하고, 동의가 승인되지 않은 경우 액세스를 제한하며, 마지막 승인 날짜 및 사용 약관의 최신 버전 날짜에 따라 이후의 사용 약관에 대한 변경 내용을 수락하도록 적용할 수 있습니다.

이용 약관에는 "제3자와 데이터 공유에 대한 동의"도 포함될 수 있습니다. 현지 규정 및 비즈니스 규칙에 따라 두 약관을 결합한 사용자의 수락을 수집하거나 사용자가 한 약관만 수락하고 다른 약관은 수락하지 않도록 할 수 있습니다.

다음 단계에서는 사용 약관을 관리하는 방법에 대해 설명합니다.

  1. Graph API 및 확장 특성을 사용하여 사용 약관에 대한 수락 및 수락 날짜를 기록합니다. 기본 제공 사용자 흐름 및 사용자 지정 정책을 모두 사용하여 이 작업을 수행할 수 있습니다. extension_termsOfUseConsentDateTimeextension_termsOfUseConsentVersion 특성을 만들어 사용하는 것이 좋습니다.

  2. “사용 약관 동의”라는 필수 확인란을 만들고, 등록하는 동안 결과를 기록합니다. 기본 제공 사용자 흐름 및 사용자 지정 정책을 모두 사용하여 이 작업을 수행할 수 있습니다.

  3. Azure AD B2C에서 사용 약관 계약 및 사용자의 동의를 저장합니다. Graph API를 사용하여 응답을 기록하는 데 사용되는 확장 특성을 읽어서 사용자의 상태(예: termsOfUseTestUpdateDateTime)를 쿼리할 수 있습니다. 기본 제공 사용자 흐름 및 사용자 지정 정책을 모두 사용하여 이 작업을 수행할 수 있습니다.

  4. 수락 날짜와 사용 약관의 최신 버전 날짜를 비교하여 업데이트된 사용 약관에 대한 동의를 요구합니다. 사용자 지정 사용자 흐름을 사용하는 경우에만 날짜를 비교할 수 있습니다. extension_termsOfUseConsentDateTime 확장 특성을 사용하고, 이 값을 termsOfUseTextUpdateDateTime 클레임과 비교합니다. 수락 날짜가 오래되었으면 자체 어설션된 화면을 표시하여 새로운 수락을 강제합니다. 그렇지 않으면 정책 논리를 사용하여 액세스를 차단합니다.

  5. 수락 버전 번호를 마지막으로 수락한 버전 번호와 비교하여 업데이트된 사용 약관에 대한 동의를 요구합니다. 사용자 지정 사용자 흐름을 사용하는 경우에만 버전 번호를 비교할 수 있습니다. extension_termsOfUseConsentDateTime 확장 특성을 사용하고, 이 값을 extension_termsOfUseConsentVersion 클레임과 비교합니다. 수락 날짜가 오래되었으면 자체 어설션된 화면을 표시하여 새로운 수락을 강제합니다. 그렇지 않으면 정책 논리를 사용하여 액세스를 차단합니다.

다음 시나리오에서는 사용 약관 동의를 캡처할 수 있습니다.

  • 새로운 사용자가 등록 중입니다. 사용 약관이 표시되고 동의 결과가 저장됩니다.
  • 사용자가 이전에 계약의 최신 또는 활성 사용 약관에 동의한 사용자로 로그인합니다. 사용 약관이 표시되지 않습니다.
  • 사용자가 최신 또는 활성 사용 약관에 아직 동의하지 않은 사용자로 로그인합니다. 사용 약관이 표시되고 동의 결과가 저장됩니다.
  • 사용자가 이전 버전의 사용 약관에 이미 동의한 사용자가 로그인하고, 이 사용 약관은 이제 최신 버전으로 업데이트됩니다. 사용 약관이 표시되고 동의 결과가 저장됩니다.

다음 이미지에서는 권장되는 사용자 흐름을 보여줍니다.

Flow chart diagram showing the recommended acceptance user flow

다음은 클레임의 날짜 기반 사용 약관 동의의 예입니다. extension_termsOfUseConsentDateTime 클레임이 2025-01-15T00:00:00보다 오래된 경우 termsOfUseConsentRequired 부울 클레임을 확인하고 자체 어설션된 화면을 표시하여 새 수락을 강제로 적용합니다.

<ClaimsTransformations>
  <ClaimsTransformation Id="GetNewUserAgreeToTermsOfUseConsentDateTime" TransformationMethod="GetCurrentDateTime">
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="extension_termsOfUseConsentDateTime" TransformationClaimType="currentDateTime" />
    </OutputClaims>
  </ClaimsTransformation>
  <ClaimsTransformation Id="IsTermsOfUseConsentRequired" TransformationMethod="IsTermsOfUseConsentRequired">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="extension_termsOfUseConsentDateTime" TransformationClaimType="termsOfUseConsentDateTime" />
    </InputClaims>
    <InputParameters>
      <InputParameter Id="termsOfUseTextUpdateDateTime" DataType="dateTime" Value="2025-01-15T00:00:00" />
    </InputParameters>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="termsOfUseConsentRequired" TransformationClaimType="result" />
    </OutputClaims>
  </ClaimsTransformation>
</ClaimsTransformations>

다음은 클레임의 버전 기반 사용 약관 동의의 예입니다. extension_termsOfUseConsentVersion 클레임이 V1과 같지 않으면 termsOfUseConsentRequired 부울 클레임을 확인하고 자체 어설션된 화면을 표시하여 새 수락을 강제로 적용합니다.

<ClaimsTransformations>
  <ClaimsTransformation Id="GetEmptyTermsOfUseConsentVersionForNewUser" TransformationMethod="CreateStringClaim">
    <InputParameters>
      <InputParameter Id="value" DataType="string" Value=""/>
    </InputParameters>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="extension_termsOfUseConsentVersion" TransformationClaimType="createdClaim" />
    </OutputClaims>
  </ClaimsTransformation>
  <ClaimsTransformation Id="GetNewUserAgreeToTermsOfUseConsentVersion" TransformationMethod="CreateStringClaim">
    <InputParameters>
      <InputParameter Id="value" DataType="string" Value="V1"/>
    </InputParameters>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="extension_termsOfUseConsentVersion" TransformationClaimType="createdClaim" />
    </OutputClaims>
  </ClaimsTransformation>
  <ClaimsTransformation Id="IsTermsOfUseConsentRequiredForVersion" TransformationMethod="CompareClaimToValue">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="extension_termsOfUseConsentVersion" TransformationClaimType="inputClaim1" />
    </InputClaims>
    <InputParameters>
      <InputParameter Id="compareTo" DataType="string" Value="V1" />
      <InputParameter Id="operator" DataType="string" Value="not equal" />
      <InputParameter Id="ignoreCase" DataType="string" Value="true" />
    </InputParameters>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="termsOfUseConsentRequired" TransformationClaimType="outputClaim" />
    </OutputClaims>
  </ClaimsTransformation>
</ClaimsTransformations>

다음 단계