✓ 충족 · ✗ 미충족(실시간) · ⦿ 시스템 전역 정책(사용자 변경 불가 — SCR-CM-007 에서 관리자가 조정)
비로그인 진입 · 2열 스플릿 카드(좌: 브랜드/소개 패널 · 우: 로그인 폼) · JWT 인증(accessToken+refreshToken) · 비밀번호는 RSA-OAEP-SHA256 암호화 전송 · 실패 5회 시 30분 자동 잠금 · [비밀번호를 잊으셨나요?] → SCR-CM-008 (권한: 비로그인)
진입 — 직접 URL / 비로그인 상태에서 보호 페이지 접근 시 자동 redirect
- 브랜드/소개 패널 — 좌측 아이덴티티 영역. 로고·타이틀·제품 미리보기 이미지로 구성되며 비로그인 상태 전용(Figma node 119:1838).
- 아이디 입력 — 필수. 비밀번호와 함께 IF-CM-AUTH-004 로 전송된다.
- 비밀번호 입력 — 필수. IF-CM-AUTH-004 공개키로 RSA-OAEP-SHA256 암호화 후 전송(평문 금지).
- 비밀번호를 잊으셨나요? — 클릭 시 SCR-CM-008 비밀번호 재설정 화면으로 이동.
- 로그인 상태 유지 — 체크 시 refreshToken 유지 기간이 14일→30일로 연장(SCR-CM-007 세션 정책과 연동).
- 오류/잠금 안내 — 실패 3회부터 카운터 노출, 5회 도달 시 30분 자동 잠금(계정 잠금 정책, SCR-CM-007).
- 로그인 버튼 — 제출. 성공 시 JWT accessToken+refreshToken 발급 후 프로젝트 대시보드로 이동.
- POST
/api/auth/login— 아이디+RSA암호화 비밀번호로 인증, JWT accessToken/refreshToken 발급 - GET
/api/auth/public-key— IF-CM-AUTH-004 RSA 공개키 발급, 비밀번호 평문 전송 금지 정책상 로그인 폼 제출 전 필수 선행 호출. AuthController.kt:72 구현됨(springdoc 자동 노출)
(프로젝트 목록 대시보드)
🎨 Figma 상태 5종(node 119:1838): default · hover/typing · filled · error(아이디·비밀번호 필드 빨간 테두리 + 실패 횟수 라벨) · locked(30분 잠금 안내 라벨). 오류·잠금 라벨은 [로그인 상태 유지] 체크박스와 [로그인] 버튼 사이에 노출. 비밀번호는 IF-CM-AUTH-004 공개키로 RSA-OAEP-SHA256 암호화 후 전송(평문 금지).
사용자 메뉴 진입(만료 시 자동 전환) · 현재/새 비밀번호 모두 RSA 암호화 전송 · 실시간 규칙 검증(✓ 충족 / ✗ 미충족) · ⦿ 전역 정책은 관리자가 SCR-CM-007 에서 조정 (권한: 로그인 사용자)
진입 — 계정 설정(SCR-CM-009) [비밀번호] 탭 / 비밀번호 만료 시 자동 전환
- 현재 비밀번호 — 필수. 본인 확인용, RSA 암호화 전송.
- 새 비밀번호 — 필수. RSA 암호화 전송, 입력 중 아래 규칙 칩이 실시간 갱신된다.
- 비밀번호 확인 — 필수. 새 비밀번호와 일치해야 [변경] 버튼 활성.
- 비밀번호 규칙 칩 — ✓/✗ 는 입력값 기준 실시간 검증, ⦿ 는 시스템 전역 정책(사용자 변경 불가, SCR-CM-007 에서 관리자만 조정).
- 변경 버튼 — 제출. 성공 시 재로그인 없이 세션 유지, 실패(정책 미충족)면 규칙 칩으로 사유 표시.
- PUT
/api/cm/me/password— 본인 현재/새 비밀번호 변경 제출 - GET
/api/cm/settings/{category}— 현재 비밀번호 정책값 조회, 실시간 규칙 칩(⦿ 항목) 표시 기준 - GET
/api/auth/public-key— IF-CM-AUTH-004 RSA 공개키 발급, 현재/새 비밀번호 암호화 전송에 필요. AuthController.kt:72 구현됨(springdoc 자동 노출)
좌측 목록 + 우측 상세 패널(행 클릭 → URL /admin/users/:id 갱신) · R12-C 7종 ROLE 모델 · 부서 자유텍스트(선택, 최대 64자) · 정지 사용자 휴지통 토글 (권한: ROLE_ADMIN · FR-CM-002/004)
진입 — 사이드바 > 시스템관리 > 사용자 관리
- 검색 — 이름·아이디 부분일치 검색, 목록 조회 파라미터로 전달.
- + 사용자 — 신규 사용자 등록(빈 상세 패널 오픈).
- 사용자 목록 — 행 클릭 시 우측 상세 패널이 로드되고 URL이
/admin/users/:id로 갱신된다. - 정지된 사용자 포함 — 기본은 활성 사용자만 노출. 체크 시 status=SUSPENDED(휴지통) 대상도 목록에 포함.
- 상세 패널 기본정보 — 이름·이메일·연락처·소속팀(권한 결정 조직 단위)·부서(자유텍스트, 선택, 최대 64자) 편집. 아이디는 수정 불가. 이메일은 여기서 선택이며 비우고 저장하면 지운다(3-상태) — 등록 모달의 필수와 규칙이 다르다.
- 권한 설정 — R12-C 7종 ROLE 모델([변경 ROLE]로 수정). 자기 자신의 ROLE 변경은 403 차단.
- 비번 초기화 — 임시 비밀번호 발급 후 메일 발송.
- 삭제 — status=WITHDRAWN 전환(soft delete). 재활성화는 ROLE_ADMIN 전용.
- 사용자 등록 모달 — [+ 사용자] 클릭 시 아이디·이름·이메일·부서(선택)·소속팀·역할을 입력해 신규 계정을 생성. 여기서 이메일은 필수다 — 빈 칸으로는 등록할 수 없다.
- GET
/api/cm/users— 사용자 목록 조회(이름/아이디 검색, 정지 사용자 포함 토글 파라미터) - POST
/api/cm/users— '+ 사용자' 등록 - GET
/api/cm/users/{id}— 행 클릭 시 우측 상세 패널 로드 - PUT
/api/cm/users/{id}— 기본 정보(이름·이메일·연락처·소속팀·부서) 저장 - PATCH
/api/cm/users/{id}/role— '변경 ROLE' 권한 설정 변경 - POST
/api/cm/users/{id}/reset-password— '비번 초기화' 임시 비밀번호 발급/메일 발송 - PATCH
/api/cm/users/{id}/active— '삭제' 버튼, status=WITHDRAWN 전환(soft), 재활성화 시 역전환
| 이름 | 아이디 | 역할 | 소속팀 | 상태 | 최종로그인 |
|---|---|---|---|---|---|
| 김진호 | jinho.k | admin | 개발팀 | JOINED | 2026-04-28 09:15 |
| 김수연 | suyeon.k | admin | 개발팀 | JOINED | 2026-04-27 18:02 |
| 유미숙 | misuk.y | admin | 유니크 | JOINED | - |
9사용자 등록
×그룹 목록 · 행 좌측 ▼/▶ 펼침 시 소속 인원 목록 · 멤버 다중선택 batch 추가 · 활성/비활성 토글(soft disable — 회색조+(비활성) 배지, 신규 배정 차단·기존 멤버 유지) · 삭제는 멤버 0일 때만 (권한: ROLE_ADMIN)
진입 — 사이드바 > 시스템관리 > 그룹 관리
- + 그룹 추가 — 신규 그룹(팀) 생성.
- 그룹 목록 — 좌측 ▼/▶ 클릭으로 펼침/접힘 토글, 그룹명·소속 인원·기본 역할·생성일 표시.
- 펼침 영역 — 선택 그룹의 소속 인원 목록과 그룹 액션(추가/토글/수정/삭제)이 노출.
- + 멤버 추가 — 다중선택+검색으로 여러 사용자를 일괄(batch) 추가.
- 활성/비활성 토글 — soft disable. 비활성 시 회색조+(비활성) 배지 노출, 신규 배정만 차단하고 기존 멤버·역할은 유지.
- 그룹 수정/삭제 — 수정은 그룹명·기본역할 변경, 삭제는 소속 인원이 0명일 때만 허용(hard delete).
- 비활성 전환 안내 callout — 활성/비활성 토글 조작 시 노출되는 운영자 안내(신규 배정 차단·기존 멤버 유지·재활성 가능).
- 그룹 추가/수정 모달 — 그룹명·기본 역할 입력 + 소속 인원 다중선택(체크박스 목록+검색+일괄 추가)으로 멤버 구성. [+ 그룹 추가]는 신규 생성, [그룹 수정]은 동일 UI에 기존 값을 채워 진입.
- GET
/api/cm/groups— 그룹 목록 조회 - POST
/api/cm/groups— '+ 그룹 추가' - GET
/api/cm/groups/{groupCode}/members— 행 펼침(▼) 시 소속 인원 목록 조회 - POST
/api/cm/groups/{groupCode}/members— '+ 멤버 추가' 다중선택 일괄(batch) 추가 - PUT
/api/cm/groups/{groupCode}— '그룹 수정' 저장 및 활성/비활성 토글(active) 반영 - DELETE
/api/cm/groups/{groupCode}— '그룹 삭제' — 멤버 0명일 때만
| 그룹명 | 소속 인원 | 기본 역할 | 생성일 | |
|---|---|---|---|---|
| ▼ | 개발팀 | 8명 | ROLE_PM_VIEWER | 2026.03.23 |
| ▶ | 유니크 | 2명 | ROLE_PM_VIEWER | 2026.03.23 |
| ▶ | MES팀 | 2명 | ROLE_MES_READER | 2026.03.23 |
| ▶ | 관리자 | 1명 | ROLE_ADMIN | 2026.03.23 |
김진호(BE), 이율희(BE), 김수연(FE), …
비활성 전환 = soft disable(신규 admin 배정 차단 + 목록 회색조·(비활성) 배지, 기존 멤버·역할 유지) · 삭제 = 멤버 0일 때만 hard delete
8그룹 추가 / 수정
×전사 코드 카탈로그(CODE_CATALOG) 관리 · 좌 그룹 트리 + 우 코드 목록 · SCR-PM-010 4계층 분류·SCR-PM-011 modelCode 세그먼트 값 공급 · 사용 중 코드 삭제 차단(RESTRICT) (권한: ROLE_ADMIN · FR-CM-004)
진입 — 사이드바 > 시스템관리 > 코드 관리
- 코드 그룹 트리 — 자재/제품/공정 관련 3계층 그룹(UNIT·L1_FORM·PRC_TYPE 등)을 좌측에서 선택하면 우측 코드 목록이 갱신된다.
- + 코드 그룹 추가 — 신규 코드 그룹 생성.
- 선택 그룹 코드 목록 — 현재 선택 그룹(예: UNIT)의 코드값 목록. 이 값이 SCR-PM-010 4계층 분류 필터와 SCR-PM-011 modelCode 세그먼트 드롭다운의 공급원.
- + 코드 추가 — 선택 그룹에 신규 코드값 등록.
- 정렬 컬럼 — 드래그 또는 값 직접 수정으로 노출 순서 변경. 사용 중인 코드는 삭제가 차단(RESTRICT)된다.
- 코드 그룹 추가 모달 — 그룹 ID·그룹명을 입력해 신규 코드 그룹 생성.
- 코드 추가 모달 — 코드값·명칭·정렬·활성 여부를 입력해 선택 그룹에 신규 코드값 등록.
- 사용 처 보기 팝오버 — 코드 행 클릭 시 참조 중인 화면 목록을 팝오버로 표시. 참조가 있으면 삭제(RESTRICT) 차단.
- GET
/api/cm/codes/categories— 좌측 코드 그룹 트리 조회 - POST
/api/cm/codes/categories— '+ 코드 그룹 추가' - GET
/api/cm/codes— 선택 그룹(UNIT)의 코드 목록 조회 - POST
/api/cm/codes— '+ 코드 추가' - PATCH
/api/cm/codes/reorder— 정렬 컬럼 드래그/직접 수정 반영 - PUT
/api/cm/codes/{codeId}— 코드 행 수정 - DELETE
/api/cm/codes/{codeId}— 코드 삭제(사용 중이면 RESTRICT 차단) - GET
/api/cm/codes/{codeId}/usage— IF-CM-COD-001 코드 사용처 조회, '사용 처 보기'(어느 화면·제품/자재/공정이 이 코드를 참조 중인지) 및 삭제 RESTRICT 판단(deletable 필드) 근거. CodeController.kt:146 구현됨(springdoc 자동 노출)
| 코드 | 명칭 | 5정렬 |
|---|---|---|
| EA | 개 | 1 |
| m | 미터 | 2 |
| kg | 킬로그램 | 3 |
| SET | 세트 | 4 |
| ml | 밀리리터 | 5 |
코드 행 클릭 → 사용처 보기(제품·자재·공정 참조) · 정렬은 드래그 또는 정렬 컬럼 직접 수정 · 사용 중 코드 삭제 차단(RESTRICT)
6코드 그룹 추가
×7코드 추가
×8사용 처 보기 (코드 'EA')
×참조 중인 화면이 있으면 삭제 시 RESTRICT 차단
비밀번호 정책·계정 잠금·세션·알림·파일 전역 설정 · 카테고리별 접기/펼치기 패널 · [기본값 복원]=클라이언트 상수(서버 미호출) · 변경 사유 선택 입력(이력 90일 보관) (권한: ROLE_ADMIN · FR-CM-004)
진입 — 사이드바 > 시스템관리 > 시스템 설정
- 카테고리 아코디언 — 비밀번호 정책·계정 잠금·세션·알림·파일 5개 카테고리를 접고 펼치며 관리(본 예시는 비밀번호 정책만 펼침).
- 비밀번호 정책(펼침 예시) — 최소 길이·복잡도 조합·만료 주기·재사용 제한을 편집. SCR-CM-002 규칙 칩(⦿)의 값 원천.
- 기본값 복원 — 서버 호출 없이 클라이언트 상수(seedDefault)로 폼 값만 되돌린다.
- 접힘 카테고리(계정 잠금·세션·알림·파일) — 헤더에 현재값 요약이 함께 노출, 클릭 시 비밀번호 정책과 동일하게 펼쳐진다.
- 변경 사유 — 선택 입력(최대 200자). 저장 시 changeReason 으로 함께 전송, 이력은 90일 보관.
- 저장 버튼 — 실제 저장 트리거. PUT /api/cm/settings/{category} 로 변경값+사유 반영.
- [이력] 링크 — 설정 항목 우측 [이력]에서 변경자·시각·이전값·새값·변경 사유를 90일간 조회(R-CHANGE-REASON-UI). 본 예시는 비밀번호 정책 4개 항목에 표기, 다른 카테고리를 펼쳐도 동일 패턴 적용.
- GET
/api/cm/settings— 카테고리별 현재 설정값 목록 조회 - GET
/api/cm/settings/{category}— 펼친 카테고리(예: 비밀번호 정책)의 상세 값 조회 - PUT
/api/cm/settings/{category}— '저장' 변경값 + changeReason 반영 - GET
/api/cm/settings/history— 설정 항목 [이력] 링크 클릭 시 변경자·시각·이전값·새값·사유 조회
[기본값 복원] = FE 클라이언트 상수(seedDefault)로 폼값만 되돌림(서버 미호출) · 실제 저장은 [저장] → PUT /api/cm/settings/{category}
?token= 진입 시 mount 직후 IF-CM-AUTH-008-1 로 토큰 사전 검증 → 유효(200)면 새 비밀번호 폼(FORM) 노출 · 10자 이상·3종 조합 · RSA 암호화 후 IF-CM-AUTH-008 제출 (권한: 비로그인 · FR-CM-001)
진입 — 이메일 재설정 링크(?token= 포함) / SCR-CM-001 [비밀번호를 잊으셨나요?] 링크(토큰 없음)
- 타이틀/안내 — "새로 사용할 비밀번호를 입력하세요" 안내문. 이 폼은 mount 직후 토큰 검증(IF-CM-AUTH-008-1)이 200(유효)일 때만 노출된다(FORM 상태).
- 새 비밀번호 — 필수, 10자 이상 3종 조합. SCR-CM-002 와 동일 규칙, RSA 암호화 전송. 이 두 수치는 붙박이가 아니라 IF-CM-AUTH-010 으로 받아 온다(운영자가 설정을 바꾸면 화면 검증도 따라 바뀐다. 10자·3종은 시드 기본값).
- 비밀번호 확인 — 필수, 새 비밀번호와 일치해야 제출 가능.
- 비밀번호 변경 버튼 — IF-CM-AUTH-008 로 제출, 성공 시 SCR-CM-001 로그인 화면으로 이동.
- 로그인으로 돌아가기 — 재설정을 취소하고 SCR-CM-001 로 이동.
- REQUEST 상태 — 토큰 없이 진입 시 이메일 입력 폼. 제출하면 IF-CM-AUTH-007 로 재설정 링크 발송(SENT).
- VALIDATING 상태 — ?token= 진입 직후 IF-CM-AUTH-008-1 검증 로딩. 결과에 따라 FORM 또는 에러 4종으로 분기.
- DONE 상태 — 새 비밀번호 제출 성공 후 완료 안내, SCR-CM-001 로그인 화면으로 이동.
- POST
/api/auth/password-reset-confirm— IF-CM-AUTH-008, 새 비밀번호 제출(RSA 암호화) - GET
/api/auth/password-reset-validate— IF-CM-AUTH-008-1 재설정 토큰 사전 검증, mount 직후 토큰 검증(유효/만료/사용됨/조작됨 판별)이 화면 진입의 필수 전제. 토큰 미소비(조회 전용), AuthController.kt:193 구현됨(springdoc 자동 노출) - GET
/api/auth/public-key— IF-CM-AUTH-004 RSA 공개키, 새 비밀번호 암호화 전송에 필요. AuthController.kt:72 구현됨(springdoc 자동 노출) - GET
/api/auth/password-policy— IF-CM-AUTH-010 비밀번호 정책 조회(비인증). 최소 길이·최소 조합 수 2값을 돌려준다. 화면이 10자·3종을 붙박이로 두지 않고 이 값으로 검증한다. #726 BE 구현 완료(d527097), FE 배선은 #759
새로 사용할 비밀번호를 입력하세요.
토큰 없이 진입(REQUEST)하면 이메일 입력 → IF-CM-AUTH-007 발송(SENT) · 성공(DONE) 시 SCR-CM-001 로그인 화면으로 이동
6REQUEST
토큰 없이 진입 — 이메일 입력 폼
7VALIDATING
?token= 진입 · mount 직후 IF-CM-AUTH-008-1 검증 중…(로딩)
8DONE
비밀번호 변경 완료 안내 후 SCR-CM-001 로그인 화면으로 자동 이동
토큰이 유효하지 않으면 비밀번호 입력 폼 대신 사유 안내 + 복구 동선만 노출 · 에러 4종(INVALID / USED / EXPIRED / NETWORK) · 최종 검증은 confirm(IF-CM-AUTH-008)이 독립 수행 (권한: 비로그인)
진입 — 이메일 재설정 링크(?token= 포함) / SCR-CM-001 [비밀번호를 잊으셨나요?] 링크(토큰 없음) 진입 후 IF-CM-AUTH-008-1 토큰 검증 실패 시 자동 전환
- 에러 타이틀 — 에러 종류에 따라 바뀌는 헤딩(본 예시는 "링크 만료").
- 안내 알림 — 사유를 설명하는 경고 배너. "이행할 수 없는 폼"을 보여주지 않기 위한 방어적 UX.
- 재설정 링크 다시 요청 — 이메일 재입력 화면(REQUEST 상태)으로 이동해 IF-CM-AUTH-007 재발송.
- 로그인으로 돌아가기 — SCR-CM-001 로그인 화면으로 이동.
- 에러 4종 안내 — INVALID/USED/EXPIRED/NETWORK 문구 예시 모음. 복구 버튼 라벨은 INVALID/USED/EXPIRED 는 "재설정 링크 다시 요청", NETWORK 만 "다시 시도"로 다르다. 최종 판별은 confirm(IF-CM-AUTH-008)이 독립적으로 재수행(defense in depth).
- POST
/api/auth/password-reset-request— '재설정 링크 다시 요청' 이메일 재입력 후 재발송 - GET
/api/auth/password-reset-validate— IF-CM-AUTH-008-1 재설정 토큰 사전 검증, 이 화면의 에러 상태(INVALID/USED/EXPIRED/NETWORK)를 결정하는 응답 소스. AuthController.kt:193 구현됨(springdoc 자동 노출)
사이드바 좌하단 사용자 메뉴 진입 · [내 정보]·[비밀번호] 탭 허브 · 본인 프로필(이름·연락처·이메일) 셀프서비스 수정 · 로그인 아이디·권한·상태·부서는 읽기 전용(운영자만 변경) · [비밀번호] 탭 = SCR-CM-002 (권한: 로그인 사용자)
- 탭 [내 정보]·[비밀번호] — 같은 /settings 허브. 기본 탭 [내 정보](/settings/profile), [비밀번호] 탭은 SCR-CM-002(/settings/password) 를 그대로 품는다.
- 로그인 아이디 — 읽기 전용. 불변 식별자라 변경 불가.
- 이름 — 필수. 1~64자. 저장 성공 시 사이드바 좌하단 사용자명도 갱신.
- 연락처·이메일 — 선택. 이메일은 전역 UNIQUE — 다른 계정이 쓰는 값이면 409 EMAIL_DUPLICATE Toast 오류 (액션 실패 — §00 §4.5 R-ERR-ACTION-TOAST).
- 권한·상태·부서 — 읽기 전용 표시. 값 변경은 운영자(SCR-CM-003)만.
- 저장 버튼 — 제출. 세션 유지(강제 재로그인 없음). 편집 중 탭 전환·이탈 시 미저장 변경 가드.
- GET
/api/cm/me— IF-CM-AUTH-006 본인 정보 조회, 진입 시 폼 채움 - PUT
/api/cm/me— IF-CM-AUTH-009 본인 프로필(name·mobile·email) 수정 제출 (신설 · BE 미구현) - TAB
/api/cm/me/password— [비밀번호] 탭 = SCR-CM-002 (IF-CM-AUTH-005)
권한·상태·부서는 운영자(SCR-CM-003)만 변경. 이 화면에서는 표시만 한다.