{ "version": "1.1", "id": "rls-three-preconditions", "title": "PostgreSQL RLS 적용 여부를 가르는 분기", "question": "현재 role과 table에서 RLS policy가 실제로 적용되는가?", "type": "data-flow", "direction": "TB", "audience": [ "백엔드 엔지니어" ], "summary": "RLS 활성 여부, 우회 role, owner와 FORCE RLS, applicable policy 유무를 차례로 구분한다.", "alt": "RLS 비활성은 policy 미적용으로, superuser와 BYPASSRLS는 우회로, owner는 FORCE 여부로 갈리고, policy 대상인데 applicable policy가 없으면 default deny가 되는 흐름도", "long_description": "PostgreSQL RLS를 세 개의 동시 전제로 보지 않는다. RLS가 활성화된 뒤 superuser 또는 BYPASSRLS인지, table owner인지와 FORCE RLS 여부를 확인한다. policy 대상 role에 applicable policy가 없으면 default deny이고, policy가 있으면 USING과 WITH CHECK를 평가한다.", "source_context": { "document": "docs/clean-architecture-backend-template/final/document.md", "document_sha256": "7c986b30b6ef3c12060b6749ee60d53e37d6994493d2703419732c9cab6077d8", "anchor": { "kind": "line", "value": 7400, "line": 7400 } }, "composition": { "profile": "two-zone-pipeline", "diagram_only": true, "reference_ids": [ "localization-pipeline" ], "rationale": "정책 적용 여부를 결정하는 검사 경로와 각 단계에서 빠져나가는 결과를 짧은 파이프라인으로 보여 준다.", "focus_node": "policy" }, "groups": [ { "id": "role", "label": "policy 적용 대상 판정", "evidence": [ { "start_line": 7400, "end_line": 7432 } ], "assumption": false }, { "id": "policy-zone", "label": "policy 존재와 평가", "evidence": [ { "start_line": 7400, "end_line": 7432 } ], "assumption": false } ], "nodes": [ { "id": "rls", "label": "RLS 활성 여부", "kind": "process", "role": "stage", "evidence": [ { "start_line": 7400, "end_line": 7432 } ], "assumption": false, "group": "role", "details": [ "no → policy 미적용" ] }, { "id": "subject", "label": "policy 적용 대상", "kind": "process", "role": "stage", "evidence": [ { "start_line": 7400, "end_line": 7432 } ], "assumption": false, "group": "role", "details": [ "superuser / BYPASSRLS → 우회", "owner + FORCE off → 우회", "non-owner 또는 owner + FORCE on → 대상" ] }, { "id": "policy", "label": "applicable policy", "kind": "process", "role": "stage", "evidence": [ { "start_line": 7400, "end_line": 7432 } ], "assumption": false, "group": "policy-zone", "emphasis": "primary", "details": [ "none → default deny", "exists → USING / WITH CHECK 평가" ] } ], "edges": [ { "id": "e1", "from": "rls", "to": "subject", "label": "RLS on", "kind": "request", "evidence": [ { "start_line": 7400, "end_line": 7432 } ], "assumption": false }, { "id": "e2", "from": "subject", "to": "policy", "label": "적용", "kind": "request", "evidence": [ { "start_line": 7400, "end_line": 7432 } ], "assumption": false, "emphasis": "primary" } ], "legend": [], "metadata": {} }