Files
document-haness/docs/keycloak-session-store/final/assets/bff-store-lookup-keys/bff-store-lookup-keys.excalidraw
T
DongHyeonkaandClaude Opus 5 b2963105a8 docs(keycloak-session-store): import the session-storage lab as a new project
The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.

Follows the import procedure in README.md.

  source/     the originating repository verbatim — 78 documents, 28 SVGs,
              8 manifests, plus .source-revision recording the commit
  final/      the SSOT
    document.md   729 lines written from the 29 experiment documents, not
                  concatenated: what was predicted, what was measured, and
                  where the measurement itself was wrong
    evidence/raw    125 outputs, flattened to <experiment>__<file> because
                    the originals collided (01-baseline.txt appeared three
                    times) and the audit only globs the top level
    evidence/meta   one per raw file; command and exitCode are null and the
                    README says why rather than inventing them
    evidence/browser  22 captures
    assets/       three diagrams through techviz
    .techviz/     their VizSpecs

A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.

Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.

verify-pipeline.py passes. audit-records.py reports no issues.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 22:51:59 +09:00

755 lines
17 KiB
Plaintext

{
"type": "excalidraw",
"version": 2,
"source": "techviz-harness",
"elements": [
{
"id": "edge-client-store",
"type": "arrow",
"x": 568.0,
"y": 264.5,
"width": 160.0,
"height": 13.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": null,
"seed": 376014802,
"version": 1,
"versionNonce": 705557696,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"points": [
[
0.0,
0.0
],
[
80.0,
0.0
],
[
80.0,
13.0
],
[
160.0,
13.0
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "node-authorized-client",
"focus": 0,
"gap": 4
},
"endBinding": {
"elementId": "node-postgres",
"focus": 0,
"gap": 4
},
"startArrowhead": null,
"endArrowhead": "arrow",
"elbowed": true
},
{
"id": "edge-label-client-store",
"type": "text",
"x": 627.0,
"y": 259.0,
"width": 90,
"height": 24,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1256161226,
"version": 1,
"versionNonce": 1896155258,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 13,
"fontFamily": 5,
"text": "저장",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "저장",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "edge-lookup-client",
"type": "arrow",
"x": 220.0,
"y": 202.0,
"width": 160.0,
"height": 62.5,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": null,
"seed": 1699394798,
"version": 1,
"versionNonce": 79091282,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"points": [
[
0.0,
0.0
],
[
80.0,
0.0
],
[
80.0,
62.5
],
[
160.0,
62.5
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "node-request",
"focus": 0,
"gap": 4
},
"endBinding": {
"elementId": "node-authorized-client",
"focus": 0,
"gap": 4
},
"startArrowhead": null,
"endArrowhead": "arrow",
"elbowed": true
},
{
"id": "edge-label-lookup-client",
"type": "text",
"x": 256.0,
"y": 221.25,
"width": 136,
"height": 24,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1504789250,
"version": 1,
"versionNonce": 806223247,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 13,
"fontFamily": 5,
"text": "principal 이름으로 조회",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "principal 이름으로 조회",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "edge-lookup-session",
"type": "arrow",
"x": 220.0,
"y": 121.5,
"width": 170.5,
"height": 62.5,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": null,
"seed": 228157207,
"version": 1,
"versionNonce": 1803550816,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"points": [
[
0.0,
62.5
],
[
85.25,
62.5
],
[
85.25,
0.0
],
[
170.5,
0.0
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "node-request",
"focus": 0,
"gap": 4
},
"endBinding": {
"elementId": "node-app-session",
"focus": 0,
"gap": 4
},
"startArrowhead": null,
"endArrowhead": "arrow",
"elbowed": true
},
{
"id": "edge-label-lookup-session",
"type": "text",
"x": 284.25,
"y": 140.75,
"width": 90,
"height": 24,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1022718620,
"version": 1,
"versionNonce": 1009213693,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 13,
"fontFamily": 5,
"text": "세션 id 로 조회",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "세션 id 로 조회",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "edge-session-store",
"type": "arrow",
"x": 557.5,
"y": 108.5,
"width": 177.5,
"height": 13.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": null,
"seed": 1420190934,
"version": 1,
"versionNonce": 759421815,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"points": [
[
0.0,
13.0
],
[
88.75,
13.0
],
[
88.75,
0.0
],
[
177.5,
0.0
]
],
"lastCommittedPoint": null,
"startBinding": {
"elementId": "node-app-session",
"focus": 0,
"gap": 4
},
"endBinding": {
"elementId": "node-redis",
"focus": 0,
"gap": 4
},
"startArrowhead": null,
"endArrowhead": "arrow",
"elbowed": true
},
{
"id": "edge-label-session-store",
"type": "text",
"x": 625.25,
"y": 103.0,
"width": 90,
"height": 24,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1018479709,
"version": 1,
"versionNonce": 1687570089,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 13,
"fontFamily": 5,
"text": "저장",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "저장",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "node-request",
"type": "rectangle",
"x": 70.0,
"y": 151.0,
"width": 150.0,
"height": 84.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "dashed",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 383223514,
"version": 1,
"versionNonce": 417388610,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false
},
{
"id": "node-label-request",
"type": "text",
"x": 80.0,
"y": 161.0,
"width": 130.0,
"height": 64.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1089093729,
"version": 1,
"versionNonce": 909637075,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 15,
"fontFamily": 5,
"text": "브라우저 요청\nJSESSIONID",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "브라우저 요청\nJSESSIONID",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "node-app-session",
"type": "rectangle",
"x": 390.5,
"y": 86.0,
"width": 167.0,
"height": 71.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1710553737,
"version": 1,
"versionNonce": 1839332537,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false
},
{
"id": "node-label-app-session",
"type": "text",
"x": 400.5,
"y": 96.0,
"width": 147.0,
"height": 51.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 573778378,
"version": 1,
"versionNonce": 1579160282,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 15,
"fontFamily": 5,
"text": "Application Session\n조회 키: 세션 id",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Application Session\n조회 키: 세션 id",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "node-authorized-client",
"type": "rectangle",
"x": 380.0,
"y": 229.0,
"width": 188.0,
"height": 71.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#ffffff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 531288634,
"version": 1,
"versionNonce": 301523243,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false
},
{
"id": "node-label-authorized-client",
"type": "text",
"x": 390.0,
"y": 239.0,
"width": 168.0,
"height": 51.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 75370592,
"version": 1,
"versionNonce": 980967547,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 15,
"fontFamily": 5,
"text": "OAuth2AuthorizedClient\n조회 키: principal 이름",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "OAuth2AuthorizedClient\n조회 키: principal 이름",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "node-redis",
"type": "rectangle",
"x": 735.0,
"y": 60.0,
"width": 251.0,
"height": 97.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#e7f5ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 518178690,
"version": 1,
"versionNonce": 1422748266,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false
},
{
"id": "node-label-redis",
"type": "text",
"x": 745.0,
"y": 70.0,
"width": 231.0,
"height": 77.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1745522512,
"version": 1,
"versionNonce": 1421486581,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 15,
"fontFamily": 5,
"text": "Redis\nSPRING_SESSION_STORE_TYPE=redis",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "Redis\nSPRING_SESSION_STORE_TYPE=redis",
"autoResize": true,
"lineHeight": 1.25
},
{
"id": "node-postgres",
"type": "rectangle",
"x": 728.0,
"y": 229.0,
"width": 265.0,
"height": 97.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "#e7f5ff",
"fillStyle": "solid",
"strokeWidth": 2,
"strokeStyle": "solid",
"roughness": 1,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1035759464,
"version": 1,
"versionNonce": 1511157596,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false
},
{
"id": "node-label-postgres",
"type": "text",
"x": 738.0,
"y": 239.0,
"width": 245.0,
"height": 77.0,
"angle": 0,
"strokeColor": "#1e1e1e",
"backgroundColor": "transparent",
"fillStyle": "solid",
"strokeWidth": 1,
"strokeStyle": "solid",
"roughness": 0,
"opacity": 100,
"groupIds": [],
"frameId": null,
"index": null,
"roundness": {
"type": 3
},
"seed": 1404040862,
"version": 1,
"versionNonce": 1598470501,
"isDeleted": false,
"boundElements": [],
"updated": 0,
"link": null,
"locked": false,
"fontSize": 15,
"fontFamily": 5,
"text": "PostgreSQL\nJdbcOAuth2AuthorizedClientService",
"textAlign": "center",
"verticalAlign": "middle",
"containerId": null,
"originalText": "PostgreSQL\nJdbcOAuth2AuthorizedClientService",
"autoResize": true,
"lineHeight": 1.25
}
],
"appState": {
"gridSize": 10,
"viewBackgroundColor": "#ffffff",
"currentItemFontFamily": 5
},
"files": {}
}