{ "version": "1.1", "id": "messaging-security-c03", "audience": [ "메시징 플랫폼을 읽는 사람" ], "source_context": { "document": "docs/clean-architecture-backend-template/final/document.md", "document_sha256": "8071fe71b3359d9cf60b95909c26c7b50653ce2f22bbc5fcf6988719bb91236d", "anchor": { "kind": "line", "value": 37830, "line": 37830 } }, "groups": [], "legend": [], "metadata": {}, "title": "교체와 소거의 순서", "question": "자격증명 회전은 어떤 순서로 일어나는가?", "type": "sequence", "direction": "LR", "summary": "compute 가 bin 락을 잡은 채 한 번만 fetch 하고, 교체본을 설치한 뒤 같은 호출자가 이전 세대를 소거한다.", "alt": "호출자가 compute 에 진입해 provider 를 resolve 하고 교체본을 설치한 뒤 이전 세대를 소거하는 순서.", "long_description": "SSOT §4.1 이 인용한 주석은 get → fetch → put → clear 에 동기화가 없던 시절 두 호출자가 같은 옛 런타임을 읽고 각자 교체본을 가져와, 한 교체본이 clear 도 없이 맵에서 사라지고 진 쪽이 이긴 쪽이 쓰던 material 을 지울 수 있었다고 적는다. 지금은 compute 가 이 키의 bin 락을 잡으므로 정확히 한 fetch 가 공개되고 이전 세대는 같은 호출자가 회수한다.", "composition": { "profile": "sequence", "diagram_only": true, "reference_ids": [ "payment-approval-sequence" ], "rationale": "설치가 소거보다 먼저라는 순서가 논지다. 그 순서가 빈 창을 없앤다.", "focus_node": "registry" }, "nodes": [ { "id": "caller", "label": "호출자", "kind": "service", "role": "participant", "evidence": [ { "start_line": 37836, "end_line": 37845 } ], "assumption": false }, { "id": "registry", "label": "CredentialRuntimeRegistry", "kind": "service", "role": "participant", "evidence": [ { "start_line": 37836, "end_line": 37845 } ], "assumption": false, "emphasis": "primary" }, { "id": "provider", "label": "자격증명 provider", "kind": "service", "role": "participant", "evidence": [ { "start_line": 37838, "end_line": 37845 } ], "assumption": false }, { "id": "map", "label": "resolved 맵", "kind": "store", "role": "participant", "evidence": [ { "start_line": 37843, "end_line": 37845 } ], "assumption": false } ], "edges": [ { "id": "m1", "from": "caller", "to": "registry", "label": "compute 진입", "kind": "request", "evidence": [ { "start_line": 37843, "end_line": 37845 } ], "assumption": false, "order": 1 }, { "id": "m2", "from": "registry", "to": "provider", "label": "resolve", "kind": "request", "evidence": [ { "start_line": 37838, "end_line": 37845 } ], "assumption": false, "order": 2 }, { "id": "m3", "from": "provider", "to": "registry", "label": "교체 자재", "kind": "response", "evidence": [ { "start_line": 37838, "end_line": 37845 } ], "assumption": false, "order": 3, "style": "dashed" }, { "id": "m4", "from": "registry", "to": "map", "label": "교체본 설치", "kind": "request", "evidence": [ { "start_line": 37843, "end_line": 37845 } ], "assumption": false, "order": 4, "emphasis": "primary" }, { "id": "m5", "from": "registry", "to": "map", "label": "이전 세대 소거", "kind": "request", "evidence": [ { "start_line": 37843, "end_line": 37845 } ], "assumption": false, "order": 5 } ] }