7.0.9 페이로드 대비 버전이 오른 패키지 31종과 코어의 CHANGELOG 최상단 절 날짜를 2026-09-04 로 맞췄다. 이어서 릴리즈 스크립트의 게이트를 브랜치 생성 없이 전수 실행한 결과, 파일 본문 누출 검사가 error 25건으로 릴리즈를 막고 있었다. 전부 이번 사이클에 들어온 것이다. - 확장 문서·코어 주석 20건이 공개 배포본에 없는 를 가리켰다. 공개되는 AGENTS.md 참조로 바꾸고, 참조된 9개 절의 실재를 전수 확인했다. 유일하게 빠져 있던 「독립 레이아웃의 글로벌 호스트 컴포넌트」절은 원래 동기화 대상이었으므로 AGENTS.md 에 반영했다. - 시나리오 매니페스트의 내부 문서 포인터는 소비자가 하나도 없어 제거했다. - 공개 테스트 3건이 내부 검사 스크립트를 열어 도구 간 리터럴을 대조하고 있었다. tests/** 는 배포 페이로드에 포함되고 는 제외되므로 배포본에서 원리상 성립할 수 없는 검사다. 대조를 그 도구 옆으로 옮기고 공개 테스트에는 자기 동작 단언만 남겼다. 존재 가드로 무마하지 않은 것은 그 경우 배포본에서 검사가 조용히 건너뛰어져 "검사하지 않음" 과 "통과" 가 구분되지 않기 때문이다. 옮긴 대조는 돌지 않으면 잠그지 못하므로 대상 파일 편집 시 자동 실행되도록 등록했다. 누출 검사 자체도 릴리즈 시점에만 돌아 위반이 다음 릴리즈까지 드러나지 않았으므로, 룰을 복제하지 않고 실행 시점만 세션 종료로 앞당겼다. 같은 검증 중 드러난 선행 결함 하나(이커머스 문서의 집계 블록 드리프트)도 함께 정리했다.
4.8 KiB
NHN KCP 휴대폰 본인확인 — 데이터 모델
모델·소유 테이블·마이그레이션·Enum · 진입점: AGENTS.md
모델
| 모델 | 테이블 | fillable | 관계 | 특성 |
|---|---|---|---|---|
KcpCertTransaction |
nhnkcp_cert_transactions |
5 | challenge→IdentityVerificationLog | - |
KcpIdentityRecord |
nhnkcp_identity_records |
15 | user→User | - |
sirsoft-verification_kginicis의 InicisIdentityRecord/InicisChallengeMapping과 대칭인
구조입니다 — KcpIdentityRecord가 PII 를 직접 보관하고(결제 플러그인들과의 근본적 차이),
KcpCertTransaction은 진행 중인 인증 시도만 다룹니다. 두 모델을 분리한 이유도 동일합니다
— 인증 세션(거래 하나)과 확인 결과(사용자당 최신 1건)는 생명주기가 다릅니다.
소유 테이블
| 테이블 | 모델 |
|---|---|
nhnkcp_cert_transactions |
KcpCertTransaction |
nhnkcp_identity_records |
KcpIdentityRecord |
nhnkcp_identity_records.user_id는 unique 제약을 갖습니다 — 한 사용자는 본인확인 결과를
1건만 보유하며, 재인증 시 기존 레코드를 갱신합니다. sirsoft-verification_kginicis와
동일한 설계로, "이 사용자가 본인확인을 완료했는가"를 단순 존재 조회 하나로 판정합니다.
마이그레이션
마이그레이션 2개.
| 파일 | 생성 테이블 | 변경 테이블 | down() |
|---|---|---|---|
2026_07_28_000001_create_nhnkcp_identity_records_table.php |
nhnkcp_identity_records |
nhnkcp_identity_records |
✅ |
2026_07_28_000002_create_nhnkcp_cert_transactions_table.php |
nhnkcp_cert_transactions |
nhnkcp_cert_transactions |
✅ |
sirsoft-verification_kginicis가 세 번째 마이그레이션으로 부가 필드를 nullable 완화한
것과 달리, 이 플러그인은 두 테이블 생성만으로 끝났습니다 — 아직 같은 종류의 스키마 보정이
필요했던 적이 없습니다. 향후 유사한 nullable 완화가 필요해지면 kginicis 의 사례(§코어 AGENTS.md
"소스 교정만으로는 기설치본이 낫지 않는다")를 참고합니다.
Enum
| Enum | backing | case 수 | case |
|---|---|---|---|
KcpDuplicateField |
string |
2 | di, ci |
sirsoft-verification_kginicis의 InicisDuplicateField와 case 구성이 동일합니다(di/ci)
— 두 벤더 모두 같은 개념(연계정보/연계정보 상위값)을 제공하기 때문입니다. duplicate_field
설정값과 KcpDuplicateIdentityChecker의 판정 컬럼 화이트리스트 양쪽에서 재사용되므로 Enum
으로 닫아 오타로 인한 "중복 없음" 오판정을 방지합니다.
Repository
| 클래스 | 종류 | 설명 |
|---|---|---|
KcpCertTransactionRepository |
구현 | nhnkcp_cert_transactions 테이블 Repository 구현체. |
KcpCertTransactionRepositoryInterface |
인터페이스 | nhnkcp_cert_transactions 테이블 Repository 계약. |
KcpIdentityLogQueryRepository |
구현 | KcpIdentityLogQueryRepositoryInterface 구현체. |
KcpIdentityLogQueryRepositoryInterface |
인터페이스 | 본 plugin 이 발행한 코어 IDV 로그의 보조 조회/갱신 계약. |
KcpIdentityRecordRepository |
구현 | nhnkcp_identity_records 테이블 Repository 구현체. |
KcpIdentityRecordRepositoryInterface |
인터페이스 | nhnkcp_identity_records 테이블 Repository 계약. |
3쌍으로 나뉜 것은 sirsoft-verification_kginicis와 같은 이유입니다 —
KcpCertTransactionRepository(진행 중인 인증 거래), KcpIdentityRecordRepository(완료된
PII), KcpIdentityLogQueryRepository(코어 IDV 로그를 이 플러그인 관점으로 좁혀 읽는
어댑터)가 각자 다른 데이터를 다룹니다. KcpDuplicateIdentityChecker(§architecture.md)는
Repository 가 아니라 판정 로직 클래스입니다 — 두 Repository 를 조합해 판정만 하고
데이터를 소유하지 않습니다.