KISA 신고 4건(KVE-2026-1886/1887/1893/1894)을 검증하고, 미수정 2건과 동종 결함 전수 조사에서 나온 결함을 함께 조치했다. 권한 게이트 (KVE-2026-1893) - NHN KCP 관리자 주문 연동 7경로가 admin 보유 여부만 보고 세부 권한을 보지 않아, 업무 권한 없는 관리자가 주문번호·결제정보·수령인 연락처를 조회하고 에스크로 배송등록까지 할 수 있었다. 조회는 orders.read, 등록은 orders.update, 설정성 경로는 settings.read 로 게이트해 다른 PG 연동과 강도를 맞췄다. - 마케팅 채널 저장은 코어 플러그인 설정과 같은 저장소를 덮어쓰는 우회 경로라 core.plugins.update 를 부착했다. 첨부 해시 노출 (KVE-2026-1894 잔재) - 비밀글의 썸네일 URL 이 목록·상세 응답에 그대로 실려 첨부 해시가 노출됐다. 이미지 서빙은 이미 차단돼 있었으나 식별값 자체가 나갔다. 첨부 목록과 같은 게이트를 써서 값만 가리고 필드는 유지한다. 경쟁 조건 (KVE-2026-1886 + 전수 조사) - 쿠폰 차감을 조회 후 갱신에서 조건부 UPDATE 로 바꿔 1회 제한 쿠폰의 동시 사용을 막고, 선점당한 주문은 409 로 되돌린다. - 라이브 병렬 재현에서 그 롤백이 동작하지 않는 것을 확인했다. Action 훅 기본값이 큐 래핑 + afterCommit 이라 금전 처리가 호출자 커밋 뒤에 실행되고 있었다. 쿠폰·적립금 차감/복원 5개 구독에 sync 를 선언했고, 회귀 테스트는 손 등록이 아니라 실제 등록 경로를 태워 고정했다. - 동시 부분취소의 취소 누적 컬럼 lost update, 적립 lot 의 read-modify-write, 주문옵션당 적립 lot 중복 생성을 각각 행 잠금·컬럼 연산·유니크 제약으로 막았다. 기설치본의 중복 lot 은 인덱스 생성 전에 금액을 합산해 한 줄로 통합한다. 규정·문서 - sync 판정 기준을 hooks.md 에 명문화하고 /AGENTS.md Listener 표와 coverage manifest 에 반영했다. 같은 증상을 다시 만났을 때의 진단 경로를 트러블슈팅 사례로 남겼다.
9.2 KiB
9.2 KiB
Changelog
이 프로젝트의 모든 주요 변경사항을 기록합니다. 형식은 Keep a Changelog를 따르며, Semantic Versioning을 준수합니다.
[1.0.3] - 2026-08-21
Security
- 마케팅 수신동의 채널 설정 저장에 플러그인 설정 권한 검사를 추가했습니다. 이전에는 관리자 계정이면 플러그인 설정 권한이 없어도 채널 목록을 통째로 덮어쓸 수 있었습니다. 이제 플러그인 설정 화면의 다른 저장 경로와 같은 권한이 필요합니다.
[1.0.2] - 2026-08-19
Fixed
- 플러그인 설정 화면의 켜기/끄기 스위치가 레이아웃 편집기에서 편집 대상으로 선택되지 않던 문제를 수정했습니다.
- 채널 목록의 각 행이 같은 HTML 식별자를 공유하던 문제를 수정했습니다.
- 다크 모드에서 설정 화면의 채널 추가 버튼 색이 밝은 화면과 동일하게 표시되던 문제를 수정했습니다.
- 플러그인 설정 저장이 실패했을 때 실패 사유 대신 일반 안내 문구만 표시되던 문제를 수정했습니다. 이제 서버가 알려준 사유가 그대로 안내됩니다.
[1.0.1] - 2026-08-10
Fixed
- 데이터베이스에서 일부 컬럼의 설명이 비어 있던 문제를 바로잡았습니다. 회원을 가리키는 컬럼이 대상이며, 업그레이드하면 이미 운영 중인 데이터베이스에도 설명이 채워집니다(직접 적어 넣은 설명은 그대로 둡니다).
[1.0.0] - 2026-07-01
Fixed
- 마케팅 설정을 저장한 뒤 표시되는 안내 문구가 번역된 문장 대신 내부 식별자가 그대로 보이던 문제를 수정했습니다. 이제 사용 중인 언어에 맞는 안내 문구가 표시됩니다.
Added
- 레이아웃 편집기 데이터 소스 목록에서 이 확장이 제공하는 데이터 소스가 친화 명칭으로 표시되고, 어느 확장이 제공했는지 출처가 함께 표시됩니다.
Changed
- 마케팅 동의 관리 / 사용자 프로필 외형을 sirsoft-admin_basic 표준 시맨틱과 정합 — 다른 화면과 같은 결로 통일.
- 회원 등록 / 수정 화면의 마케팅 동의 카드를 다른 관리자 카드와 같은 결로 정합 — 카드 외형이 동일해지고, 항목 사이에 옅은 회색 분리선이 자동 적용되며, 카드 제목 우측의 확장 출처 배지가 항상 우측 끝으로 정렬됩니다.
- 회원 등록 / 수정 화면의 마케팅 동의 영역에서 채널 체크박스(예: 광고성 이메일 수신) 가 부모 동의 체크박스 아래로 들여쓰기되어 부모-자식 관계가 시각적으로 명확해졌습니다.
- 회원 등록 / 수정 화면의 마케팅 동의 영역에서 채널 항목의 식별자가 페이지 검사 시 여러 번 나타나던 회귀를 수정했습니다 (HTML 표준 위반 해소).
- 관리자 화면 좌우 정렬 컨테이너(섹션 헤더 · 액션바 · 카드 상단부 등) 외형을 표준 시맨틱(.flex-between)으로 정리 — 시각 변경 없음, 향후 톤 조정이 한 곳에서 가능.
- 플러그인 환경설정 화면의 하단 저장 버튼이 스크롤 중에도 화면에 고정되도록 개선.
- 채널 편집 모달의 채널 key 입력 외형을 관리자 표준 외형으로 정렬 — 시스템 채널 / 편집 모드에서 글자가 옅은 회색으로 표시되어 "수정 불가" 임을 한눈에 구분.
- 플러그인 표준 베이스를 따르도록 내부 구조 정비. 동의 처리 동작은 동일합니다.
- 코어 최소 요구 버전을 7.0.0-beta.8 로 상향.
- 플러그인 환경설정 화면의 폼 라벨 / 보조 설명 / 에러 메시지 시각 시맨틱을 sirsoft-admin_basic 표준 시맨틱과 정합 — 다른 관리자 화면과 같은 결로 통일.
- 플러그인 환경설정 화면 곳곳의 텍스트 톤 (보조 설명 · 라벨 · 본문 · 강조 · 작은 보조) 시각 시맨틱을 관리자 표준 시맨틱과 정합 — 같은 결의 글자 톤이 한 곳에서 일괄 조정 가능.
- 플러그인 환경설정 화면의 입력 행 컨테이너 / 입력 박스를 sirsoft-admin_basic 표준 시맨틱 (.row-stack / .input) 과 정합 — 표준 간격 + 행 사이 옅은 회색 구분선(1px) 이 자동 적용되어 외형이 일관 표시되도록 정리.
[1.0.0-beta.3] - 2026-05-11
Changed
- 기본 system 마케팅 동의 채널(이메일 수신) 라벨이 활성 언어팩으로 자동 보강되도록 변경
- sirsoft-page 의존성 제약을
>=1.0.0-beta.3로 정비 (번들 최신 버전과 동기화)
[1.0.0-beta.2] - 2026-04-20
Changed
- 코어 최소 요구 버전을 7.0.0-beta.2 로 상향
- sirsoft-page 의존성 버전 제약을 실제 릴리스 버전에 맞춰 정비
- 플러그인 의존성 관리를 manifest(plugin.json) 기준으로 일원화
[1.0.0-beta.1] - 2026-04-01
Changed
- 오픈 베타 릴리즈
[0.3.3] - 2026-03-30
Fixed
- 관리자 다크모드 레이아웃 수정 — plugin_settings.json에서 누락된
dark:variant 약 10건 추가 (text-gray, focus:ring 등)
[0.3.2] - 2026-03-30
Added
config/settings/defaults.json추가 — frontend_schema 정의로 프론트엔드 설정 노출 제어marketing_consent_terms_slug,third_party_consent_terms_slug,info_disclosure_terms_slug,channels를expose: false처리 — 프론트엔드 미참조 설정의 보안 노출 차단
[0.3.1] - 2026-03-30
Fixed
- 인덱스명 약어 수정 —
idx_mkt_consent_hist_user_created→idx_marketing_consent_histories_user_created(네이밍 규칙 준수)
[0.3.0] - 2026-03-29
Added
- 검색/필터/정렬 성능 향상을 위한 누락 인덱스 추가 — user_marketing_consent_histories([user_id+created_at] 사용자별 시간순 이력 조회)
[0.2.1] - 2026-03-28
Fixed
- 채널 삭제 시 즉시 API 호출로 반영되던 문제 수정 — 삭제 후 최종 저장 버튼 클릭 시에만 반영되도록 변경
- 저장 버튼이 channels API 검증을 거치도록 2단계 순차 호출로 변경 (channels 검증 → 설정 저장)
- 비활성화 모달(channel_deactivate_modal)이 즉시 API 호출 대신 상태만 변경하도록 수정
[0.2.0] - 2026-03-24
Added
- 마케팅 동의 데이터를 EAV 구조 기반 전용 테이블(
user_marketing_consents,user_marketing_consent_histories)로 전환 — 동의 항목별 독립 저장 및 이력 관리 - 각 동의 항목의 활성화 여부를 독립 설정(
*_enabled)으로 분리하고 비활성 항목은 가입/수정 폼에서 자동 제외 - 마케팅 동의 현황 조회 및 채널별 동의 현황 조회 공개 API 추가
- 관리자 사용자 상세 화면에서 마케팅 동의 현황 및 이력 조회 기능 추가 (MarketingAdminController)
- 동의항목 레이아웃을 1열 구성으로 변경하고 약관 모달에서 실제 약관 내용 표시 구현
- 채널 관리 UI 추가 — 채널 추가/편집/삭제 및 활성화 토글 기능
- 데이터 접근 계층을 Repository 패턴으로 분리하여 테스트 용이성과 유지보수성 개선
- PHP 백엔드에서 다국어 메시지를 사용할 수 있도록 PHP 전용 lang 파일 추가 (ko/en)
- 플러그인 레이아웃 JSON 파일 전체를 대상으로 렌더링 테스트 56개 작성 — 구조, 데이터 바인딩, 다국어, 다크모드 항목 검증
- 플러그인 프론트엔드 테스트 환경(Vitest) 구성
- 동의자가 있는 채널을 삭제하려 할 때 즉시 삭제 대신 비활성화를 안내하는 모달 추가
- 채널 이름을 한국어/영어로 각각 표시할 수 있도록 다국어 처리 추가
Fixed
- 채널 편집 모달 바깥 영역 클릭 시 실수로 닫히는 문제 수정
- 스피너·배지 컴포넌트에서 다크모드 색상이 적용되지 않던 문제 수정
- 마이페이지 프로필 저장 시 국가·언어 미선택 상태에서 오류가 발생하던 문제 수정
- 동일 이벤트가 여러 번 발생할 때 동의 이력이 중복 저장되던 문제 수정
Changed
- 관리자 화면 사용자 상세 폼의 다크모드 스타일 전반 개선
[0.1.3] - 2026-03-16
Changed
- 마이그레이션 통합 — 증분 마이그레이션을 테이블당 1개 create 마이그레이션으로 정리
- 라이선스 프로그램 명칭 정비
[0.1.2] - 2026-03-13
Added
- manifest에 license 필드 및 LICENSE 파일 추가
Changed
- 설정 레이아웃 경로를
resources/layouts/settings.json→resources/layouts/admin/plugin_settings.json으로 이동 (모듈과 동일한 구조 통일)
[0.1.1] - 2026-02-24
Changed
- 버전 체계 조정 (정식 출시 전 0.x 체계로 변경)
[0.1.0] - 2026-02-23
Added
- 마케팅 동의 플러그인 초기 구현
- 이메일 구독, 마케팅 동의, 제3자 제공 동의 관리
- MarketingConsent, MarketingConsentHistory 모델
- MarketingConsentService 비즈니스 로직
- MarketingConsentListener 훅 리스너
- 사용자 관리 화면 레이아웃 확장 (마케팅 동의 상세/폼/프로필)
- 회원가입 폼 마케팅 동의 항목 확장
- 플러그인 설정 UI
- 역할 기반 접근 제어 (마케팅 관리자)
- 다국어 지원 (ko, en)