Files
invyone/db/migrations/RUN_082_MIGRATION.md
T
gbpark 68f85f3736 회사 관리 기능 확장 + 테넌트/비번 보안 하드닝
- 첫 로그인 비번 강제 변경 (RUN_082): FORCE_PASSWORD_CHANGE 컬럼,
  ForcePasswordChangeGuardFilter, /auth/change-password API + 페이지
- 테넌트 일관성 가드: TenantConsistencyGuardFilter 로 JWT.company_code
  ↔ 서브도메인 company_code 대조, CompanyResolver 가 (db_name, company_code)
  동시 반환
- 회사 관리 확장 (RUN_083 audit log, RUN_084 lifecycle 컬럼):
  CompanyAdmin/Members/Templates/Lifecycle/AuditLog 서비스 +
  CompanyMgmtController + SuperAdminGuard
- 회사 관리 UI: CompanyAccordionRow 탭화 + 모달 4종
  (AdminInfo/Deactivate/Delete/RecopyTemplates) + AuditLogDrawer + csvExport
- 프로비저닝 마법사: force_password_change 토글 반영
- 프론트 인증: storage 이벤트 멀티탭 동기화, 403 errorCode
  (PASSWORD_CHANGE_REQUIRED / CROSS_TENANT_REJECTED / TENANT_NOT_RESOLVED)
  전역 리다이렉트
- 기타: StartupSchemaMigrator, OS별 도커 기동 스크립트, CLAUDE.md 트래킹

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 00:36:05 +09:00

2.2 KiB

082 마이그레이션 — 첫 로그인 비밀번호 강제 변경 컬럼

작성일: 2026-04-24 작성자: gbpark 관련: 회사 프로비저닝 FORCE_PW_CHANGE 토글 실제 동작 구현

목적

Step 3 마법사의 "첫 로그인 시 비밀번호 변경 강제" 토글이 실제로 동작하도록, USER_INFO 테이블에 플래그 컬럼을 추가한다.

  • 프로비저닝 시 관리자 계정 생성 시점에 플래그 true 로 INSERT
  • 로그인 시 플래그 true 면 프론트가 /change-password 로 강제 이동
  • 비밀번호 변경 성공 시 플래그 false 로 클리어

추가 컬럼

컬럼 타입 기본값 용도
FORCE_PASSWORD_CHANGE BOOLEAN FALSE true 면 로그인 성공 직후 비밀번호 변경 강제. 변경 완료 시 false 로 갱신

PASSWORD_CHANGED_AT 는 일단 추가하지 않음 — 필요해지면 후속 마이그레이션.

SQL

-- 082: 첫 로그인 비밀번호 강제 변경 플래그
ALTER TABLE USER_INFO
  ADD COLUMN IF NOT EXISTS FORCE_PASSWORD_CHANGE BOOLEAN DEFAULT FALSE;

실행

1) 메타 DB (= 프로비저닝 스키마 원본)

신규 회사 DB 는 SchemaCopier 가 메타 DB 를 pg_dump --schema-only 로 복제하므로, 메타 DB 에만 컬럼 추가하면 이후 신규 회사는 자동 반영된다.

psql -h 183.99.177.40 -U postgres -d invyone <<'SQL'
ALTER TABLE USER_INFO
  ADD COLUMN IF NOT EXISTS FORCE_PASSWORD_CHANGE BOOLEAN DEFAULT FALSE;
SQL

2) 기존 회사 DB 들

이미 프로비저닝된 회사 DB 에도 동일 ALTER 필요. DB 이름 목록은 메타 DB 의 COMPANY_MNG.DB_NAME 에서 확인:

psql -h 183.99.177.40 -U postgres -d invyone -c \
  "SELECT DB_NAME FROM COMPANY_MNG WHERE DB_STATUS='active';"

각 DB 에 대해:

for DB in $(psql -h 183.99.177.40 -U postgres -d invyone -t -c \
  "SELECT DB_NAME FROM COMPANY_MNG WHERE DB_STATUS='active'"); do
  psql -h 183.99.177.40 -U postgres -d "$DB" -c \
    "ALTER TABLE USER_INFO ADD COLUMN IF NOT EXISTS FORCE_PASSWORD_CHANGE BOOLEAN DEFAULT FALSE;"
done

롤백

ALTER TABLE USER_INFO DROP COLUMN IF EXISTS FORCE_PASSWORD_CHANGE;