chore: Worker Link tenant 무결성과 PostgreSQL RLS 보강 - #90
Open
krestar wants to merge 7 commits into
Open
Conversation
- Worker Link 발급 서비스가 ActorContext를 tenant 신뢰 원본으로 사용하도록 변경 - 첫 Repository 접근 전에 transaction-local company_id 설정 - 발급 Command에서 companyId와 issuedBy 제거 - tenant context가 Repository보다 먼저 설정되는 순서 테스트 추가
- Worker Link 자식 테이블에 company_id를 backfill하고 NOT NULL로 전환 - Worker Response, 업로드 파일 및 멱등성 기록에 tenant-aware 복합 FK 적용 - Worker Link 대체 관계를 동일 사업장 복합 FK와 RESTRICT 정책으로 변경 - WorkerDocument와 Task의 근로자·사업장 복합 무결성 적용 - 문서 등록 시 Task 존재 여부와 Task–Worker 일치 검증 - Worker Link persistence 쓰기·조회 경로에 companyId 전달 - V16 migration 실패 조건과 최초 배포 비호환 전제를 문서화 - H2 기능 테스트와 PostgreSQL migration 계약 테스트 보강
- 응답 업로드 파일에 사업장 단위 복합 UNIQUE 제약 추가 - 업로드 멱등성 파일 복합 FK 조회 인덱스 추가 - 동시 연결 시 발생한 특정 UNIQUE 위반을 도메인 오류로 변환 - 다른 데이터 무결성 오류가 잘못 변환되지 않도록 제약 이름과 SQLSTATE 검증 - V16 migration 및 PostgreSQL 스키마 계약 테스트 보강
- 업로드 중복 연결 예외를 application.port에서 application.error로 이동
- Worker Response Upload 정책을 직접 company_id 비교 방식으로 전환 - Worker Document Upload 멱등성 테이블에 tenant 격리 정책 추가 - V17에서는 RLS를 활성화하지 않고 정책만 준비 - PostgreSQL migration 정책 계약 테스트 보강 - 제한 runtime role의 Worker Link tenant 격리 테스트 추가 - RLS rollout 문서에 V17 적용 범위 반영
- Worker Link bootstrap이 ACTIVE 상태의 링크만 사업장을 반환하도록 제한 - DB 현재 시각을 기준으로 만료된 링크의 tenant bootstrap 차단 - ACTIVE, REVOKED, 만료 및 미등록 token hash PostgreSQL 테스트 추가 - Worker Response Upload의 교차 tenant INSERT 차단 테스트 보강 - PostgreSQL RLS rollout 문서에 bootstrap 조건 반영
본 커밋에서 다룬 문제점은 Demo 환경 테스트 중 발견 되었습니다. 테스트의 원활함을 위해 PR과는 무관한 주제지만, fix 조치 하였습니다. - 예약된 데모 파일의 내용이 변경되면 현재 classpath fixture로 원자적으로 교체 - 일반 파일이 아닌 storage key 경로는 덮어쓰지 않고 거부 - 동일 크기 변조 및 크기가 다른 구버전 fixture 복구 테스트 추가 - 데모 fixture 재실행 계약 문서화
2 tasks
Contributor
|
미안해요 재성님 제가 나중에 머지했어야했네요 ... |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
왜 필요한가요?
Worker Link 관련 자식 테이블은 기존 단일 FK만으로 응답·파일·멱등성 기록이 서로 다른 사업장에 연결되는 것을 DB에서 완전히 차단하지 못했습니다.
PR #87에서 추가된
worker_document.task_id또한(task_id, company_id)FK만으로는 같은 사업장에 속한 다른 근로자의 Task를 WorkerDocument에 연결할 수 있었습니다.또한 Worker Link RLS 정책과 token bootstrap을 실제 Worker Link 스키마에 맞게 완성하고, 제한 runtime role에서 tenant 격리가 유지되는지 PostgreSQL로 검증할 필요가 있습니다.
무엇이 바뀌나요?
API·도메인·DB 변경:
worker_response_upload와worker_document_upload_idempotency에company_id를 추가합니다.NOT NULL로 전환합니다.worker_link.replaces_link_id를 동일 사업장 복합 FK와ON DELETE RESTRICT로 전환합니다.worker_document(task_id, worker_id, company_id)복합 FK로 같은 사업장의 다른 근로자 Task 연결을 차단합니다.company_id를 전달합니다.권한·Workflow 변경:
ActorContext.companyId를 PostgreSQL tenant context에 바인딩합니다.company_id비교 방식으로 전환합니다.ACTIVE이고 DB 시각 기준 미만료인 링크만company_id를 반환합니다.ENABLE ROW LEVEL SECURITY를 실행하지 않습니다.AI·외부 연동 변경:
문서·배포 변경:
어떻게 검증했나요?
.\gradlew.bat clean test.\gradlew.bat build/health와 Swagger UI 확인Demo Seed 활성/비활성(clean Docker psql DB 환경) run 정상 작동도 확인하였습니다.
실행한 주요 PostgreSQL 테스트:
검증 결과:
보안·개인정보
company_id범위를 검사합니다.request_id로 추적됩니다.API·DB·운영 영향
배포 주의사항
화면 또는 응답 예시
외부 API 응답 형식 변경은 없습니다.