장기 미사용 계정 현황 화면명에 "관리자" 명시 + 행별 조치 버튼 축소

미사용계정 현황(#11, 메뉴 9100037)이 대상이 개인정보취급자(EMP) 계정임을
화면·메뉴명에서 알 수 없어 오해 소지가 있었다. "장기 미사용 계정" →
"장기 미사용 관리자 계정"으로 명시(요약표/목록 캡션, 메뉴명, 프로그램 설명).
이미 배포된 환경을 위해 재실행 안전한 UPDATE 문을 DML에 추가.

목록 행별 "말소"/"잠금" 버튼은 시각적으로 과도하게 커서 축소(.btn3.mini).
상단 "선택 말소" 일괄 버튼은 그대로 둠.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
infraurp 2026-08-10 16:59:37 +09:00
parent 4413c5aaea
commit 363138eef5
3 changed files with 62 additions and 12 deletions

View File

@ -113,6 +113,7 @@ function fn_rowAction(accountId, ty) {
.btn_zone .cnt { font-size:13px; } .btn_zone .cnt { font-size:13px; }
.btn3 { display:inline-block; padding:3px 10px; border:1px solid #888; background:#f5f5f5; font-size:12px; color:#333; text-decoration:none; } .btn3 { display:inline-block; padding:3px 10px; border:1px solid #888; background:#f5f5f5; font-size:12px; color:#333; text-decoration:none; }
.btn3.red { border-color:#c25b5b; color:#c25b5b; } .btn3.red { border-color:#c25b5b; color:#c25b5b; }
.btn3.mini { padding:1px 6px; font-size:11px; }
.guide { margin:10px 0; padding:10px 12px; border:1px solid #e5d9a8; background:#fdfaef; font-size:12px; line-height:1.7; } .guide { margin:10px 0; padding:10px 12px; border:1px solid #e5d9a8; background:#fdfaef; font-size:12px; line-height:1.7; }
.msg { margin:10px 0; padding:10px 12px; border:1px solid #9ec2e8; background:#f2f8fd; font-size:12px; color:#20509e; } .msg { margin:10px 0; padding:10px 12px; border:1px solid #9ec2e8; background:#f2f8fd; font-size:12px; color:#20509e; }
</style> </style>
@ -136,8 +137,8 @@ function fn_rowAction(accountId, ty) {
</c:if> </c:if>
<!-- 요약 --> <!-- 요약 -->
<table class="sum_wrap" summary="장기 미사용 계정 요약"> <table class="sum_wrap" summary="장기 미사용 관리자 계정 요약">
<caption style="display:none;">장기 미사용 계정 요약</caption> <caption style="display:none;">장기 미사용 관리자 계정 요약</caption>
<tbody> <tbody>
<tr> <tr>
<td> <td>
@ -218,8 +219,8 @@ function fn_rowAction(accountId, ty) {
<a href="javascript:fn_action('D');" class="btn3 red">선택 말소</a> <a href="javascript:fn_action('D');" class="btn3 red">선택 말소</a>
</div> </div>
<table summary="장기 미사용 계정 현황 목록" class="list1"> <table summary="장기 미사용 관리자 계정 현황 목록" class="list1">
<caption>장기 미사용 계정 현황 목록</caption> <caption>장기 미사용 관리자 계정 현황 목록</caption>
<colgroup> <colgroup>
<col width="4%" /> <col width="4%" />
<col width="12%" /> <col width="12%" />
@ -279,10 +280,10 @@ function fn_rowAction(accountId, ty) {
<td> <td>
<c:choose> <c:choose>
<c:when test="${result.acntState == 'L'}"> <c:when test="${result.acntState == 'L'}">
<a href="#none" class="btn3 red" onclick="fn_rowAction('<c:out value="${result.accountId}"/>', 'D'); return false;">말소</a> <a href="#none" class="btn3 red mini" onclick="fn_rowAction('<c:out value="${result.accountId}"/>', 'D'); return false;">말소</a>
</c:when> </c:when>
<c:when test="${result.acntState == 'W'}"> <c:when test="${result.acntState == 'W'}">
<a href="#none" class="btn3" onclick="fn_rowAction('<c:out value="${result.accountId}"/>', 'L'); return false;">잠금</a> <a href="#none" class="btn3 mini" onclick="fn_rowAction('<c:out value="${result.accountId}"/>', 'L'); return false;">잠금</a>
</c:when> </c:when>
<c:otherwise><span class="nodata">-</span></c:otherwise> <c:otherwise><span class="nodata">-</span></c:otherwise>
</c:choose> </c:choose>

View File

@ -13,7 +13,7 @@
-- ├ 롤관리 (9100034, EgovRoleList) -- ├ 롤관리 (9100034, EgovRoleList)
-- ├ 권한 신청·승인 (9100035, AuthorRequestList) -- ├ 권한 신청·승인 (9100035, AuthorRequestList)
-- ├ 권한변경 이력조회 (9100036, AuthorHistoryList) -- ├ 권한변경 이력조회 (9100036, AuthorHistoryList)
-- └ 미사용계정 현황 (9100037, DormantStatusList) ← 신규 -- └ 미사용 관리자 계정 현황 (9100037, DormantStatusList) ← 신규
-- --
-- [노출권한] IS_AUTHENTICATED_FULLY, ROLE_ADMIN (형제 메뉴들과 동일) -- [노출권한] IS_AUTHENTICATED_FULLY, ROLE_ADMIN (형제 메뉴들과 동일)
-- --
@ -34,8 +34,8 @@
-- [1] 프로그램(URL) 등록 ※ 메뉴보다 먼저(FK: COMTNMENUINFO.PROGRM_FILE_NM → COMTNPROGRMLIST) -- [1] 프로그램(URL) 등록 ※ 메뉴보다 먼저(FK: COMTNMENUINFO.PROGRM_FILE_NM → COMTNPROGRMLIST)
-- ───────────────────────────────────────────────────────────── -- ─────────────────────────────────────────────────────────────
INSERT INTO COMTNPROGRMLIST (PROGRM_FILE_NM, PROGRM_STRE_PATH, PROGRM_KOREAN_NM, PROGRM_DC, URL) INSERT INTO COMTNPROGRMLIST (PROGRM_FILE_NM, PROGRM_STRE_PATH, PROGRM_KOREAN_NM, PROGRM_DC, URL)
SELECT 'DormantStatusList', '/mnt/sec/dormantStatus/', '장기 미사용계정 현황', SELECT 'DormantStatusList', '/mnt/sec/dormantStatus/', '장기 미사용 관리자 계정 현황',
'장기 미사용 계정 현황 조회(SFR-002 #11)', '/mnt/sec/dormantStatus/listView.do?page=9100037' '장기 미사용 관리자 계정 현황 조회(SFR-002 #11)', '/mnt/sec/dormantStatus/listView.do?page=9100037'
FROM DUAL FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM COMTNPROGRMLIST WHERE PROGRM_FILE_NM = 'DormantStatusList'); WHERE NOT EXISTS (SELECT 1 FROM COMTNPROGRMLIST WHERE PROGRM_FILE_NM = 'DormantStatusList');
@ -43,10 +43,27 @@ SELECT 'DormantStatusList', '/mnt/sec/dormantStatus/', '장기 미사용계정
-- [2] 메뉴 등록 : 권한관리(9100030) 하위, 권한변경 이력조회(ord 6) 다음(ord 7) -- [2] 메뉴 등록 : 권한관리(9100030) 하위, 권한변경 이력조회(ord 6) 다음(ord 7)
-- ───────────────────────────────────────────────────────────── -- ─────────────────────────────────────────────────────────────
INSERT INTO COMTNMENUINFO (MENU_NM, PROGRM_FILE_NM, MENU_NO, UPPER_MENU_NO, MENU_ORDR, MENU_DC, RELATE_IMAGE_PATH, RELATE_IMAGE_NM) INSERT INTO COMTNMENUINFO (MENU_NM, PROGRM_FILE_NM, MENU_NO, UPPER_MENU_NO, MENU_ORDR, MENU_DC, RELATE_IMAGE_PATH, RELATE_IMAGE_NM)
SELECT '미사용계정 현황', 'DormantStatusList', 9100037, 9100030, 7, '장기 미사용 계정 현황 조회', '/', '/' SELECT '미사용 관리자 계정 현황', 'DormantStatusList', 9100037, 9100030, 7, '장기 미사용 관리자 계정 현황 조회', '/', '/'
FROM DUAL FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM COMTNMENUINFO WHERE MENU_NO = 9100037); WHERE NOT EXISTS (SELECT 1 FROM COMTNMENUINFO WHERE MENU_NO = 9100037);
-- ─────────────────────────────────────────────────────────────
-- [2-1] 명칭 정정(2026-08-10, 재실행 안전) : 관리자(EMP) 전용 화면임을 메뉴명에 명시
-- — 이미 9100037 이 위 INSERT 로 적재된 환경(로컬 등)은 NOT EXISTS 가드 때문에
-- INSERT 값이 반영되지 않으므로 이 UPDATE 가 실제 적용 지점이다. UPDATE 는
-- 값이 이미 같아도 재실행 무해(멱등).
-- — 한글 리터럴은 mysql.exe(git-bash) 로 직접 실행 시 이중 인코딩 위험이 있다.
-- 적용 시 UNHEX 우회를 권장한다(hex 값은 아래 파이썬으로 생성):
-- python3 -c "print('미사용 관리자 계정 현황'.encode('utf-8').hex().upper())"
-- python3 -c "print('장기 미사용 관리자 계정 현황 조회'.encode('utf-8').hex().upper())"
-- ─────────────────────────────────────────────────────────────
UPDATE COMTNMENUINFO SET MENU_NM = '미사용 관리자 계정 현황' WHERE MENU_NO = 9100037;
UPDATE COMTNPROGRMLIST SET PROGRM_KOREAN_NM = '장기 미사용 관리자 계정 현황',
PROGRM_DC = '장기 미사용 관리자 계정 현황 조회(SFR-002 #11)'
WHERE PROGRM_FILE_NM = 'DormantStatusList';
-- [적용 후 검증] SELECT MENU_NM FROM COMTNMENUINFO WHERE MENU_NO=9100037;
-- SELECT HEX(MENU_NM) FROM COMTNMENUINFO WHERE MENU_NO=9100037; -- EA/EB/EC/ED 로 시작해야 정상
-- ───────────────────────────────────────────────────────────── -- ─────────────────────────────────────────────────────────────
-- [3] 권한↔메뉴 노출 매핑 (형제 메뉴들과 동일한 2개 권한) -- [3] 권한↔메뉴 노출 매핑 (형제 메뉴들과 동일한 2개 권한)
-- ───────────────────────────────────────────────────────────── -- ─────────────────────────────────────────────────────────────

View File

@ -886,6 +886,29 @@ CREATE TABLE IF NOT EXISTS ACCOUNT_ACTION_HISTORY (
COMMENT='장기 미사용 계정 조치(잠금/말소) 이력(개인정보보호 SFR-002 #11)'; COMMENT='장기 미사용 계정 조치(잠금/말소) 이력(개인정보보호 SFR-002 #11)';
-- ─────────────────────────────────────────────────────────────
-- [privacy.login_lock_exempt_create_mysql.sql]
-- ─────────────────────────────────────────────────────────────
-- =====================================================================
-- 로그인 실패 계정잠금 예외 : LOGIN_LOCK_EXEMPT (화이트리스트, SER-001 24)
-- ---------------------------------------------------------------------
-- 인증 실패 5회 잠금은 userSe 구분 없이 전 계정에 적용되고, 잠금 해제 화면도
-- 관리자 로그인이 있어야 들어갈 수 있어 최고관리자가 잠기면 아무도 해제할 수 없다.
-- 이 테이블은 그 break-glass 통로다. 잠금 '판정'만 면제하며, 실패 이력(LOGIN_HISTORY)
-- 적재와 2차 인증(OTP)은 예외 계정에도 그대로 적용된다.
-- 시드 없음 — 예외 대상 ID는 관리자 화면(접근통제 정책)에서 운영팀이 직접 등록한다.
-- =====================================================================
CREATE TABLE IF NOT EXISTS LOGIN_LOCK_EXEMPT (
EXEMPT_ID VARCHAR(20) NOT NULL COMMENT '잠금 예외 대상 계정ID(COMTNEMPLYRINFO.EMPLYR_ID)',
EXEMPT_RESN VARCHAR(500) NOT NULL COMMENT '예외 등록 사유(필수 - 감사 대응)',
REG_ID VARCHAR(20) NULL COMMENT '등록한 관리자 계정ID',
REG_DT DATETIME NULL COMMENT '등록일시',
PRIMARY KEY (EXEMPT_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
COMMENT='로그인 실패 계정잠금 예외 계정(개인정보보호 SER-001 24, 최고관리자 잠김 방지)';
-- ===================================================================== -- =====================================================================
-- PART 2. DML (기준/시드 데이터) ※ 멱등: NOT EXISTS 가드로 중복 적재 방지 -- PART 2. DML (기준/시드 데이터) ※ 멱등: NOT EXISTS 가드로 중복 적재 방지
-- 수록: PDAL_JOB_MAPPING(업무유형 매핑 13행), ACCOUNT_MNG_POLICY(기본정책 1행) -- 수록: PDAL_JOB_MAPPING(업무유형 매핑 13행), ACCOUNT_MNG_POLICY(기본정책 1행)
@ -976,7 +999,7 @@ INSERT INTO COMTNPROGRMLIST (PROGRM_FILE_NM, PROGRM_STRE_PATH, PROGRM_KOREAN_NM,
SELECT * FROM ( SELECT * FROM (
SELECT 'AuthorRequestList' AS PROGRM_FILE_NM, '/mnt/sec/authorRequest/' AS PROGRM_STRE_PATH, '개인정보취급자 권한 관리' AS PROGRM_KOREAN_NM, '개인정보취급자 권한 관리(SFR-001 #46)' AS PROGRM_DC, '/mnt/sec/authorRequest/listView.do?page=9100035' AS URL UNION ALL SELECT 'AuthorRequestList' AS PROGRM_FILE_NM, '/mnt/sec/authorRequest/' AS PROGRM_STRE_PATH, '개인정보취급자 권한 관리' AS PROGRM_KOREAN_NM, '개인정보취급자 권한 관리(SFR-001 #46)' AS PROGRM_DC, '/mnt/sec/authorRequest/listView.do?page=9100035' AS URL UNION ALL
SELECT 'AuthorHistoryList', '/mnt/sec/authorHistory/', '권한변경 이력조회', '권한변경 이력조회·검색·다운로드(SFR-001 #6)', '/mnt/sec/authorHistory/listView.do?page=9100036' UNION ALL SELECT 'AuthorHistoryList', '/mnt/sec/authorHistory/', '권한변경 이력조회', '권한변경 이력조회·검색·다운로드(SFR-001 #6)', '/mnt/sec/authorHistory/listView.do?page=9100036' UNION ALL
SELECT 'DormantStatusList', '/mnt/sec/dormantStatus/', '장기 미사용계정 현황', '장기 미사용 계정 현황 조회(SFR-002 #11)', '/mnt/sec/dormantStatus/listView.do?page=9100037' UNION ALL SELECT 'DormantStatusList', '/mnt/sec/dormantStatus/', '장기 미사용 관리자 계정 현황', '장기 미사용 관리자 계정 현황 조회(SFR-002 #11)', '/mnt/sec/dormantStatus/listView.do?page=9100037' UNION ALL
SELECT 'AccountPolicySet', '/mnt/sec/accountPolicy/', '계정 관리 정책 설정', '장기 미사용 계정 관리 정책 설정(SFR-002 #13)', '/mnt/sec/accountPolicy/policyView.do?page=9100038' SELECT 'AccountPolicySet', '/mnt/sec/accountPolicy/', '계정 관리 정책 설정', '장기 미사용 계정 관리 정책 설정(SFR-002 #13)', '/mnt/sec/accountPolicy/policyView.do?page=9100038'
) seed ) seed
WHERE NOT EXISTS (SELECT 1 FROM COMTNPROGRMLIST p WHERE p.PROGRM_FILE_NM = seed.PROGRM_FILE_NM); WHERE NOT EXISTS (SELECT 1 FROM COMTNPROGRMLIST p WHERE p.PROGRM_FILE_NM = seed.PROGRM_FILE_NM);
@ -986,11 +1009,20 @@ INSERT INTO COMTNMENUINFO (MENU_NM, PROGRM_FILE_NM, MENU_NO, UPPER_MENU_NO, MENU
SELECT * FROM ( SELECT * FROM (
SELECT '개인정보취급자 권한 관리' AS MENU_NM, 'AuthorRequestList' AS PROGRM_FILE_NM, 9100035 AS MENU_NO, 9100030 AS UPPER_MENU_NO, 5 AS MENU_ORDR, '개인정보취급자 권한 부여·변경·말소 현황 및 승인 처리' AS MENU_DC, '/' AS RELATE_IMAGE_PATH, '/' AS RELATE_IMAGE_NM UNION ALL SELECT '개인정보취급자 권한 관리' AS MENU_NM, 'AuthorRequestList' AS PROGRM_FILE_NM, 9100035 AS MENU_NO, 9100030 AS UPPER_MENU_NO, 5 AS MENU_ORDR, '개인정보취급자 권한 부여·변경·말소 현황 및 승인 처리' AS MENU_DC, '/' AS RELATE_IMAGE_PATH, '/' AS RELATE_IMAGE_NM UNION ALL
SELECT '권한변경 이력조회', 'AuthorHistoryList', 9100036, 9100030, 6, '권한변경 이력조회·검색·다운로드', '/', '/' UNION ALL SELECT '권한변경 이력조회', 'AuthorHistoryList', 9100036, 9100030, 6, '권한변경 이력조회·검색·다운로드', '/', '/' UNION ALL
SELECT '미사용계정 현황', 'DormantStatusList', 9100037, 9100030, 7, '장기 미사용 계정 현황 조회', '/', '/' UNION ALL SELECT '미사용 관리자 계정 현황', 'DormantStatusList', 9100037, 9100030, 7, '장기 미사용 관리자 계정 현황 조회', '/', '/' UNION ALL
SELECT '계정 관리 정책', 'AccountPolicySet', 9100038, 9100030, 8, '장기 미사용 계정 관리 정책 설정', '/', '/' SELECT '계정 관리 정책', 'AccountPolicySet', 9100038, 9100030, 8, '장기 미사용 계정 관리 정책 설정', '/', '/'
) seed ) seed
WHERE NOT EXISTS (SELECT 1 FROM COMTNMENUINFO m WHERE m.MENU_NO = seed.MENU_NO); WHERE NOT EXISTS (SELECT 1 FROM COMTNMENUINFO m WHERE m.MENU_NO = seed.MENU_NO);
-- ── [2-1] 명칭 정정(2026-08-10, 재실행 안전/멱등) — 9100037 이 관리자(EMP) 전용 화면임을 명시.
-- 이미 9100037 이 위 INSERT 로 적재된 환경은 NOT EXISTS 가드 때문에 INSERT 값이
-- 반영되지 않으므로 이 UPDATE 가 실제 적용 지점이다. 한글 리터럴은 UNHEX 우회 권장
-- (python3 -c "print('미사용 관리자 계정 현황'.encode('utf-8').hex().upper())").
UPDATE COMTNMENUINFO SET MENU_NM = '미사용 관리자 계정 현황' WHERE MENU_NO = 9100037;
UPDATE COMTNPROGRMLIST SET PROGRM_KOREAN_NM = '장기 미사용 관리자 계정 현황',
PROGRM_DC = '장기 미사용 관리자 계정 현황 조회(SFR-002 #11)'
WHERE PROGRM_FILE_NM = 'DormantStatusList';
-- ── [3] 권한↔메뉴 노출 매핑 (4건 × 2권한, FK 안전) ── -- ── [3] 권한↔메뉴 노출 매핑 (4건 × 2권한, FK 안전) ──
INSERT INTO COMTNMENUCREATDTLS (MENU_NO, AUTHOR_CODE) INSERT INTO COMTNMENUCREATDTLS (MENU_NO, AUTHOR_CODE)
SELECT seed.menu_no, g.ac SELECT seed.menu_no, g.ac