보안 (운영 다이제스트)
핵심 요약
보안 책임은 DevPay 플랫폼·판매자 서버·구매자 기기에 나뉩니다. 모든 코드와 환경을 플랫폼이 통제하지는 않습니다.
보안 기능 플래그를 켜기 전에 필수 거부 정책을 확인하고 브라우저·판매자 서버의 잔여 위험을 이해하세요.
docs/product/trust-model.md의 요약된 운영 읽기 — 그 파일과 실험 위협 모델이 규범입니다.
3자 분할
- DevPay — 라이선스 + entitlement 권한; 호스티드 호출만 미터링; SLA는 권한 가용성 + 자체 D1 레코드를 커버하고, 셀러 서버나 바이어 디바이스는 커버하지 않습니다.
- 셀러 — 소프트웨어, 기능 네임스페이스, BYOS 강제 서버, 서버 측 유료 기능 정확성, 고객 대면 액션으로서의 환불을 소유합니다.
- 바이어 — 공격자가 제어하는 환경 안의 라이선스 키 + 디바이스 키페어.
코드가 강제하는 fail-closed 규칙
- 누락된 행 / DB 오류 → 거부, 절대 권한 아님(auth, 테넌트 스코프, entitlement 게이트, 저장소 어댑터 모두 이를 따름).
- 셀러 스코프는 요청마다 DB에서 재검사(
seller_scope_db,seller_memberships) — JWT 클레임에서 신뢰되지 않음. - 공개 엔드포인트는 절대 자격 증명을 받지 않음 — 방문자 대면 코드에 임베드 가능한 것은
public_id뿐. - 토큰 무효화는 DB 기반:
token_version이 logout/deactivate/비밀번호 변경 시 올라 이전 토큰을 모두 죽입니다. - 웹훅 body는 절대 신뢰되지 않음 — Toss 웹훅은 서명 검증, 참조 검증 후 PG 상태를 재조회합니다.
security_events는 키/토큰/PII 없이 거부를 기록합니다.
중요한 기능 플래그
| 플래그 | 잘못됐을 때 리스크 |
|---|---|
LICENSE_SECURITY_ENABLED | PoP 플레인 노출 또는 조용한 부재 — 현재 부재(404), 모든 PoP 증거는 루프백 |
PAYMENT_LIVE_ENABLED | 실제 PG 결정 + 자격 증명이 있기까지 false 유지 필수 |
PAYMENT_PROVIDER | mock/toss만; portone → 503 |
DEV_AUTH / ALLOW_ACT_AS_SELLER | dev 탈출구 — 절대 프로덕션에 도달 금지 |
CORS_ALLOWED_ORIGINS | staging에서 명시적 목록; prod에서 *는 불가 |
운영해야 할 잔여 리스크
- 셀러는 자기 제품의 클라이언트 측 검사를 제거할 수 있습니다(구조적).
- 바이어 측 아날로그 홀 / 협력 릴레이 — 방지가 아닌 계량.
node:vm/스레드는 샌드박스 경계가 아닙니다 — protect 파이프라인은 호출자 금지 시크릿 옆에서 절대 실행 금지.- 키 로테이션은 하드 컷오버 — 진행 중인 entitlement가 죽습니다 (120초 TTL로 경계); 로테이션을 조정하세요.
- 레이트 리미팅은
/auth/login에만; 공개licenses/verify는 앱 레이어에서 무제한이고 셀러 발급NG-…키는 32비트 열거 가능 — verify를 oracle로 취급하고 모니터링하세요.
후보 SHA의 독립 보안 검증은 docs/security/product-red-team.md와 에이전트 릴리스 게이트 레코드에 있습니다 — 그것들은 증거 아티팩트이며, 이 페이지는 이를 재라벨하지 않습니다.