권한관리(SFR-001): - getAuthorities() 구현(EgovUserAuthorityDAO), AuthorityInterceptor 역할별 URL 접근제어 (COMTNMENUCREATDTLS×COMTNMENUINFO×COMTNPROGRMLIST 메뉴권한 기반, 캐시/TTL, ROLE_ADMIN 바이패스) - 권한 신청·승인 워크플로 + AUTHOR_CHANGE_HISTORY 이력(3년 보관), 조회·다운로드 계정관리(SFR-002): 계정관리정책, 장기미사용(휴면) 확장(취급자 포함)·사전알림, 계정잠금 5회 인증체계(SFR-003): 로그인 통합 2단계 인증(SecondFactorInterceptor+SecondFactorController), OTP QR 등록(ZXing)·비밀키 DB 영속(OTP_DEVICE, AES-GCM), 세션재발급(고정공격 방지), 자동로그아웃 30분 접속기록(SFR-004): PERSONAL_DATA_ACCESS_LOG(월파티션), PersonalDataLogAspect 한정수집, SHA-256 해시체인 무결성, 업무유형매핑, IP 취득보정, 비정상접근 탐지, 정기점검 리포트 DB: privacy DDL 11종 + 설치용 통합 SQL(privacy.install_mysql.sql, DDL+시드 DML) 빌드복구: pom.xml 시스템 jar/JAXB 선언, iBatis2 SQL주석 '#'→'No.' 정정 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
349 lines
39 KiB
Markdown
349 lines
39 KiB
Markdown
# 문화품앗이 개인정보보호 기능개선 사업 — 개발 진행현황
|
||
|
||
> 발주기관: 한국문화원연합회 | 사업기간: 계약일~2026.12.18 | 대상: 문화품앗이(csv.culture.go.kr)
|
||
> 근거: 개인정보보호위원회 「고유식별정보 안전조치 관리실태 점검」 결과통보(2025.11.21.)
|
||
> 작성일: **2026-07-21** | 기준: `개인정보보호_개발항목.docx`(61개 개발항목) 대비 소스 실측
|
||
|
||
---
|
||
|
||
## 1. 종합 진행률 대시보드
|
||
|
||
| 단계 | 상태 | 비고 |
|
||
|------|:----:|------|
|
||
| 요구사항 분석·설계 | ✅ 완료 | 제안서 Ⅲ장 + 개발항목 61개 정리 + 디자인 브리프(10개 화면) |
|
||
| 자동화 하네스 구축 | ✅ 완료 | `arko-privacy-*` 에이전트 3종 + 스킬 4종 + 리뷰어 확장 |
|
||
| **코드 구현** | 🟡 **진행 (42 / 61, 69%)** | 2026-07-21 7파 각 6개 — 1~6차 36개 + 7차(#9·#10·#11·#13·#36·#44) — 아래 §1-1 |
|
||
| 시험·검증(Ⅲ-5) | ⬜ 대기 | 구현 후 진행 |
|
||
| 적용·안정화(Ⅲ-6) | ⬜ 대기 | 구현 후 진행 |
|
||
|
||
**개발항목 61개 코드 구현 기준 진행률: 42개 완료 (2026-07-21 당일, 7파 각 6개 — 69%)**
|
||
|
||
- 분석·설계 및 하네스는 완료되어 **바로 구현 단계 진입 가능**한 상태.
|
||
- 현재 워킹트리의 소스 변경(`EgovSpringSecurityLoginFilter.java`, `pom.xml`)은 **로컬 개발 IP 허용(127.0.0.1) 추가**로, 본 사업 산출물이 아님 — 진행률에서 제외.
|
||
|
||
---
|
||
|
||
## 1-1. 오늘의 작업 (2026-07-21, ~17:00 목표)
|
||
|
||
fork 3개를 병렬로 투입해 **자체 완결적·파일 충돌 없는 기반 항목 6개**를 당일 완료 목표로 착수한다.
|
||
(발주기관 확정 대기 #12·#19, 운영환경 실측 선행 #55~58, 대규모 화면 #45~54는 오늘 범위에서 제외.)
|
||
|
||
| Fork | 영역 | 대상 # | 산출물 | 상태 |
|
||
|:----:|------|:------:|--------|:----:|
|
||
| **A** | 권한관리 | #1 `getAuthorities()` 구현 | `EgovUserDetailsSessionServiceImpl` + 신규 sqlmap/DDL | ✅ 완료 |
|
||
| **A** | 권한관리 | #4 AUTHOR_CHANGE_HISTORY DDL 신설 | 신규 `.sql` DDL(3년 보관) | ✅ 완료 |
|
||
| **B** | 접속기록 | #30 PERSONAL_DATA_ACCESS_LOG DDL | 신규 `.sql`(무결성 컬럼+월 파티셔닝) | ✅ 완료 |
|
||
| **B** | 접속기록 | #39 SHA-256 해시체인 유틸 | 신규 util `.java`(HASH_VAL/PREV_HASH_VAL) | ✅ 완료 |
|
||
| **C** | 인증체계 | #17 AuthMethodService 인터페이스 설계 | 신규 인터페이스 + 3종 구현 스텁 | ✅ 완료 |
|
||
| **C** | 인증체계 | #27 비밀번호 해시 알고리즘 점검 | `EgovFileScrty.encryptPassword()` 점검노트 | ✅ 완료 |
|
||
|
||
> 파일 충돌 방지: Fork A만 `sql-map-config`/기존 ServiceImpl 수정, Fork B·C는 신규 파일만 생성. 진행현황 MD 기록은 오케스트레이터 단독 수행.
|
||
|
||
**착수 로그**
|
||
- 2026-07-21 착수: Fork A/B/C 병렬 투입, 대상 6개 항목 🟡 진행중 전환.
|
||
- 2026-07-21 **Fork C 완료** (#17, #27): 인증수단 인터페이스 4파일 + 비밀번호 해시 점검노트 생성. 실측 확인 후 ✅ 전환. 후속 발견: 무솔트·무반복 해시, 해시값 로그출력(#27 보완 권고), 인증수단 빈 등록(#21 후속).
|
||
- 2026-07-21 **Fork B 완료** (#30, #39): 접속기록 DDL(월 파티셔닝) + 해시체인 유틸(javac+실행 검증) 생성. 실측 확인 후 ✅ 전환. 후속 연계: 파티션 자동증설·730일 파기 배치(#37), 단일스레드 순차적재 전제(#33).
|
||
- 2026-07-21 **Fork A 완료** (#1, #4): #1 getAuthorities() 5계층 배선(ServiceImpl→DAO→sqlmap→config→빈주입) 완료·실측 정합 확인. Fork A가 #4 DDL 착수 직후 API 오류로 중단되어, #4 AUTHOR_CHANGE_HISTORY DDL은 **오케스트레이터가 직접 완료**(컬럼명 오타 CHG_RESN 정정 포함). → **1차 목표 6개 항목 전부 ✅.**
|
||
|
||
### 2차 작업 (2026-07-21, 추가 6개 목표)
|
||
|
||
1차 기반(#1·#4·#17·#30·#39) 위에 쌓이는 항목. 공용 config 수정은 Fork A에 단독 집중해 충돌 차단.
|
||
|
||
| Fork | 영역 | 대상 # | 산출물 | 상태 |
|
||
|:----:|------|:------:|--------|:----:|
|
||
| **A** | 배치(config 단독소유) | #5 권한 이력 파기 배치 | AUTHOR_CHANGE_HISTORY DAO/sqlmap + @Scheduled(1,095일) | ✅ 완료 |
|
||
| **A** | 배치(config 단독소유) | #40 해시체인 무결성 검증 배치 | HashChainService.verifyChain 재계산 배치 + 관리자 통보 | ✅ 완료 |
|
||
| **B** | util(신규파일만) | #34 IP 취득 로직 보정 | ClientIpResolver(XFF→Proxy-Client-IP→getRemoteAddr) | ✅ 완료 |
|
||
| **B** | util(신규파일만) | #16 세션 재발급(세션고정 차단) | SessionRegenerator util | ✅ 완료 |
|
||
| **C** | resolver+분석 | #21 AuthMethodResolver 구현 | #17 인터페이스 기반 인증수단 분기 | ✅ 완료 |
|
||
| **C** | resolver+분석 | #38 COMTNSYSLOG 7일 삭제 분리 | 기존 7일 삭제 SQL 진단 + 접속기록 미적용 분리 노트 | ✅ 완료 |
|
||
|
||
- 2026-07-21 2차 착수: Fork A/B/C 병렬 재투입, 대상 6개 🟡 진행중 전환.
|
||
|
||
### 3차 작업 (2026-07-21, 추가 6개 목표 — 통합 단계)
|
||
|
||
1·2차 산출물(#1·#16·#17·#21·#30·#34·#39)을 실제로 연결·활용. 공용 config는 fork별로 배타 소유(A=egov-com-servlet.xml, B=sql-map-config+AOP, C=impl java만).
|
||
|
||
| Fork | 영역 | 대상 # | 산출물 | 상태 |
|
||
|:----:|------|:------:|--------|:----:|
|
||
| **A** | 인터셉터(servlet.xml 단독) | #2 AuthorityInterceptor 등록 | URL·메뉴 권한 대조 차단(#1 getAuthorities 활용) | ✅ 완료 |
|
||
| **A** | 인터셉터(servlet.xml 단독) | #14 SecondFactorInterceptor 등록 | 2차 인증 판정(#16 SessionRegenerator+#21 Resolver) | ✅ 완료 |
|
||
| **B** | 접속기록수집(sqlmap+AOP 단독) | #31 PersonalDataLogAspect | 개인정보 서비스 한정 AOP 수집(#34 IP+#39 해시) | ✅ 완료 |
|
||
| **B** | 접속기록수집(sqlmap+AOP 단독) | #32 업무유형 매핑 테이블 | URL패턴→업무코드 DDL+로더 | ✅ 완료 |
|
||
| **C** | 인증수단(impl java만) | #18 OtpAuthService(TOTP) | #17 스텁 채움, TOTP 자체구현·비밀키 암호화 | ✅ 완료 |
|
||
| **C** | 인증수단(impl java만) | #20 CertAuthService | #17 스텁 채움, GPKI 기존자산 위임 | ✅ 완료 |
|
||
|
||
- 2026-07-21 3차 착수: Fork A/B/C 병렬 재투입, 대상 6개 🟡 진행중 전환.
|
||
|
||
### 4차 작업 (2026-07-21, 추가 6개 목표)
|
||
|
||
접근통제·계정잠금 + 접속기록 배치/비동기 + 세션/마스킹. 로그인 흐름은 Fork A 단독 소유로 충돌 차단.
|
||
|
||
| Fork | 영역 | 대상 # | 산출물 | 상태 |
|
||
|:----:|------|:------:|--------|:----:|
|
||
| **A** | 로그인흐름(sql-map-config 단독) | #22 인증실패이력 활성경로 이설 | LOGIN_HISTORY/LOGIN_LOCK_COUNT 재사용, actionLogin 활성 | ✅ 완료 |
|
||
| **A** | 로그인흐름(sql-map-config 단독) | #24 계정 잠금 10→5회 | 임계값 5 + 해제 관리자화면 전환·해제이력 적재 | ✅ 완료 |
|
||
| **B** | 접속기록배치(자기sqlmap·스케줄러 단독) | #33 비동기 적재 큐 | 로그적재↔업무txn 분리(단일컨슈머 순번보장) | ✅ 완료 |
|
||
| **B** | 접속기록배치(자기sqlmap·스케줄러 단독) | #37 보관 730일 파기 배치 | 월1회 파티션 DROP(개별 DELETE 미사용) | ✅ 완료 |
|
||
| **C** | 세션·마스킹(web.xml+util 단독) | #25 세션 타임아웃 60→30분 | web.xml session-config + 정책 훅 | ✅ 완료 |
|
||
| **C** | 세션·마스킹(web.xml+util 단독) | #29 2차인증 화면 마스킹 | 휴대폰번호 마스킹 util | ✅ 완료 |
|
||
|
||
- 2026-07-21 4차 착수: Fork A/B/C 병렬 재투입, 대상 6개 🟡 진행중 전환.
|
||
|
||
### 5차 작업 (2026-07-21, 추가 6개 목표)
|
||
|
||
미사용계정 휴면(첫 착수) + 접속기록 조회·점검 + 접근통제 마무리(#23 핸드오프 해소). 로그인/인터셉터는 Fork C 단독.
|
||
|
||
| Fork | 영역 | 대상 # | 산출물 | 상태 |
|
||
|:----:|------|:------:|--------|:----:|
|
||
| **A** | 휴면계정(umt·휴면 sqlmap 단독) | #7 휴면 대상 취급자 확장 | 휴면 체인 S→P를 COMTNEMPLYRINFO까지 | ✅ 완료 |
|
||
| **A** | 휴면계정(umt·휴면 sqlmap 단독) | #8 MariaDB 휴면배치 statement 정비 | Oracle에만 있던 배치 statement MariaDB 추가 | ✅ 완료 |
|
||
| **B** | 접속기록조회·점검(자기sqlmap·스케줄러 단독) | #41 접속기록 조회·검색 개선 | 접속자ID 등 신규 검색조건(현행 LIKE+날짜뿐) | ✅ 완료 |
|
||
| **B** | 접속기록조회·점검(자기sqlmap·스케줄러 단독) | #43 정기점검 리포트 생성 배치 | 월1회 이상징후·무결성·처리현황·다운로드 집계 | ✅ 완료 |
|
||
| **C** | 접근통제마무리(로그인·servlet.xml 단독) | #23 계정 열거 방지 | 실패 메시지 존재여부 무관 일관화(#22 핸드오프 해소) | ✅ 완료 |
|
||
| **C** | 접근통제마무리(로그인·servlet.xml 단독) | #26 인터셉터 3단 순서 확정 | 인증→SecondFactor→Authority 순서 확정·검증 | ✅ 완료 |
|
||
|
||
- 2026-07-21 5차 착수: Fork A/B/C 병렬 재투입, 대상 6개 🟡 진행중 전환.
|
||
|
||
### 6차 작업 (2026-07-21, 추가 6개 목표 — 2개 영역 완결)
|
||
|
||
권한관리(1~6)·접근통제(22~29) 완결 목표. 공용 config는 fork별 배타 소유(A=sql-map-config, B=BatchScheduler+등록된sqlmap, C=servlet.xml).
|
||
|
||
| Fork | 영역 | 대상 # | 산출물 | 상태 |
|
||
|:----:|------|:------:|--------|:----:|
|
||
| **A** | 권한관리완결(sql-map-config 단독) | #3 권한 신청·승인 워크플로 | 신청R→승인A/반려J 테이블+서비스, 승인시 권한반영+#4이력 단일TX | ✅ 완료 |
|
||
| **A** | 권한관리완결(sql-map-config 단독) | #6 권한 이력 조회·검색·다운로드 | #4 이력 양방향검색 + 다운로드 사유필수·다운로드이력 | ✅ 완료 |
|
||
| **B** | 접속기록마무리(스케줄러·등록sqlmap 단독) | #35 비정상 접근 탐지 5유형 | 비인가/대량조회/비정상시간대/계정공유의심/인증실패반복 | ✅ 완료 |
|
||
| **B** | 접속기록마무리(스케줄러·등록sqlmap 단독) | #42 다운로드 사유·이력 관리 | 접속기록 다운로드 사유필수+다운로드자·일시·IP·건수 이력 | ✅ 완료 |
|
||
| **C** | 인증판정·정책(servlet.xml·인터셉터 단독) | #15 2차인증 적용대상·경로 판정 | 취급자 한정, 외부 필수/내부 정책(#14 확장) | ✅ 완료 |
|
||
| **C** | 인증판정·정책(servlet.xml·인터셉터 단독) | #28 신규 인증정보 저장정책 적용 | OTP암호화/인증번호미저장/인증서 식별값만 점검·확정 | ✅ 완료 |
|
||
|
||
- 2026-07-21 6차 착수: Fork A/B/C 병렬 재투입, 대상 6개 🟡 진행중 전환.
|
||
|
||
### 7차 작업 (2026-07-21, 추가 6개 목표 — 2개 영역 완결)
|
||
|
||
미사용계정(SFR-002) 완결 + 접속기록(SFR-004) 15/15 완결. 미사용계정 4개는 공유파일 충돌로 Fork A 단독, 접속기록 2개는 파일 분리(B=aspect, C=report).
|
||
|
||
| Fork | 영역 | 대상 # | 산출물 | 상태 |
|
||
|:----:|------|:------:|--------|:----:|
|
||
| **A** | 미사용계정완결(휴면/정책·sql-map-config 단독) | #9 휴면 기준일수 정책값화 | 365 하드코딩→정책테이블 | ✅ 완료 |
|
||
| **A** | 미사용계정완결 | #10 휴면 전 관리자 알림 D-30/D-7/D-Day | 현재 본인메일 2단계→3단계+관리자 | ✅ 완료 |
|
||
| **A** | 미사용계정완결 | #11 장기 미사용 계정 현황 조회(백엔드) | ID·성명·소속·최종로그인·미접속일수·상태·휴면예정일 | ✅ 완료 |
|
||
| **A** | 미사용계정완결 | #13 계정 관리 정책 설정(백엔드) | 기준일수·알림시점·삭제보존기간·배치주기 정책 CRUD | ✅ 완료 |
|
||
| **B** | 처리기록확장(aspect·AOP context 단독) | #36 처리기록 적재 범위 확장 | 2개 Controller→전 처리지점, TRGET_ID 규약(sqlmap 무변경) | ✅ 완료 |
|
||
| **C** | 점검결과보관(report·등록sqlmap 단독) | #44 점검결과 입력·보관(백엔드) | 점검자·일시·결과·조치사항 입력→PDAL_INSPECTION_REPORT | ✅ 완료 |
|
||
|
||
- 2026-07-21 7차 착수: Fork A/B/C 병렬 재투입, 대상 6개 🟡 진행중 전환.
|
||
- 2026-07-21 **Fork B(7차) 완료** (#36): 처리기록 pointcut 5→16 서비스 확장 + TRGET_ID 식별자 추출 규약(본문 미적재, fail-safe). 실측 확인 후 ✅(XML well-formed·헬퍼 배선·sqlmap 미변경).
|
||
- 2026-07-21 **Fork C(7차) 완료** (#44): 점검결과 입력·보관(InspectionResult 3파일+INSPECT_DT+statement 3종). 실측 확인 후 ✅(미입력 차단·양쪽 XML well-formed·sql-map-config 미변경). **접속기록 영역(30~44) 15/15 완결.** 배포된 테이블엔 INSPECT_DT ALTER 필요(핸드오프).
|
||
- 2026-07-21 **Fork A(7차) 완료** (#9,#10,#11,#13): 정책테이블(ACCOUNT_MNG_POLICY)+정책값화+D-30/7/Day 알림+현황조회, 10파일·javac EXIT=0. 실측 확인 후 ✅(365→정책 서브쿼리·sql-map-config 등록·알림 스케줄러 확인). → **미사용계정 영역 6/7 완결(#12 발주대기만). 7차 6개 전부 ✅ (누적 42/61, 69%).**
|
||
- 2026-07-21 **Fork C(6차) 중단→완결** (#15, #28): Fork C가 #15(SecondFactorInterceptor 확장) 완료 후 #28 점검노트 착수 직전 API 오류 중단. #15는 실측 확인(외부필수/내부정책 판정·enforce=false·xml well-formed·중괄호 75/75)→✅. **#28 점검노트는 오케스트레이터가 직접 완결**(3종 저장정책 실측, 위반 0건, OTP URI 주의)→✅. → **접근통제 영역(22~29) 8/8 완결.**
|
||
- 2026-07-21 **Fork B(6차) 완료** (#35, #42): 비정상 탐지 5유형(6파일, 표준컬럼 집계) + 다운로드 사유필수·이력(DDL+4파일). 실측 확인 후 ✅(#43 리포트 자리표시→실집계 `summarize()`/`countByPeriod()` 교체, 양쪽 XML well-formed).
|
||
- 2026-07-21 **Fork A(6차) 완료** (#3, #6): 권한 신청·승인 워크플로(단일TX) + 권한이력 조회·다운로드(사유필수). 실측 확인 후 ✅(10파일·DDL·sql-map-config 등록·approveRequest 단일TX·다운로드 차단 확인). → **권한관리 영역(1~6) 6/6 완결. 6차 6개 전부 ✅ (누적 36/61, 59%).**
|
||
- 2026-07-21 **Fork C(5차) 완료** (#23, #26): 계정 열거 방지(조건부 문구 제거→단일 메시지) + 인터셉터 3단 순서 확정·문서화. 실측 확인 후 ✅(문구 제거·순서·xml well-formed 확인). **4차 #22 핸드오프(계정열거) 해소 완료.** ①authenticInterceptor 재활성은 운영 협의 후속.
|
||
- 2026-07-21 **Fork B(5차) 중단→분할 완결**: Fork B가 #41 Java 4파일까지 만들고 API 오류로 중단(누락 sqlmap·#43 미착수). #41은 **오케스트레이터가 누락 sqlmap statement(Mysql/Oracle) 완결**(DAO statement id 정합·XML well-formed 검증)→✅. #43은 전용 fork 재투입(진행중).
|
||
- 2026-07-21 **Fork A(5차) 완료** (#7, #8): 휴면 취급자 확장(MBER_TY_CODE 분리) + MariaDB 휴면 statement 5종 이설. 실측 확인 후 ✅ — **핵심 발견: MariaDB sqlmap에 휴면 statement 전무해 실운영 휴면배치가 불능이던 것을 복구**(#56 착수전 확인사항과 직결). DAO↔sqlmap id·javac EXIT=0 확인.
|
||
- 2026-07-21 **#43 재투입 fork 완료**: 정기점검 리포트 배치(PDAL_INSPECTION_REPORT+집계 3종+스케줄러). 실측 확인 후 ✅(파일·서비스·XML well-formed). #35 이상징후·#42 다운로드는 자리표시(후속 실집계 교체). → **5차 목표 6개 전부 ✅ (누적 30/61 — 절반 근접).**
|
||
- 2026-07-21 **Fork C(4차) 완료** (#25, #29): web.xml 세션타임아웃 30분 + MaskingUtil(휴대폰/이메일/이름). 실측 확인 후 ✅(web.xml:218=30, javac 통과). 후속: 세션타임아웃 관리자 설정화면.
|
||
- 2026-07-21 **Fork A(4차) 완료** (#22, #24): 운영 로그인 경로(`EgovLoginController.actionLogin`) 실패이력·잠금 이설 + ACCOUNT_UNLOCK_HISTORY 해제이력. 실측 확인 후 ✅ — **참조 서비스 7메서드·VO 3게터 인터페이스 실재 검증, fail-safe로 로그인 무손상.** 핸드오프: 필터 활성 시 이중카운트 정리, #23 실패메시지 완전통일(현재 존재계정에만 "현재 N회" 부가).
|
||
- 2026-07-21 **Fork B(4차) 완료** (#33, #37): 비동기 적재 큐(단일컨슈머 순번보장) + 730일 파티션 파기·선행증설 배치. 실측 확인 후 ✅(Aspect enqueue 전환·파티션 DROP/ADD statement·BatchScheduler 등록 확인). → **4차 목표 6개 전부 ✅ (누적 24/61).**
|
||
- 2026-07-21 **Fork A(3차) 완료** (#2, #14): 인터셉터 2종 신규+`egov-com-servlet.xml` 등록(순서 #26 반영), javac 통과·xml well-formed. **운영 안전 확인: SecondFactor enforce=false·Authority urlRoleMapping 공백=둘 다 fail-open이라 현재 사이트 무손상.** 실측 확인 후 ✅. 핵심 실측: 이 프로젝트는 `selectAnnotaionMapper`가 `/**/*.do` 전체 적용(mvc:interceptors 미사용)·기존 `authenticInterceptor` 비활성 → 스코프/잠금방지를 인터셉터 내부에서 처리. 후속: #52·#18~20 후 enforce=true, urlRoleMapping 운영 등록.
|
||
- 2026-07-21 **Fork C(3차) 완료** (#18, #20): OtpAuthService(TOTP RFC6238 자체구현, RFC 테스트벡터 일치) 5파일 + CertAuthService(기존 GPKI actionCrtfctLogin 위임). 스텁→실구현, javac+실행 검증. 실측 확인 후 ✅(UnsupportedOperationException 0건, SmsAuth#19 미변경 유지). 후속: OTP 비밀키 영속화 테이블, CertProcessFilter 재활성.
|
||
- 2026-07-21 **Fork B(3차) 완료** (#31, #32): PersonalDataLogAspect 수집 파이프라인 10클래스+DDL+sqlmap 6+AOP context, javac EXIT=0. 실측 확인 후 ✅(pointcut 개인정보 서비스 5개 한정 확인=과수집 방지, 기존 COMTNSYSLOG 광역 블록 주석 유지). 후속: #33 비동기 큐, #36 TRGET_ID 규약. → **3차 목표 6개 전부 ✅ (누적 18/61).**
|
||
- 2026-07-21 **Fork B(2차) 완료** (#34, #16): ClientIpResolver(신뢰CIDR 검증) + SessionRegenerator 생성, javac+단위검증 통과. 실측 확인 후 ✅. 후속: 신뢰대역 운영값(#57), #14 인터셉터 연동 배선.
|
||
- 2026-07-21 **Fork C(2차) 완료** (#21, #38): AuthMethodResolver 4종(javac 통과) + 시스템로그 삭제정책 분리노트. 실측 확인 후 ✅(7일 삭제 SQL `EgovSysLog_SQL_Mysql.xml:159` 실제와 정합, 스케줄러 비활성 확인). 후속: #18~20 구현체·빈등록.
|
||
- 2026-07-21 **Fork A(2차) 완료** (#5, #40): 파기·무결성검증 배치 2종(배치 클래스+DAO+sqlmap 6파일) + `BatchScheduler` @Scheduled 2메서드 + sql-map-config 등록. 실측 확인 후 ✅(파기 SQL이 실제 DDL 컬럼 CHG_DT 사용 정합). **핵심 핸드오프: 전역 `task:annotation-driven`이 양쪽 context에 주석 처리→@Scheduled 현재 무동작(기존 배치도 동일). 활성화·crontab 경합은 운영 협의 필요.** → **2차 목표 6개 전부 ✅ (누적 12/61).**
|
||
|
||
---
|
||
|
||
## 2. 영역별 진행 요약
|
||
|
||
| 영역 | 요구사항 ID | 항목(구간) | 담당 | 완료 | 진행중 | 미착수 |
|
||
|------|-------------|:----------:|------|:----:|:------:|:------:|
|
||
| Ⅰ. 권한관리 ✅ | SFR-001 | 1~6 | arko-privacy-authctrl | 6 | 0 | 0 |
|
||
| Ⅰ. 미사용계정관리 | SFR-002 | 7~13 | arko-privacy-authctrl | 6 | 0 | 1 |
|
||
| Ⅱ. 인증체계 | SFR-003 / IAR-001 | 14~21 | arko-privacy-authctrl | 7 | 0 | 1 |
|
||
| Ⅱ. 접근통제·인증정보 ✅ | SER-001 / SER-003 | 22~29 | arko-privacy-authctrl | 8 | 0 | 0 |
|
||
| Ⅲ. 접속기록 ✅ | SFR-004 / DBR-001 / SER-002 | 30~44 | arko-privacy-auditlog | 15 | 0 | 0 |
|
||
| Ⅳ. 신규 화면(UI) | - | 45~54 | arko-frontend | 0 | 0 | 10 |
|
||
| Ⅴ. 착수전 확인 | - | 55~58 | arko-privacy-analyst | 0 | 0 | 4 |
|
||
| Ⅵ. 보안·품질 | SER-004 | 59~61 | arko-reviewer | 0 | 0 | 3 |
|
||
| **합계** | | **61** | | **42** | **0** | **19** |
|
||
|
||
범례: ✅ 완료 · 🟡 진행중 · ⬜ 미착수
|
||
|
||
---
|
||
|
||
## 3. 항목별 상세 진행현황
|
||
|
||
### Ⅰ. 권한관리 (Ⅲ-2, SFR-001·SFR-002) — arko-privacy-authctrl
|
||
|
||
#### 1) 권한 신설·변경·회수 및 역할별 차등 적용 (SFR-001)
|
||
|
||
| # | 개발항목 | 상태 | 소스 실측 / 비고 |
|
||
|:--:|----------|:----:|------------------|
|
||
| 1 | `getAuthorities()` 구현 | ✅ 완료 | [Fork A] `EgovUserDetailsSessionServiceImpl` 세션 LoginVO.uniqId→`EgovUserAuthorityDAO.selectAuthoritiesByUniqId`→`PrivacyAuthority_SQL_Mysql.xml`(COMTNEMPLYRSCRTYESTBS 조회). sql-map-config 등록 + 빈 DAO 주입 배선 완료. 미인증 시 빈 목록(fail-safe) |
|
||
| 2 | AuthorityInterceptor 신규 등록 | ✅ 완료 | [Fork A] `cmm/privacy/interceptor/AuthorityInterceptor.java` + `egov-com-servlet.xml` 등록. `/mnt/` 한정, `EgovUserDetailsHelper.getAuthorities()`(#1) 대조 미허용 403. **urlRoleMapping 기본 비어있음=fail-open(전경로 통과)** → 운영에서 매핑 점진 등록 |
|
||
| 3 | 권한 신청·승인 워크플로 구현 | ✅ 완료 | [Fork A] `AUTHOR_CHANGE_REQUEST`(DDL)+5계층(`AuthorWorkflow*`). `approveRequest()` 승인 시 스냅샷→권한반영(COMTNEMPLYRSCRTYESTBS)→상태A→#4이력을 **단일TX**(context-transaction AOP, 예외 시 롤백). 화면 #46 후속 |
|
||
| 4 | AUTHOR_CHANGE_HISTORY 이력 테이블 신설 | ✅ 완료 | `src/script/mysql/ddl/privacy.author_change_history_create_mysql.sql`. 변경자/변경일시/변경전후권한(BEFORE/AFTER_AUTHOR)/변경구분/승인자/IP + 3년(1,095일) 보관 전제. Fork A 중단→오케스트레이터 완료 |
|
||
| 5 | 권한 이력 파기 배치 구현 | ✅ 완료 | [Fork A] `cmm/privacy/batch/`(Service/Impl/PurgeDAO) + `PrivacyAuthorHistoryPurge_SQL`(DELETE WHERE CHG_DT<cutoff, 1,095일). `BatchScheduler.purgeAuthorChangeHistoryScheduler()` @Scheduled(매월1일 04:00). config 등록 완료. ⚠전역 task:annotation-driven 비활성→활성화는 운영협의 |
|
||
| 6 | 권한 이력 조회·검색·다운로드 화면 | ✅ 완료 | [Fork A] `AuthorHistory`Service/DAO+VO+컨트롤러. #4 이력 대상자·변경자 **양방향 검색**+구분/기간+페이징. **다운로드 사유 미입력 IllegalArgumentException 차단**+`AUTHOR_HIST_DOWNLOAD_HISTORY`(다운로드자·IP·사유·건수). 화면 #46 후속 |
|
||
|
||
#### 2) 장기 미사용 계정 관리 (SFR-002)
|
||
|
||
| # | 개발항목 | 상태 | 소스 실측 / 비고 |
|
||
|:--:|----------|:----:|------------------|
|
||
| 7 | 휴면 대상 확장(취급자 COMTNEMPLYRINFO까지) | ✅ 완료 | [Fork A] `COMTNDIAPAUSEMBER.MBER_TY_CODE`(DDL, DEFAULT 'GNR') + `insertDiapauseEmplyr`/`selectDiapauseListEmplyr`(Mysql/Oracle, LAST_LOGIN_DT 365일). `EgovLoginServiceImpl.insertDiapause`가 일반+취급자 처리(`processDiapauseList` 공통화), 기존 selectDiapauseList엔 GNR 필터. 매일01:00 기존 스케줄 재사용 |
|
||
| 8 | MariaDB sqlmap 휴면배치 statement 정비 | ✅ 완료 | [Fork A] AS-IS: 휴면 statement 5종이 Oracle sqlmap에만→**MariaDB 운영 시 휴면배치 불능**. `EgovLoginUsr_SQL_Mysql.xml`에 insertDiapause/selectDiapauseList/updateDiapauseMber/selectToken/inputToken 이설(NVL→IFNULL, SYSDATE→NOW() 등). MariaDB 휴면배치 복구 |
|
||
| 9 | 휴면 기준일수 정책값화 | ✅ 완료 | [Fork A] 휴면 sqlmap 4개 WHERE의 `>365`→`>(SELECT IFNULL(MAX(DORMANT_DAY),365) FROM ACCOUNT_MNG_POLICY)`(Mysql/Oracle). **미설정 시 365 fallback**, Java 시그니처 무변경 |
|
||
| 10 | 휴면 전 관리자 알림 확장(D-30/D-7/D-Day) | ✅ 완료 | [Fork A] `DormantAlertService` — 정책 ALERT_D1/2/3(기본 30/7/0)일 전 대상 조회→본인+관리자(ADMIN_EMAIL) 메일(EgovSndngMail 재사용, fail-safe). `BatchScheduler.dormantPreAlertScheduler()` @Scheduled(매일 06:00) |
|
||
| 11 | 장기 미사용 계정 현황 조회 화면 신규 | ✅ 완료 | [Fork A] `DormantAccountStatus`Service/DAO+VO. 취급자(COMTNEMPLYRINFO) 계정ID·성명·소속·직위·최종로그인·**미접속일수(DATEDIFF)**·상태·**휴면예정일** 복합검색+페이징. 일반회원 UNION·화면 후속 |
|
||
| 12 | 계정 삭제 기능 구현 | ⬜ 미착수 | ⚠ 보존기간 발주기관 확정 필요 |
|
||
| 13 | 계정 관리 정책 설정 화면 | ✅ 완료 | [Fork A] `ACCOUNT_MNG_POLICY`(DDL, DORMANT_DAY·ALERT_D1/2/3·DELETE_PRESERVE_DAY·BATCH_CYCLE·ADMIN_EMAIL 단일행+시드) + `AccountMngPolicy`Service/DAO/VO/Controller. 미설정 시 기본값 fallback. #9/#10이 이 테이블 참조. 화면 후속 |
|
||
|
||
### Ⅱ. 인증체계 (Ⅲ-3, SFR-003·IAR-001·SER-001·SER-003) — arko-privacy-authctrl
|
||
|
||
#### 3) 2단계 인증 삽입 (SFR-003)
|
||
|
||
| # | 개발항목 | 상태 | 소스 실측 / 비고 |
|
||
|:--:|----------|:----:|------------------|
|
||
| 14 | SecondFactorInterceptor 신규 등록 | ✅ 완료 | [Fork A] `cmm/privacy/interceptor/SecondFactorInterceptor.java`, authority보다 먼저 등록(#26 순서 반영). `/mnt/` 한정 SECOND_FACTOR_DONE 검사. **enforce=false(미강제)** → #52 화면·#18~20 수단 완료 후 true+resolver 주입 활성화. javac 통과 |
|
||
| 15 | 2차 인증 적용대상·경로 판정 로직 | ✅ 완료 | [Fork C] `SecondFactorInterceptor` 확장 — `/mnt/` 취급자 한정, **외부접속 필수(설정불가)/내부접속 정책(applyToInternal, internalIpCidrs CIDR 판정)**. enforce=false 유지(잠금방지). 중괄호 75/75·xml well-formed |
|
||
| 16 | 세션 재발급 처리(세션고정 차단) | ✅ 완료 | [Fork B] `cmm/privacy/security/SessionRegenerator.java`. `regenerate()`=속성캡처→invalidate→getSession(true)→재적재, `onSecondFactorSuccess()` 표식. javac 통과. #14 SecondFactorInterceptor 연동 시 호출 배선 필요 |
|
||
|
||
#### 4) 추가 인증수단 3종 (IAR-001)
|
||
|
||
| # | 개발항목 | 상태 | 소스 실측 / 비고 |
|
||
|:--:|----------|:----:|------------------|
|
||
| 17 | AuthMethodService 인터페이스 설계 | ✅ 완료 | [Fork C] `com/uat/uia/service/AuthMethodService.java` + 스텁 3종(Otp/Sms/Cert) 생성. `issue(uniqId)`/`verify(uniqId,code)`/`isAvailable(uniqId)` throws Exception 확정. 빈 등록·실로직은 #18~21 후속 |
|
||
| 18 | OtpAuthService 구현 (1차 적용) | ✅ 완료 | [Fork C] `OtpAuthService`+`OtpSecretStore`/`InMemory`/`OtpSecretCipher`(5파일). TOTP RFC6238 자체구현(HmacSHA1/30초/6자리/±1스텝), 비밀키 AES-128/GCM 암호화 저장·미노출. **RFC 테스트벡터 일치(287082/081804)**. 영속화=EMPLYR_OTP_SECRET 테이블 후속(Fork B 소유 sqlmap) |
|
||
| 19 | SmsAuthService 구현 (2차 적용) | ⬜ 미착수 | ⚠ KT-TCS/MCSAgent3.0 연동규격 발주기관 확정 필요 |
|
||
| 20 | CertAuthService 구현 (3차 적용) | ✅ 완료 | [Fork C] `CertAuthService` 실구현. 기존 `EgovLoginServiceImpl.actionCrtfctLogin`(:108)→`COMTNEMPLYRINFO.CRTFC_DN_VALUE`(EgovLoginUsr_SQL_Mysql.xml:434) 위임, **인증서 본문 미저장·DN 식별값만 대조**. 핸드오프: `CertProcessFilter`(web.xml:46 주석) 재활성 운영협의 |
|
||
| 21 | AuthMethodResolver 구현 | ✅ 완료 | [Fork C] `AuthMethodResolver`+`AuthMethodType`(enum)+`AuthMethodPolicyProvider`+`DefaultAuthMethodPolicyProvider` 4종. Map<code,impl> 주입 분기, 폴백 OTP→SMS→CERT, `resolve(String) throws Exception`(1차 계약 정합). javac 통과. 실동작은 #18~20 구현체·빈등록 후 |
|
||
|
||
#### 5) 인증 실패 이력 및 접근통제 정책 (SER-001)
|
||
|
||
| # | 개발항목 | 상태 | 소스 실측 / 비고 |
|
||
|:--:|----------|:----:|------------------|
|
||
| 22 | 인증 실패 이력 활성 경로 이설 | ✅ 완료 | [Fork A] AS-IS: 실패이력/잠금이 `EgovSpringSecurityLoginFilter:466`(조건부)에만 존재. `EgovLoginController.actionLogin` 재작성(잠금선확인→성공시 이력정리→실패시 조건부 적재/잠금), **기존 LOGIN_HISTORY/LOGIN_LOCK_COUNT·서비스 7메서드 재사용(신규 statement 0)**, 전구간 fail-safe. 서비스/VO 메서드 실재 검증 |
|
||
| 23 | 계정 열거 방지 처리 | ✅ 완료 | [Fork C] `EgovLoginController:238` 조건부 "현재 N회" 문구 제거→존재/미존재·실패횟수 무관 단일 `fail.common.login`. 실패이력·잠금은 내부 유지, 응답 노출 제거. 잠금안내만 의도적 예외 |
|
||
| 24 | 계정 잠금 정책 정비(10회→5회) | ✅ 완료 | [Fork A] 임계값 `LOGIN_LOCK_COUNT` UPDATE=5 + 소스 fallback `DEFAULT_LOCK_THRESHOLD=5`. 해제화면 기존확인. **신규 `ACCOUNT_UNLOCK_HISTORY`**(DDL+VO+DAO+sqlmap, sql-map-config 등록)에 해제이력 훅(해제자+ClientIpResolver IP, fail-safe). 사유입력은 화면 후속 |
|
||
| 25 | 세션 타임아웃 조정(60→30분) | ✅ 완료 | [Fork C] `web.xml:218` `<session-timeout>30</session-timeout>`(60→30) + 근거주석. 실사용 webapp/web.xml 확정. 관리자 설정화면은 후속 |
|
||
| 26 | 인터셉터 3단 판정 순서 확정 | ✅ 완료 | [Fork C] `egov-com-servlet.xml:66` 리스트 순서 확정 ①authenticInterceptor(비활성)→②secondFactor→③authority + 근거주석. ①재활성 시 위치 유지 핸드오프. xml well-formed |
|
||
|
||
#### 6) 인증정보 보호 (SER-003)
|
||
|
||
| # | 개발항목 | 상태 | 소스 실측 / 비고 |
|
||
|:--:|----------|:----:|------------------|
|
||
| 27 | 비밀번호 해시 알고리즘 점검 | ✅ 완료 | [Fork C] 점검노트 `개인정보보호_비밀번호해시_점검노트.md`. 알고리즘 **SHA-256(기준 충족)**, 단 운영경로 **무솔트·무반복** + `BizMberFrtManageController.java:553` 해시값 로그출력 3건 보완 권고 |
|
||
| 28 | 신규 인증정보 저장정책 적용 | ✅ 완료 | [Fork C→오케스트레이터] 점검노트 `개인정보보호_인증정보저장정책_점검노트.md`. OTP AES암호화저장(로그노출0)·SMS 미저장설계·CERT DN만 → **3종 준수, 위반 0건**. OTP 프로비저닝 URI 화면(#53) 취급 주의 1건 |
|
||
| 29 | 2차 인증 화면 개인정보 마스킹 | ✅ 완료 | [Fork C] `cmm/privacy/util/MaskingUtil.java`. maskPhone(010-****-1234)/maskEmail(ho**@)/maskName(홍*동)/범용 mask. null·형식 방어, javac+self-check 통과. #52 화면에서 사용 |
|
||
|
||
### Ⅲ. 접속 및 처리기록 관리 (Ⅲ-4, SFR-004·DBR-001·SER-002) — arko-privacy-auditlog
|
||
|
||
#### 7) 접속기록 수집·저장 (SFR-004)
|
||
|
||
| # | 개발항목 | 상태 | 소스 실측 / 비고 |
|
||
|:--:|----------|:----:|------------------|
|
||
| 30 | PERSONAL_DATA_ACCESS_LOG 신규 테이블 | ✅ 완료 | [Fork B] `src/script/mysql/ddl/privacy.pdal_create_mysql.sql`. 기존 PERSONAL_DATA_DML_HISTORY 실측 승격 + HASH_VAL/PREV_HASH_VAL, PK(LOG_ID,CONECT_DT), 월 RANGE COLUMNS 파티셔닝(접속자ID 검색 인덱스 포함). 파티션 자동증설/파기는 #37 연계 |
|
||
| 31 | AOP pointcut 한정 수집 설계 | ✅ 완료 | [Fork B] `PersonalDataLogAspect`+Service/Impl+DAO(10파일)+`context-syslogaop.xml`. pointcut **개인정보 서비스 impl 5개 한정**(과수집 방지), `ClientIpResolver`(#34)+`HashChainService.linkAndSeal`(#39) 적재, synchronized 순번직렬화. 본문 미적재. 비동기(#33)·TRGET_ID(#36) 후속 |
|
||
| 32 | 업무유형 매핑 테이블 구현 | ✅ 완료 | [Fork B] `privacy.job_mapping_create_mysql.sql`(`PDAL_JOB_MAPPING`+시드 13행) + `JobMappingResolver`(@Component 캐시)+DAO+sqlmap. (클래스,메서드)→업무코드/명, 신규화면은 행 등록만으로 수집(소스 무수정) |
|
||
| 33 | 비동기 적재 큐 구현 | ✅ 완료 | [Fork B] `AccessLogQueue`(LinkedBlockingQueue cap1만+단일 데몬컨슈머). Aspect가 enqueue만(업무 응답 무영향), 컨슈머가 persistNow 순차→**단일 라이터로 해시체인 순번 보장**. 백프레셔(offer 5s), @PreDestroy flush 유실방지 |
|
||
| 34 | IP 취득 로직 보정 | ✅ 완료 | [Fork B] `cmm/privacy/auditlog/ClientIpResolver.java`. XFF→Proxy/WL-Proxy→HTTP_CLIENT_IP→getRemoteAddr 순 + **신뢰프록시 CIDR 검증(헤더위조 방지)** + IPv6 루프백 정규화. javac+단위검증 통과. AS-IS `IpObtainInterceptor`(getRemoteAddr+인증시만) 격차 확인. 신뢰대역 운영값=#57 후 확정 |
|
||
|
||
#### 8) 비정상 접근 탐지 및 처리기록 (SER-002)
|
||
|
||
| # | 개발항목 | 상태 | 소스 실측 / 비고 |
|
||
|:--:|----------|:----:|------------------|
|
||
| 35 | 비정상 접근 탐지 5유형 구현 | ✅ 완료 | [Fork B] `AbnormalAccessType`(enum)+`Policy`+`Detection`Service/Impl/DAO+VO(6파일). 표준컬럼 집계로 5유형(비인가F/대량조회/업무외시간/동일ID다중IP/실패반복≥5). 임계 정책추상화. sqlmap 5종(Mysql/Oracle). **#43 리포트 실집계 교체** |
|
||
| 36 | 처리기록 적재 범위 확장 | ✅ 완료 | [Fork B] pointcut 5→16개 개인정보 취급 서비스(회원/취급자/휴면/신청/활동/그룹/마일리지/프로필/쪽지/SMS 등 명시열거, 조직·통계·게시성 제외). **TRGET_ID 식별자만 베스트에포트 추출**(getter/Map키 우선순위, String인자 스킵, 본문 미적재, fail-safe). sqlmap 무변경(컬럼 기보유). javac EXIT=0 |
|
||
|
||
#### 9) 보관정책 및 위·변조 방지 (DBR-001)
|
||
|
||
| # | 개발항목 | 상태 | 소스 실측 / 비고 |
|
||
|:--:|----------|:----:|------------------|
|
||
| 37 | 보관정책 730일 + 파기 배치 구현 | ✅ 완료 | [Fork B] `AccessLogPartitionDAO`+`PDAL_PURGE_HISTORY`(DDL). INFORMATION_SCHEMA.PARTITIONS 경계≤오늘-730일 파티션 DROP + 당월~+2M ADD 선행증설. `BatchScheduler.purgeAccessLogPartitionScheduler()`(매월1일 02:00). ⚠파티션명 `$` 치환=Java계산값(안전, 리뷰포인트) |
|
||
| 38 | COMTNSYSLOG 7일 삭제정책 재설계 | ✅ 완료 | [Fork C] 노트 `개인정보보호_시스템로그삭제정책_분리노트.md`. 7일 삭제 SQL 위치 `EgovSysLog_SQL_Mysql.xml:159`(COMTNSYSLOG 단일, Quartz 1H이나 **현재 스케줄러 비활성**) 실측 확인. 오적용 위험 낮음(테이블 하드코딩+namespace 분리), 분리 보강 5개 권고 |
|
||
| 39 | SHA-256 해시체인 구현 | ✅ 완료 | [Fork B] `cmm/privacy/auditlog/HashChainService.java`(+VO). MessageDigest 자체구현, 결합규칙 CONECT_ID\|CONECT_DT\|CONECT_IP\|JOB_SE_CODE\|TRGET_ID\|DML_GUBUN\|PREV_HASH_VAL→SHA-256. computeHash/linkAndSeal/verifyChain, javac+실행 변조탐지 검증. 순번보장=단일스레드 순차INSERT 전제(#33) |
|
||
| 40 | 해시체인 무결성 검증 배치 | ✅ 완료 | [Fork A] `AccessLogIntegrityDAO`+`PrivacyAccessLogIntegrity_SQL`(LOG_ID ASC, CONECT_DT 형식일치) + `verifyAccessLogHashChain()`→verifyChain. `BatchScheduler.verifyAccessLogHashChainScheduler()` @Scheduled(매월1일 03:00). 불일치 시 log.error+notifyAdmin(#49 TODO)·리포트(#43) 반환 |
|
||
|
||
#### 10) 조회·다운로드 및 정기점검
|
||
|
||
| # | 개발항목 | 상태 | 소스 실측 / 비고 |
|
||
|:--:|----------|:----:|------------------|
|
||
| 41 | 접속기록 조회·검색 화면 개선 | ✅ 완료 | [Fork B→오케스트레이터] `PersonalDataAccessLogSearch`DAO/Service/Impl/VO + `selectAccessLogList`/`Count` sqlmap(Mysql/Oracle). 접속자ID/업무유형/대상/IP/처리구분/결과/기간 복합+페이징. Fork B 중단→오케스트레이터가 누락 sqlmap 완결(codebase 관용 맞춰 동적WHERE 인라인, XML well-formed). 화면 #47 후속 |
|
||
| 42 | 다운로드 사유·이력 관리 | ✅ 완료 | [Fork B] `PDAL_DOWNLOAD_HISTORY`(DDL)+VO/DAO+`AccessLogDownloadService`. **사유 공백 시 IllegalArgumentException 차단** + 다운로드자·일시·IP·사유·건수 이력(본문 미보관, 10만건 상한). sqlmap 3종. **#43 리포트 실집계 교체** |
|
||
| 43 | 정기점검 리포트 생성 배치 | ✅ 완료 | [Fork B] `PDAL_INSPECTION_REPORT`(DDL)+`InspectionReportVO`/`DAO`+`generateMonthlyInspectionReport()`+`BatchScheduler`(매월1일 05:00). 집계: 총/실패건수·#40무결성(재사용)·취급자별 top20 [구현], 이상징후#35·다운로드#42 [자리표시]. sql-map-config 무수정(기존 sqlmap 확장) |
|
||
| 44 | 점검결과 입력·보관 화면 | ✅ 완료 | [Fork C] `InspectionResult`Service/Impl/Controller + `INSPECT_DT` 컬럼 추가 + statement 3종(목록/상세/UPDATE). `saveInspectionResult()` 결과 미입력 차단·리포트 존재확인·INSPECTOR_ID/INSPECT_RESULT/ACTN_MATTER/INSPECT_DT 갱신(감사증빙, 배치집계값 불변). 화면 #48 후속 |
|
||
|
||
### Ⅳ. 신규 화면 (디자인.md 연계) — arko-frontend
|
||
|
||
| # | 개발항목 | 구분 | 상태 |
|
||
|:--:|----------|:----:|:----:|
|
||
| 45 | 권한부여 신청/승인 관리 화면 | mnt | ⬜ 미착수 |
|
||
| 46 | 권한변경 이력 조회 화면 | mnt | ⬜ 미착수 |
|
||
| 47 | 개인정보 접속기록 조회/다운로드 화면 | mnt | ⬜ 미착수 |
|
||
| 48 | 접속기록 정기점검 리포트 대시보드 | mnt | ⬜ 미착수 |
|
||
| 49 | 비정상접근 탐지 알림함 화면 | mnt | ⬜ 미착수 |
|
||
| 50 | 인증수단 관리 설정 화면 | mnt | ⬜ 미착수 |
|
||
| 51 | 계정 잠금/휴면계정 관리 확장 화면 | mnt | ⬜ 미착수 |
|
||
| 52 | 2차 인증(추가인증) 입력 화면 | frt | ⬜ 미착수 |
|
||
| 53 | 마이페이지 인증수단 등록/관리 화면 | frt | ⬜ 미착수 |
|
||
| 54 | 계정 잠금 안내 화면 | frt | ⬜ 미착수 |
|
||
|
||
> UI 목업 브리프(스티치 AI 프롬프트 포함)는 `디자인.md`에 문서화 완료 — **설계 산출물은 준비됨**, 코드 구현은 미착수.
|
||
|
||
### Ⅴ. 착수 즉시 확인 필요 사항 — arko-privacy-analyst
|
||
|
||
| # | 확인항목 | 상태 | 리스크 |
|
||
|:--:|----------|:----:|--------|
|
||
| 55 | 운영 web.xml 필터 매핑 상태 확인 | ⬜ 미확인 | R1 — 소스/운영 배포본 상이 가능성 |
|
||
| 56 | 휴면 배치 운영 로그 확인 | ⬜ 미확인 | MariaDB statement 부재 실운영 재확인 |
|
||
| 57 | CONECT_IP 적재값 분포 확인 | ⬜ 미확인 | Apache+L4 이중구성 L4 IP 고정 여부 |
|
||
| 58 | 인터셉터 등록부 현재 상태 확인 | ⬜ 미확인 | 등록 순서 재검증 |
|
||
|
||
### Ⅵ. 보안·품질 점검 (SER-004) — arko-reviewer
|
||
|
||
| # | 개발항목 | 상태 | 비고 |
|
||
|:--:|----------|:----:|------|
|
||
| 59 | 시큐어코딩 적용 및 점검 | ⬜ 미착수 | 행안부 기준 · 구현 후 |
|
||
| 60 | 웹취약점 점검 | ⬜ 미착수 | 국정원 기준 · 개발 완료 후 |
|
||
| 61 | 중점 점검 5종 확인 | ⬜ 미착수 | 인증우회/권한상승/접속기록조작/계정열거/인증정보노출 |
|
||
|
||
---
|
||
|
||
## 4. 완료된 선행 작업 (구현 착수 기반)
|
||
|
||
| 산출물 | 위치 | 상태 |
|
||
|--------|------|:----:|
|
||
| 요구사항·기술설계 원문 | `E:\지역문화원\제안서\mds\Ⅲ_사업수행계획.md` (Ⅲ-2/3/4) | ✅ |
|
||
| 개발항목 정리(61개) | `개인정보보호_개발항목.docx` | ✅ |
|
||
| 신규 화면 디자인 브리프(10종) | `디자인.md` | ✅ |
|
||
| 권한/인증 구현 에이전트 | `.claude/agents/arko-privacy-authctrl.md` | ✅ |
|
||
| 접속기록 구현 에이전트 | `.claude/agents/arko-privacy-auditlog.md` | ✅ |
|
||
| 요구사항 분석 에이전트 | `.claude/agents/arko-privacy-analyst.md` | ✅ |
|
||
| 구현 패턴 스킬(권한/접속/추적/오케스트레이터) | `.claude/skills/arko-privacy-*` | ✅ |
|
||
| 리뷰어 개인정보보호 점검항목 확장 | `.claude/agents/arko-reviewer.md` | ✅ |
|
||
|
||
---
|
||
|
||
## 5. 권장 착수 순서
|
||
|
||
1. **Ⅴ. 착수전 확인(55~58)** — 운영 환경 실측으로 리스크 R1 등 조기 해소 (구현 전 필수)
|
||
2. **Ⅰ-1) 권한관리(1~6)** — `getAuthorities()` 구현이 전체 권한통제의 뿌리 → 최우선
|
||
3. **Ⅱ. 인증체계(14~29)** — 인터셉터 3단 순서 확정 후 2단계 인증·인증수단 3종
|
||
4. **Ⅲ. 접속기록(30~44)** — 테이블·AOP·해시체인·배치
|
||
5. **Ⅳ. 화면(45~54)** — 백엔드 진척에 맞춰 frt/mnt 병행
|
||
6. **Ⅵ. 보안·품질(59~61)** — 각 기능 완료분 대상 상시 + 최종 웹취약점 점검
|
||
|
||
## 6. 발주기관 확정 대기 항목 (블로커)
|
||
|
||
| 항목 | 관련 # | 내용 |
|
||
|------|:------:|------|
|
||
| 계정 삭제 보존기간 | 12 | 취급자/회원 각 보존기간 정책 |
|
||
| 문자발송모듈 연동 규격 | 19 | KT-TCS / MCSAgent3.0 연동 스펙 |
|
||
|
||
---
|
||
|
||
_본 문서는 `개인정보보호_개발항목.docx`의 61개 개발항목을 소스 실측(2026-07-21)과 대조해 작성한 진행현황표이다. 코드 구현 진척 시 각 항목의 상태(⬜→🟡→✅)와 소스 실측 열을 갱신한다._
|