본문으로 건너뛰기

IAM Operation 도메인 비즈니스 규칙

Event Storming 기반으로 도출된 IAM-Operation Domain의 비즈니스 규칙을 정의합니다.


1. 불변식 (Invariants)

1.1 Account

계정 고유성

  • 규칙: 동일한 이메일로 같은 그룹에 중복 가입 불가
  • 위반 시: AccountCreationRejectedDueToDuplicateGroup 이벤트 발행, 가입 거부

비밀번호 불변 조건

  • 규칙: 비밀번호 재설정 시 기존 비밀번호와 동일한 비밀번호 사용 불가
  • 위반 시: PasswordResetRejectedDueToDuplicatePassword 이벤트 발행, 재설정 거부

마지막 관리자 보호

  • 규칙: 사이트의 유일한 관리자(SiteAdmin)는 다른 계정이 존재하는 경우 삭제 불가
  • 위반 시: AccountDeletionRejectedDueToLastAdmin 이벤트 발행, 삭제 거부

계정-사이트 생명주기 연동

  • 규칙: 삭제할 계정이 해당 사이트의 유일한 계정인 경우 사이트도 함께 삭제
  • 위반 시: 예외 발생

1.2 SecurityCode

보안 코드 고유성

  • 규칙: 생성된 6자리 보안 코드는 캐시 내에서 중복 불가
  • 위반 시: 보안 코드 재생성

보안 코드 단일 검증 원칙

  • 규칙: 보안 코드는 1회 검증 성공 후 무효화
  • 위반 시: SecurityCodeValidationFailed 이벤트 발행, 검증 거부

2. 유효성 규칙 (Validation Rules)

2.1 Account

비밀번호 길이 검증

  • 규칙: 비밀번호는 10~20자리여야 함
  • 위반 시: 예외 발생

비밀번호 복잡도 검증

  • 규칙: 비밀번호는 숫자, 문자, 특수문자(!@#$%^&*()_+-=[]{}|;:,.<>?) 중 2가지 이상 포함
  • 위반 시: 예외 발생

전화번호 검증

  • 규칙: 전화번호는 정규화(sanitize) 및 유효성 검증 필수
  • 위반 시: 예외 발생

계정 소유권 검증

  • 규칙: 계정 삭제 시 토큰의 계정 ID와 요청한 계정 ID 일치 검증
  • 위반 시: AccountDeletionRejectedDueToUnauthorizedUser 이벤트 발행, 삭제 거부

삭제 비밀번호 검증

  • 규칙: 계정 삭제 전 입력된 비밀번호 검증 필수
  • 위반 시: AccountDeletionRejectedDueToPasswordMismatch 이벤트 발행, 삭제 거부

2.2 SecurityCode

보안 코드 형식 검증

  • 규칙: 보안 코드는 6자리 숫자로 구성
  • 위반 시: 예외 발생

보안 코드 만료 검증

  • 규칙: 보안 코드는 캐시에 저장된 만료 시간 이내에만 유효
  • 위반 시: SecurityCodeValidationFailed 이벤트 발행

보안 코드-이메일 일치 검증

  • 규칙: 입력된 보안 코드가 해당 이메일에 발급된 코드와 일치하는지 검증
  • 위반 시: SecurityCodeValidationFailed 이벤트 발행

3. 상태 전이 규칙 (State Transition Rules)

3.1 SecurityCode 생명주기

[생성 대기]

[캐시 저장] (만료 시간 설정)
├─→ (검증 성공)
│ [사용 완료 + 임시 토큰 발급]
│ ↓
│ [비밀번호 재설정]

└─→ (만료 시간 경과)
[만료됨] (캐시에서 자동 삭제)

전환 조건:

  • 생성 → 캐시 저장: SecurityCodeStoredInCache 이벤트 발행
  • 검증 성공 → 임시 토큰 발급: TemporaryAccessTokenIssued 이벤트 발행 (30분 유효)
  • 임시 토큰 사용 → 비밀번호 재설정: PasswordResetWithTemporaryToken 이벤트 발행

4. 권한 규칙 (Authorization Rules)

4.1 사이트 관리 권한

APIPlatformAdminSiteAdminSiteMember비인증비고
RequestSiteRegistration공개 API
GetSiteRegistrations플랫폼 관리자만
ApproveSiteRegistration플랫폼 관리자만
CreateSite플랫폼 관리자만
GetSites관리자만
GetGroups인증된 사용자

4.2 계정 삭제 권한

APIPlatformAdminSiteAdminSiteMember비인증비고
DeleteAccount본인 또는 관리자

4.3 비밀번호 관리 권한

APIPlatformAdminSiteAdminSiteMember비인증비고
ResetAccountPassword본인의 비밀번호 변경
ForceResetPassword관리자에 의한 강제 초기화
SendResetPasswordSecurityCode보안 코드 요청
VerifyResetPasswordSecurityCode보안 코드 검증
ResetPasswordWithSecurityCode보안 코드를 통한 재설정
ValidatePassword본인의 비밀번호 검증
FindAccountEmails이메일 찾기 (마스킹 처리)

4.4 프로필 관리 권한

APIPlatformAdminSiteAdminSiteMember비인증비고
GetMyProfile본인 프로필 조회
UpdateAccountProfile본인 프로필 수정
UpdateAccountPosition계정 포지션 변경

4.5 조회 권한

APIPlatformAdminSiteAdminSiteMember비인증비고
GetAccountsBySiteId본인 사이트의 계정 목록
GetAuthorizedAccountsBySiteId처방 권한 계정 조회

4.6 그룹별 접근 권한

그룹관리자 API 접근연구용 탭 접근비고
medi.platform-admin사내 운영자, 플랫폼 전체 관리 권한
medi.site-admin✓ (조건부)사이트 관리자, Site가 ClinicalResearch인 경우
medi.site-member✓ (조건부)사이트 구성원, Site가 ClinicalResearch인 경우

5. 계산/파생 규칙 (Derivation Rules)

5.1 비밀번호 해싱 계산

비밀번호 저장 해시

  • 파생: 클라이언트 1차 해싱 비밀번호 + SERVER_PEPPER 결합 후 bcrypt 재해싱
  • 계산식:
    StoredPasswordHash := bcrypt(ClientHashedPassword + SERVER_PEPPER)

비밀번호 검증 계산

  • 파생: 로그인 시 입력된 비밀번호 해시와 저장된 해시 constant-time 비교
  • 계산식:
    PasswordMatch := bcrypt.compare(ClientHashedPassword + SERVER_PEPPER, StoredPasswordHash)

6. 제약 사항 (Constraints)

6.1 보안 제약

초대 트랜잭션 정책

  • 제약: 초대 기반 회원가입 시 계정 생성과 초대 상태 업데이트를 단일 트랜잭션으로 처리
  • 롤백 조건: 오류 발생 시 전체 롤백

비밀번호 초기화 트랜잭션 정책

  • 제약: 관리자에 의한 강제 비밀번호 초기화 시 비밀번호 업데이트와 이메일 전송을 단일 트랜잭션으로 처리
  • 롤백 조건: 이메일 전송 실패 시 비밀번호 변경도 롤백

6.2 데이터 보호 제약

보안 코드 임시 저장

  • 제약: 보안 코드는 데이터베이스가 아닌 캐시(Redis 등)에 임시 저장
  • 만료 정책: 설정된 TTL 경과 시 자동 삭제

6.3 감사 및 컴플라이언스 제약

비밀번호 변경 이력 기록 의무

  • 제약: 모든 비밀번호 변경(사용자/관리자/재설정)에 대해 이력 기록 필수
  • 기록 정보: 시간, 계정 ID, 변경 주체, 변경 유형

7. 정책 상세 (Policy Details from Event Storming)

7.1 보안 코드 기반 비밀번호 재설정 정책

WhenThen
SecurityCodeValidatedTemporaryAccessTokenIssued 발행 (30분 유효)
TemporaryAccessTokenIssued비밀번호 재설정 가능 상태
PasswordResetWithTemporaryToken비밀번호 업데이트 + 기존 비밀번호 중복 검증

7.2 강제 비밀번호 초기화 정책

WhenThen
PasswordForcedResetRequestedRandomPasswordGenerated 발행
RandomPasswordGeneratedPasswordForciblyReset 발행 (DB 업데이트)
PasswordForciblyResetPasswordResetEmailSent 발행 (동일 트랜잭션)
PasswordResetEmailFailed트랜잭션 롤백 (비밀번호 변경도 취소)

7.3 계정 삭제 정책

WhenThen
AccountDeletionRequested권한 검증 + 비밀번호 검증
AdminAccountDeletionEvaluated마지막 관리자 여부 확인
AccountDeleted (유일한 계정)SiteDeletedWithLastAccount 발행
AccountDeleted (다른 계정 존재)계정만 삭제

변경 이력

버전날짜작성자변경 내용
0.57.02025-12-15dalia@weltcorp.comRequirements, Event Storming 기반 비즈니스 규칙 문서 작성