Skip to content

feat(db): PostgreSQL RLS 도입 기반과 제한 role 검증 추가#47

Merged
krestar merged 7 commits into
mainfrom
feat/34-rls-foundation
Jul 24, 2026
Merged

feat(db): PostgreSQL RLS 도입 기반과 제한 role 검증 추가#47
krestar merged 7 commits into
mainfrom
feat/34-rls-foundation

Conversation

@krestar

@krestar krestar commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

왜 필요한가요?

PostgreSQL RLS를 안전하게 도입하려면 실제 정책을 활성화하기 전에 Flyway와
애플리케이션의 DB 연결을 분리하고, transaction-local tenant context 및 connection
pool 비누수를 먼저 검증해야 합니다.

이 PR은 #34 전체 구현 중 foundation 단계만 다룹니다. 실제 bootstrap 함수, RLS
policy 및 RLS 활성화는 후속 PR에서 진행합니다.

무엇이 바뀌나요?

  • API·도메인·DB 변경:
    • API와 도메인 계약 변경은 없습니다.
    • Spring Boot runtime DataSource와 Flyway 연결 계정 설정을 분리했습니다.
    • H2 공통 migration과 PostgreSQL 전용 migration location을 분리했습니다.
    • 실제 RLS policy나 신규 Flyway migration은 추가하지 않았습니다.
  • 권한·Workflow 변경:
    • transaction 안에서만 app.company_id를 설정하는 tenant context adapter를
      추가했습니다.
    • 제한된 runtime role이 12개 tenant 테이블의 업무 DML만 수행하도록 권한 경계를
      검증했습니다.
    • SUPERUSER, BYPASSRLS, table owner, DDL, TRUNCATE, REFERENCES 권한이
      없음을 테스트했습니다.
    • Workflow 변경은 없습니다.
  • AI·외부 연동 변경:
    • 변경 없습니다.
  • 문서·배포 변경:
    • .env.example에 runtime/Flyway 계정 환경변수 이름을 분리했습니다.
    • README에 PostgreSQL 연결 설정과 전용 migration location을 설명했습니다.
    • 단계적 RLS 적용, Smoke Test 및 forward-only 복구 runbook을 추가했습니다.
    • 실제 role 생성과 Secret 주입은 [Deploy] PostgreSQL·AI Runtime 기반 데모 배포 구성 #9 범위로 남겨두었습니다.

어떻게 검증했나요?

  • ./gradlew clean test
  • ./gradlew build
  • /health와 Swagger UI 확인
  • 정상 요청
  • 잘못된 입력
  • 권한 부족
  • 다른 사업장 접근 차단
  • 필요한 상태 전이·Idempotency

테스트 환경과 결과:

  • PostgreSQL 17.10
  • .\gradlew.bat clean test
  • BUILD SUCCESSFUL in 5m 59s
  • 5 actionable tasks: 5 executed
  • 테스트 139개, 실패·오류·무시 0개
  • .\gradlew.bat build: BUILD SUCCESSFUL

제한된 DB runtime role의 권한 부족과 transaction-local context의 connection pool
비누수를 검증했습니다. 실제 RLS policy가 아직 없으므로 다른 사업장 행의 CRUD 차단은
후속 PR에서 검증합니다. API 및 Workflow 변경이 없어 요청 입력과 상태 전이 항목은
이번 PR 범위가 아닙니다.

보안·개인정보

  • DTO·로그·AI 입력에 불필요한 개인정보가 없습니다.
  • JWT, Worker Link 원본 토큰, API Key, 비밀번호가 없습니다.
  • 모든 사업장 데이터 접근에 company_id 범위를 검사합니다.
  • AI 결과가 자동 승인·발송되지 않습니다.
  • 중요한 변경이 AuditLog와 request_id로 추적됩니다.
  • 관련 Accepted ADR을 지켰거나 필요한 새 ADR을 이 PR에서 Proposed
    작성했습니다.
  • Server에 Prompt Builder·Provider SDK·모델 routing을 추가하지 않았습니다.

ADR-0004의 transaction-local context, 계정 분리, migration location 분리 및 단계적
RLS 활성화 결정을 따릅니다.

이번 PR은 업무 API나 감사 대상 상태를 변경하지 않으므로 AuditLog 이벤트를 추가하지
않았습니다. 실제 서비스 transaction과 RLS policy가 아직 연결되지 않아 전체 사업장
접근 검사는 후속 PR에서 완료합니다.

API·DB·운영 영향

  • Swagger/OpenAPI와 Notion 계약을 갱신했습니다.
  • Client에 알려야 할 호환성 변경을 적었습니다.
  • DB 변경에 Flyway migration이 있습니다.
  • migration 번호와 소유 Issue를 확인했고 다른 기능의 테이블을 미리 만들지
    않았습니다.
  • 환경변수는 이름만 .env.example에 적었습니다.
  • 배포 후 Smoke Test와 롤백 방법을 적었습니다.

Client API 호환성 변경은 없습니다.

PostgreSQL dev·prod 실행 환경은 다음 변수를 분리해 제공해야 합니다.

  • DB_RUNTIME_USERNAME
  • DB_RUNTIME_PASSWORD
  • DB_MIGRATION_USERNAME
  • DB_MIGRATION_PASSWORD

신규 schema migration은 없으며 현재 마지막 공통 migration은 V6입니다.
PostgreSQL 전용 RLS migration 번호는 후속 구현 직전에 최신 main과 진행 중인 PR을
다시 확인해 선택합니다. 실제 DB role 생성, 최소 GRANT 및 Secret 주입은 #9와
조율합니다.

Smoke Test와 forward-only 복구 절차를 문서화했습니다. 실제 staging 적용과 Smoke
Test 실행은 #9 및 RLS 활성화 후 진행합니다.

화면 또는 응답 예시

API 및 화면 변경이 없어 첨부하지 않습니다.

krestar added 6 commits July 24, 2026 13:29
- runtime과 Flyway 데이터베이스 연결 계정을 분리
- PostgreSQL 전용 migration location 설정
- 트랜잭션 단위 tenant context 어댑터 추가
- connection pool tenant context 비누수 테스트 추가
- RLS 단계적 도입 및 복구 절차 문서화
- V1~V5의 12개 tenant 테이블에 runtime DML 권한 검증 적용
- TRUNCATE, REFERENCES, DDL 및 RLS 우회 권한 차단 확인
- RLS 단계적 도입 문서에 현재 검증 대상 테이블 반영
- 최신 공통 migration 범위를 V1~V6로 수정
@krestar krestar linked an issue Jul 24, 2026 that may be closed by this pull request
36 tasks
@krestar krestar changed the title Feat/34 rls foundation feat(db): PostgreSQL RLS 도입 기반과 제한 role 검증 추가 Jul 24, 2026
@krestar
krestar requested a review from hywznn July 24, 2026 07:29

@hywznn hywznn left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

로컬용이랑 배포용이랑 구현이 나뉘었다고 판단하면 될 것같군요 수고하셨씁니다 !

@krestar
krestar merged commit 01b6f85 into main Jul 24, 2026
1 check passed
@krestar
krestar deleted the feat/34-rls-foundation branch July 24, 2026 08:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Security] PostgreSQL RLS 기반 사업장 2차 격리 안전 도입

2 participants