{ "version": "1.1", "id": "open-questions-answered", "title": "열린 질문 네 개가 닿은 곳", "question": "설계로 못 푼 질문들은 어디에서 답을 얻었는가", "type": "architecture", "direction": "TB", "audience": [ "같은 질문을 안고 있는 백엔드 엔지니어" ], "summary": "네 질문 중 셋은 저장소가 아니라 스키마와 조회 키에서 답이 나왔고, 하나는 세션이 스냅샷이라는 성질에서 나왔다.", "alt": "네 개의 열린 질문이 각각 어느 실험 층에 닿아 어떤 구조적 원인으로 이어지는지 보이는 구성.", "long_description": "Q1 은 저장소를 밖으로 빼면 다중 인스턴스와 재시작은 풀리지만 덮어쓰기와 로그아웃 정리는 남는다는 답을 얻었고 원인은 기본키에 세션 id 가 없다는 것이었다. Q2 는 이긴 요청의 토큰조차 못 쓴다는 답이었다. Q3 은 세션과 토큰의 조회 키가 다르므로 각각 결정해야 한다는 답이었다. Q4 는 프록시가 헤더를 먼저 지워야 하고 IdP 의 클레임 변경은 재인증 전까지 반영되지 않는다는 답이었다.", "source_context": { "document": "docs/keycloak-session-store/final/document.md", "document_sha256": "1d44cba1905544d92f1d26ae36a8deb64a3db3914d6b488fd30d6ae7f8cfbabe", "anchor": { "kind": "heading", "value": "열린 질문 네 개에 대한 답", "line": 680 } }, "composition": { "profile": "component-flow", "diagram_only": true, "reference_ids": [ "payment-event-flow" ], "rationale": "질문이 어느 구조적 원인에 닿는가가 지배적 질문이다. 귀결 경로이므로 component-flow 를 골랐다." }, "groups": [], "nodes": [ { "id": "questions", "label": "열린 질문 네 개", "kind": "component", "role": "source", "emphasis": "primary", "description": "설계로는 답할 수 없었다.", "details": [ "Q1 · Q2 · Q3 · Q4" ], "evidence": [ { "start_line": 682, "end_line": 690 } ], "assumption": false }, { "id": "store-choice", "label": "저장소 선택", "kind": "process", "role": "control", "emphasis": "normal", "description": "다중 인스턴스와 재시작은 여기서 풀린다.", "details": [ "Redis · PostgreSQL" ], "evidence": [ { "start_line": 682, "end_line": 692 } ], "assumption": false }, { "id": "schema", "label": "스키마와 조회 키", "kind": "process", "role": "control", "emphasis": "warning", "description": "덮어쓰기와 정리 누락은 여기가 원인이다.", "details": [ "키에 세션 id 없음" ], "evidence": [ { "start_line": 682, "end_line": 694 } ], "assumption": false }, { "id": "snapshot", "label": "세션 스냅샷", "kind": "process", "role": "target", "emphasis": "warning", "description": "클레임 변경이 반영되지 않는 이유.", "details": [ "재인증까지 옛 값" ], "evidence": [ { "start_line": 682, "end_line": 696 } ], "assumption": false } ], "edges": [ { "id": "q-s", "from": "questions", "to": "store-choice", "label": "1차 검토", "kind": "request", "evidence": [ { "start_line": 682, "end_line": 692 } ], "assumption": false }, { "id": "s-sc", "from": "store-choice", "to": "schema", "label": "미해결 잔여", "kind": "request", "evidence": [ { "start_line": 682, "end_line": 694 } ], "assumption": false }, { "id": "sc-sn", "from": "schema", "to": "snapshot", "label": "최종 잔여", "kind": "request", "evidence": [ { "start_line": 682, "end_line": 696 } ], "assumption": false } ], "legend": [], "metadata": { "rationale": "네 질문을 나열하는 대신 공통 원인으로 모았다. 저장소 선택으로 풀리지 않는 것들이 한자리에 있다." } }