관리자 환경설정이 값을 저장은 하지만 실제 동작에는 닿지 않던 결함군을 정리했다. 설정 화면(min/max)·저장 검증(FormRequest)·런타임 적용(Service) 세 계층이 각자 리터럴을 들고 있어 서로 조용히 갈라지던 것이 공통 원인이다. 경계값 SSoT 도입: - config/core.php `settings_limits` 를 단일 출처로 두고, FormRequest 는 이 값으로 규칙을 만들고 화면은 설정 응답의 `_meta.limits` 로 같은 값을 받아 바인딩한다. - 게시판·이커머스도 각 모듈 config 의 limits 를 동일 구조로 노출한다. 적용되지 않던 정책을 실제로 적용: - 비밀번호 최소 길이·특수문자 필수(신규 지정 7개 경로. 로그인은 제외 — 정책을 올렸을 때 기존 회원이 자기 계정에 접근조차 못 하는 데드락을 막기 위함) - 계정 잠금 시간 0 = 무한대(전용 컬럼 분리. timestamp 상한과 NULL 규약 때문에 기존 컬럼 재사용이 불가능하다) + 관리자 수동 해제 경로 - 업로드 최대 크기·허용 확장자, 게시판 첨부 개수·댓글 깊이, 페이지 첨부 정책, 장바구니 수량·구매 한도, 마일리지 사용 한도, 주문 부가세 파생 결함: - 큐 Job(sync 드라이버)이 진행 중인 요청의 Request 바인딩을 덮어써, 뒤이어 실행되는 훅 리스너가 헤더를 잃고 조용히 건너뛰었다. Job 이 원 바인딩을 복원하도록 고치고, 전송 헤더가 필요한 리스너는 동기 실행으로 선언한다. - 확장 업데이트 실패 시 상태만 되돌리고 상태 캐시를 비우지 않아, 그 확장의 관리자 화면만 캐시 TTL(기본 하루) 동안 404 로 남았다. 실패 경로에도 무효화를 대칭으로 두고, 빈 목록 자체를 캐시하지 않는다. - 글 작성 시 첨부 파일이 Service 로 전달되지 않아 검증·권한은 통과하고 첨부만 사라졌다. - 환경설정 저장 실패 안내가 내부 설정 키를 그대로 노출했다(105개 항목에 라벨 부여). 재발 방지: - audit 룰 3종(레이아웃 경계 리터럴 / FormRequest 경계 불일치 / Service 재클램프) - 테스트 실행 범위 강제 훅(check-test-scope) - 트러블슈팅 사례 2건(큐 Job 요청 오염 / 확장 상태 캐시 고착) 공개 이슈: gnuboard/g7
44 lines
2.2 KiB
YAML
44 lines
2.2 KiB
YAML
# audit:allow test-scenario-coverage reason: |
|
|
# cross product 자동 전개는 audit 실행 환경의 fallback YAML 파서가 nested axes 를 읽지 못해
|
|
# 검출되지 않는다(다른 시나리오와 동일 한계). 본 변경은 백엔드 전용(스키마 경계 선언 +
|
|
# 폴백)이며 PHPUnit Unit 테스트가 경계 조합을 커버하고 green 이다.
|
|
|
|
feature: 본인인증 인증코드 길이 경계를 스키마가 선언 (C3)
|
|
|
|
description: |
|
|
메일 본인인증 Provider 의 `code_length` 경계를 설정 스키마가 선언하고,
|
|
서비스의 무명 클램프를 제거한다.
|
|
|
|
배경:
|
|
- 스키마가 경계를 선언하지 않아 서비스가 자체 상수로 `max(4, min(10, $length))` 방어했다.
|
|
설정에 12 를 넣으면 조용히 10 으로 뭉개져, 관리자는 12 자리로 설정했다고 믿지만
|
|
실제 발송 코드는 10 자리인 상태가 된다.
|
|
|
|
방침 (최소 범위):
|
|
- `getSettingsSchema()['code_length']` 에 `min`/`max` 를 넣어 **경계를 스키마가 선언**한다.
|
|
- 서비스의 클램프를 제거하고, 경계 위반 시 조용한 클램프 대신
|
|
**경고 로그 + 스키마 default(6) 폴백**. 런타임 인증 흐름 중단은 위험하므로 예외가 아니다.
|
|
- 관리자 API 가 스키마를 그대로 노출하므로 min/max 가 자동으로 UI 계약에 반영된다.
|
|
- 저장 검증 파이프라인 신설은 과잉 — `withConfig()` 쓰기 경로가 코어에 0건이다
|
|
(`coverage.json` 의 `extension-settings-schema-boundary-rules` 에 todo 로 기록).
|
|
|
|
axes:
|
|
provider: [mail]
|
|
code_length: [below_min, within_bounds, above_max, schema_declaration]
|
|
|
|
exclusions:
|
|
- { provider: mail, code_length: schema_declaration, reason: "선언 자체를 확인하는 축 — 코드 생성 조합과 교차하지 않음" }
|
|
|
|
effects:
|
|
- schema_declares_min_max_boundaries
|
|
- configured_length_applied_verbatim
|
|
- out_of_range_falls_back_to_default_with_warning
|
|
- generated_code_is_numeric
|
|
|
|
test_files:
|
|
- tests/Unit/Services/MailIdentityProviderCodeLengthTest.php
|
|
|
|
rules_layer_coverage:
|
|
- rule: service-config-value-clamp
|
|
coverage: 제거한 max(4, min(10, $length)) 형태가 재유입되면 이 룰이 검출한다
|