← /work
03Live2026

Agency ops OS · insider threat

인플루언서 기획사의 정산·딜 관리 시스템 (클라이언트 비공개). 권한 오남용을 감시가 아니라 구조로 막는 설계.

role단독 — 권한 모델 설계 · 백엔드/프론트 · 배포 · 운영
scroll ↓
permission model
8개 역할 (발췌)
대표
운영
정산
매니저
중앙 데이터 가드
행 단위 접근 통제 · 단일 경유
MySQL
감사 트리거 · 멱등 트랜잭션
모든 조회/쓰기가 여기를 지난다
역할 → DB 직접 쿼리 경로 없음 — 가드 우회는 구조적으로 불가
금전 실행 — 시스템 밖
시스템은 승인·기록까지만, 송금은 사람이 합니다.
권한 탈취 = 송금, 이 경로 자체가 없다
why

돈 데이터가 흐르는 내부 툴은 위협 모델이 다릅니다. 외부 침입보다 정당한 계정을 가진 내부자의 권한 오남용이 진짜 위협입니다. '누가 무엇을 보고, 무엇을 실행할 수 있는가.' 이 권한을 시스템이 어디까지 들고 있어야 하는가 — 그게 이 프로젝트의 본질 질문이었습니다.

moat
  • 01금전 실행을 시스템 밖(사람 승인)으로 강제 분리 — 계좌 API 미연동이 기능 부족이 아니라 보안 설계
  • 028개 역할 권한 매트릭스 + 모든 조회/쓰기가 중앙 데이터 가드 1곳을 경유하는 행 단위 접근 통제
  • 03감사 트리거로 전 변경 이력 기록 + 트랜잭션 멱등 처리
  • 04회귀 테스트를 배포 게이트로 상시 유지
hypothesis

내부자 위협은 감시(로그를 나중에 봄)로는 못 막습니다 — 구조(애초에 못 함)로 막아야 합니다. 권한은 시스템이 촘촘히 들고, 실행(돈이 나가는 행위)은 시스템 밖 사람 손에 남기면, 권한을 탈취해도 돈을 움직일 경로 자체가 없습니다.

constraints
  • 01계좌 API 를 붙이는 건 기술적으로 쉬움 — 안 붙이는 게 설계 결정
  • 028개 역할, 역할마다 봐야 할 것 / 보면 안 되는 것이 행 단위로 다름
  • 03운영하면서 요구가 계속 진화 — 전면 재설계 2회전을 감당해야 했음
  • 041인 개발 — 우회 지름길(가드 안 거치는 쿼리)을 스스로도 못 만들게 강제 필요
decisions · tradeoffs
  • 금전 실행을 시스템 밖으로 강제 분리 — 시스템은 승인·기록까지만, 송금은 사람이

    buy자동화 편의 포기 → 내부자가 시스템 권한만으로 돈을 움직이는 경로 구조적 제거

  • 모든 조회/쓰기가 중앙 데이터 가드 1곳을 경유 — 행 단위 접근 통제, 우회 경로 봉쇄

    buy개발 속도 ↓ (지름길 금지) → 권한 검사를 빼먹은 쿼리가 존재할 수 없는 구조

  • 감사 트리거로 전 변경 이력 자동 기록 + 트랜잭션 멱등 처리

    buy저장 비용·복잡도 ↑ → 사고 발생 시 '누가 언제 뭘' 추적이 즉시 가능

  • 운영 피드백으로 전면 재설계 2회전 — 부분 패치 대신 구조를 다시 세움

    buy재작업 비용 ↑ → 누적 패치로 무너지는 대신 구조 정합 유지

verified

전면 재설계 2회전 포함 라이브 운영 중입니다. 회귀 테스트를 배포 게이트로 상시 유지해 — 권한 경계 변경이 기존 격리를 깨면 배포가 막힙니다.

result

전면 재설계 2회전 포함 라이브 운영 중.

retro

가장 싼 보안은 위험한 기능을 애초에 안 만드는 것입니다. '권한은 시스템이, 실행은 사람이' — 이 분리가 이 시스템 보안의 심장이고, 기능 요청이 올 때마다 돌아가서 대조하는 기준선이 됐습니다.

stackPHPMySQLRBAC 8-roleAudit triggerInnoDB transaction