Files
T

147 lines
3.7 KiB
JSON

{
"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": {}
}