From e5ebaeb623ae0adaf1acf64cdbefbe831feecad9 Mon Sep 17 00:00:00 2001 From: DongHyeonka Date: Fri, 4 Sep 2026 09:58:10 +0900 Subject: [PATCH] docs: prove sessions are shared by PostgreSQL, not Infinispan replication Experiment 0 with three probes: cross-node refresh/logout, cache counter deltas around a single login, and cache entry ownership. Each node caches only what it handled; cache totals sum exactly to the database count. Co-Authored-By: Claude Opus 5 --- .../console-2026-09-04T00-53-39-252Z.log | 22 + .../console-2026-09-04T00-53-54-407Z.log | 7 + .../console-2026-09-04T00-54-13-939Z.log | 8 + .../console-2026-09-04T00-54-40-326Z.log | 7 + .../page-2026-09-04T00-53-40-561Z.yml | 2 + .../page-2026-09-04T00-53-48-279Z.yml | 1 + .../page-2026-09-04T00-53-54-595Z.yml | 2 + .../page-2026-09-04T00-54-14-322Z.yml | 104 ++++ .../page-2026-09-04T00-54-40-837Z.yml | 4 + .../page-2026-09-04T00-54-58-719Z.yml | 4 + .../lab/scripts/experiment-cache-ownership.sh | 55 ++ .../experiment-cache-replication-delta.sh | 83 +++ .../scripts/experiment-session-replication.sh | 207 ++++++++ .../01-cross-node-session.txt | 52 ++ .../session-replication/02-cache-delta.txt | 35 ++ .../03-cache-ownership.txt | 15 + docs/evidence/session-replication/README.md | 17 + .../keycloak-admin-sessions.png | Bin 0 -> 118503 bytes .../session-cache-entries-per-pod.png | Bin 0 -> 77560 bytes docs/experiment-00-session-replication.md | 489 ++++++++++++++++++ 20 files changed, 1114 insertions(+) create mode 100644 .playwright-mcp/console-2026-09-04T00-53-39-252Z.log create mode 100644 .playwright-mcp/console-2026-09-04T00-53-54-407Z.log create mode 100644 .playwright-mcp/console-2026-09-04T00-54-13-939Z.log create mode 100644 .playwright-mcp/console-2026-09-04T00-54-40-326Z.log create mode 100644 .playwright-mcp/page-2026-09-04T00-53-40-561Z.yml create mode 100644 .playwright-mcp/page-2026-09-04T00-53-48-279Z.yml create mode 100644 .playwright-mcp/page-2026-09-04T00-53-54-595Z.yml create mode 100644 .playwright-mcp/page-2026-09-04T00-54-14-322Z.yml create mode 100644 .playwright-mcp/page-2026-09-04T00-54-40-837Z.yml create mode 100644 .playwright-mcp/page-2026-09-04T00-54-58-719Z.yml create mode 100755 deploy/lab/scripts/experiment-cache-ownership.sh create mode 100755 deploy/lab/scripts/experiment-cache-replication-delta.sh create mode 100755 deploy/lab/scripts/experiment-session-replication.sh create mode 100644 docs/evidence/session-replication/01-cross-node-session.txt create mode 100644 docs/evidence/session-replication/02-cache-delta.txt create mode 100644 docs/evidence/session-replication/03-cache-ownership.txt create mode 100644 docs/evidence/session-replication/README.md create mode 100644 docs/evidence/session-replication/keycloak-admin-sessions.png create mode 100644 docs/evidence/session-replication/session-cache-entries-per-pod.png create mode 100644 docs/experiment-00-session-replication.md diff --git a/.playwright-mcp/console-2026-09-04T00-53-39-252Z.log b/.playwright-mcp/console-2026-09-04T00-53-39-252Z.log new file mode 100644 index 0000000..7402e20 --- /dev/null +++ b/.playwright-mcp/console-2026-09-04T00-53-39-252Z.log @@ -0,0 +1,22 @@ +[ 1289ms] [WARNING] is deprecated. Please include @ https://app2.hyeonworks.com/login:0 +[ 1417ms] [VERBOSE] [DOM] Input elements should have autocomplete attributes (suggested: "username"): (More info: https://goo.gl/9p2vKq) %o @ https://app2.hyeonworks.com/login:0 +[ 9024ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 9130ms] [WARNING] is deprecated. Please include @ https://app2.hyeonworks.com/:0 +[ 9456ms] [WARNING] Deprecation warning: value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info. +Arguments: +[0] _isAMomentObject: true, _isUTC: false, _useUTC: false, _l: undefined, _i: Thu, 27 Aug 2026 13:03:49, _f: undefined, _strict: undefined, _locale: [object Object] +Error + at a.createFromInputFallback (https://app2.hyeonworks.com/public/build/6029.0549a3fcb50e73c4b256.js:624:3) + at an (https://app2.hyeonworks.com/public/build/6029.0549a3fcb50e73c4b256.js:624:25647) + at un (https://app2.hyeonworks.com/public/build/6029.0549a3fcb50e73c4b256.js:624:29355) + at aa (https://app2.hyeonworks.com/public/build/6029.0549a3fcb50e73c4b256.js:624:29221) + at on (https://app2.hyeonworks.com/public/build/6029.0549a3fcb50e73c4b256.js:624:28938) + at sa (https://app2.hyeonworks.com/public/build/6029.0549a3fcb50e73c4b256.js:624:29715) + at A (https://app2.hyeonworks.com/public/build/6029.0549a3fcb50e73c4b256.js:624:29748) + at a (https://app2.hyeonworks.com/public/build/6029.0549a3fcb50e73c4b256.js:621:89) + at f (https://app2.hyeonworks.com/public/build/3719.c065b2e146c4c8347d51.js:1:4635) + at u (https://app2.hyeonworks.com/public/build/322.177b4bb01c5d74f9b28f.js:2473:47448) @ https://app2.hyeonworks.com/public/build/6029.0549a3fcb50e73c4b256.js:620 +[ 9605ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 10620ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 11527ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 13875ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 diff --git a/.playwright-mcp/console-2026-09-04T00-53-54-407Z.log b/.playwright-mcp/console-2026-09-04T00-53-54-407Z.log new file mode 100644 index 0000000..89aee66 --- /dev/null +++ b/.playwright-mcp/console-2026-09-04T00-53-54-407Z.log @@ -0,0 +1,7 @@ +[ 144ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 153ms] [WARNING] is deprecated. Please include @ https://app2.hyeonworks.com/explore:0 +[ 1077ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 2101ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 2922ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 7323ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 9370ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 diff --git a/.playwright-mcp/console-2026-09-04T00-54-13-939Z.log b/.playwright-mcp/console-2026-09-04T00-54-13-939Z.log new file mode 100644 index 0000000..c061400 --- /dev/null +++ b/.playwright-mcp/console-2026-09-04T00-54-13-939Z.log @@ -0,0 +1,8 @@ +[ 271ms] [WARNING] is deprecated. Please include @ https://app2.hyeonworks.com/explore?schemaVersion=1&orgId=1&panes=%7B%22a%22%3A%7B%22datasource%22%3A%22PBFA97CFB590B2093%22%2C%22queries%22%3A%5B%7B%22refId%22%3A%22A%22%2C%22expr%22%3A%22vendor_statistics_approximate_entries_unique%7Bcache%3D%5C%22sessions%5C%22%7D%22%2C%22range%22%3Atrue%2C%22instant%22%3Afalse%2C%22editorMode%22%3A%22code%22%2C%22legendFormat%22%3A%22%7B%7Bpod%7D%7D%20on%20%7B%7Bnode%7D%7D%22%2C%22datasource%22%3A%7B%22type%22%3A%22prometheus%22%2C%22uid%22%3A%22PBFA97CFB590B2093%22%7D%7D%5D%2C%22range%22%3A%7B%22from%22%3A%22now-15m%22%2C%22to%22%3A%22now%22%7D%7D%7D:0 +[ 346ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 1512ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 2433ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 6941ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 13188ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 21578ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 +[ 25998ms] [ERROR] WebSocket connection to 'wss://app2.hyeonworks.com/api/live/ws' failed: Error during WebSocket handshake: Unexpected response code: 400 @ https://app2.hyeonworks.com/public/build/1518.a3f1f690c084a37f01c7.js:362 diff --git a/.playwright-mcp/console-2026-09-04T00-54-40-326Z.log b/.playwright-mcp/console-2026-09-04T00-54-40-326Z.log new file mode 100644 index 0000000..5774735 --- /dev/null +++ b/.playwright-mcp/console-2026-09-04T00-54-40-326Z.log @@ -0,0 +1,7 @@ +[ 766ms] [WARNING] An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing. @ https://auth.hyeonworks.com/realms/master/protocol/openid-connect/3p-cookies/step1.html:0 +[ 781ms] [WARNING] An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing. @ https://auth.hyeonworks.com/realms/master/protocol/openid-connect/3p-cookies/step2.html:0 +[ 17929ms] [WARNING] An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing. @ https://auth.hyeonworks.com/realms/master/protocol/openid-connect/3p-cookies/step1.html:0 +[ 17949ms] [WARNING] An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing. @ https://auth.hyeonworks.com/realms/master/protocol/openid-connect/3p-cookies/step2.html:0 +[ 17981ms] [WARNING] An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can escape its sandboxing. @ https://auth.hyeonworks.com/realms/master/protocol/openid-connect/login-status-iframe.html:0 +[ 18447ms] [WARNING] For accessibility reasons an aria-label should be specified on nav groups if a title isn't @ https://auth.hyeonworks.com/resources/9v5yc/admin/keycloak.v2/assets/main-BbID33M6.js:7 +[ 18462ms] [WARNING] For accessibility reasons an aria-label should be specified on nav groups if a title isn't @ https://auth.hyeonworks.com/resources/9v5yc/admin/keycloak.v2/assets/main-BbID33M6.js:7 diff --git a/.playwright-mcp/page-2026-09-04T00-53-40-561Z.yml b/.playwright-mcp/page-2026-09-04T00-53-40-561Z.yml new file mode 100644 index 0000000..c07d1c0 --- /dev/null +++ b/.playwright-mcp/page-2026-09-04T00-53-40-561Z.yml @@ -0,0 +1,2 @@ +- main [ref=e7]: + - status "Loading" [ref=e10] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-09-04T00-53-48-279Z.yml b/.playwright-mcp/page-2026-09-04T00-53-48-279Z.yml new file mode 100644 index 0000000..25ab018 --- /dev/null +++ b/.playwright-mcp/page-2026-09-04T00-53-48-279Z.yml @@ -0,0 +1 @@ +- main [ref=f3e7] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-09-04T00-53-54-595Z.yml b/.playwright-mcp/page-2026-09-04T00-53-54-595Z.yml new file mode 100644 index 0000000..9f6bb91 --- /dev/null +++ b/.playwright-mcp/page-2026-09-04T00-53-54-595Z.yml @@ -0,0 +1,2 @@ +- main [ref=f6e7]: + - status "Loading" [ref=f6e10] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-09-04T00-54-14-322Z.yml b/.playwright-mcp/page-2026-09-04T00-54-14-322Z.yml new file mode 100644 index 0000000..f5d59a2 --- /dev/null +++ b/.playwright-mcp/page-2026-09-04T00-54-14-322Z.yml @@ -0,0 +1,104 @@ +- generic [ref=f9e4]: + - link "Skip to main content" [ref=f9e5] [cursor=pointer]: + - /url: "#pageContent" + - banner [ref=f9e7]: + - generic [ref=f9e8]: + - link [ref=f9e10] [cursor=pointer]: + - /url: / + - img "Grafana" [ref=f9e11] + - generic [ref=f9e14]: + - button "Search or jump to..." [ref=f9e18] [cursor=pointer] + - generic [ref=f9e19]: ctrl+k + - generic [ref=f9e23]: + - button "New" [ref=f9e24] [cursor=pointer] + - button "Help" [ref=f9e30] [cursor=pointer] + - button "News" [ref=f9e33] [cursor=pointer] + - button "Profile" [ref=f9e36] [cursor=pointer]: + - img "User avatar" [ref=f9e37] + - generic [ref=f9e38]: + - button "Open menu" [ref=f9e40] [cursor=pointer] + - navigation "Breadcrumbs" [ref=f9e43]: + - list [ref=f9e44]: + - listitem [ref=f9e45]: + - link "Home" [ref=f9e46] [cursor=pointer]: + - /url: / + - listitem [ref=f9e50]: + - link "Explore" [ref=f9e51] [cursor=pointer]: + - /url: /explore + - listitem [ref=f9e55]: + - generic "Prometheus" [ref=f9e56] + - generic [ref=f9e57]: + - button "Show more items" [ref=f9e60] [cursor=pointer] + - button "Toggle top search bar" [ref=f9e64] [cursor=pointer] + - main [ref=f9e70]: + - generic [ref=f9e72]: + - heading "Explore" [level=1] [ref=f9e73] + - generic [ref=f9e78]: + - navigation "Explore toolbar" [ref=f9e80]: + - navigation "Search links" [ref=f9e82]: + - generic [ref=f9e83]: + - button "Content outline" [expanded] [ref=f9e85] [cursor=pointer]: + - generic [ref=f9e88]: Outline + - generic [ref=f9e93] [cursor=pointer]: + - img "Prometheus logo" [ref=f9e95] + - textbox "Select a data source" [ref=f9e96]: + - /placeholder: "" + - button "Show more items" [ref=f9e102] [cursor=pointer] + - generic [ref=f9e106]: + - generic [ref=f9e110]: + - button "Collapse outline" [expanded] [ref=f9e112] [cursor=pointer]: + - img "arrow-from-right" [ref=f9e113] + - button "Queries" [ref=f9e116] [cursor=pointer]: + - img "arrow" [ref=f9e117] + - generic [ref=f9e124]: + - generic [ref=f9e126]: + - generic "Query editor row" [ref=f9e129]: + - generic [ref=f9e130]: + - generic [ref=f9e132]: + - generic [ref=f9e133]: + - button "Collapse query row" [expanded] [ref=f9e134] [cursor=pointer] + - generic [ref=f9e137]: + - button "Query editor row title A" [ref=f9e138] [cursor=pointer]: + - generic [ref=f9e139]: A + - emphasis [ref=f9e140]: (Prometheus) + - generic [ref=f9e141]: + - button "Show data source help" [ref=f9e143] [cursor=pointer] + - button "Duplicate query" [ref=f9e147] [cursor=pointer] + - button "Hide response" [ref=f9e151] [cursor=pointer] + - button "Remove query" [ref=f9e155] [cursor=pointer] + - button "Drag and drop to reorder" [ref=f9e158]: + - img "Drag and drop to reorder" [ref=f9e159] + - generic [ref=f9e162]: + - generic [ref=f9e163]: + - button "Kick start your query" [ref=f9e164] [cursor=pointer] + - generic [ref=f9e167]: + - generic [ref=f9e168] [cursor=pointer]: Explain + - generic [ref=f9e169]: + - checkbox "Explain Toggle switch" [ref=f9e170] + - generic "Toggle switch" [ref=f9e171] [cursor=pointer] + - radiogroup [ref=f9e176]: + - generic [ref=f9e177]: + - radio "Builder" [ref=f9e178] [cursor=pointer] + - generic [ref=f9e179] [cursor=pointer]: Builder + - generic [ref=f9e180]: + - radio "Code" [checked] [ref=f9e181] [cursor=pointer] + - generic [ref=f9e182] [cursor=pointer]: Code + - generic [ref=f9e184]: + - generic [ref=f9e186]: + - button "Loading metrics..." [disabled] [ref=f9e187] [cursor=pointer] + - generic [ref=f9e190]: Loading editor + - 'button "Options Legend: {{pod}} on {{node}} Format: Time series Step: auto Type: Range Exemplars: false" [ref=f9e198] [cursor=pointer]': + - generic [ref=f9e202]: + - heading "Options" [level=6] [ref=f9e203] + - generic [ref=f9e204]: + - generic [ref=f9e205]: "Legend: {{pod}} on {{node}}" + - generic [ref=f9e206]: "Format: Time series" + - generic [ref=f9e207]: "Step: auto" + - generic [ref=f9e208]: "Type: Range" + - generic [ref=f9e209]: "Exemplars: false" + - generic [ref=f9e210]: + - button "Add query" [ref=f9e211] [cursor=pointer] + - button "Query history" [ref=f9e215] [cursor=pointer] + - button "Query inspector" [ref=f9e219] [cursor=pointer] + - generic: + - main \ No newline at end of file diff --git a/.playwright-mcp/page-2026-09-04T00-54-40-837Z.yml b/.playwright-mcp/page-2026-09-04T00-54-40-837Z.yml new file mode 100644 index 0000000..65cfdc6 --- /dev/null +++ b/.playwright-mcp/page-2026-09-04T00-54-40-837Z.yml @@ -0,0 +1,4 @@ +- main [ref=f12e3]: + - generic [ref=f12e4]: + - progressbar "Contents" [ref=f12e5] + - paragraph [ref=f12e8]: Loading the Administration Console \ No newline at end of file diff --git a/.playwright-mcp/page-2026-09-04T00-54-58-719Z.yml b/.playwright-mcp/page-2026-09-04T00-54-58-719Z.yml new file mode 100644 index 0000000..4950df9 --- /dev/null +++ b/.playwright-mcp/page-2026-09-04T00-54-58-719Z.yml @@ -0,0 +1,4 @@ +- generic [active] [ref=f15e1]: + - progressbar "Loading" [ref=f15e4] + - generic: + - list \ No newline at end of file diff --git a/deploy/lab/scripts/experiment-cache-ownership.sh b/deploy/lab/scripts/experiment-cache-ownership.sh new file mode 100755 index 0000000..a7c2f65 --- /dev/null +++ b/deploy/lab/scripts/experiment-cache-ownership.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +# Experiment 0c — where does a session entry actually live? +# +# Experiment 0b showed keycloak-1's session cache never moved when keycloak-0 +# handled a login. That leaves two explanations: +# +# (a) a DISTRIBUTED cache with owners=1 — entries are spread across nodes by +# consistent hashing, and this one happened to land on keycloak-0; +# (b) a LOCAL cache — each node only ever caches what it handled itself. +# +# They are distinguished by driving logins at the OTHER node. Under (a) the +# entries would keep landing on both nodes regardless of who was asked. Under +# (b) the count rises only on the node that received the request. +set -uo pipefail + +NS="${NS:-keycloak-lab}" +N="${N:-5}" +K0_IP=$(kubectl -n "$NS" get pod keycloak-0 -o jsonpath='{.status.podIP}') +K1_IP=$(kubectl -n "$NS" get pod keycloak-1 -o jsonpath='{.status.podIP}') +ADMIN_PW=$(kubectl -n "$NS" get secret keycloak-lab-secrets \ + -o jsonpath='{.data.KC_BOOTSTRAP_ADMIN_PASSWORD}' | base64 -d) + +echo "수집 시각: $(date '+%Y-%m-%d %H:%M:%S %Z')" +echo " keycloak-0 = $K0_IP ($(kubectl -n "$NS" get pod keycloak-0 -o jsonpath='{.spec.nodeName}'))" +echo " keycloak-1 = $K1_IP ($(kubectl -n "$NS" get pod keycloak-1 -o jsonpath='{.spec.nodeName}'))" +echo + +kubectl -n "$NS" run kc-own --rm -i --restart=Never \ + --image=curlimages/curl:8.11.1 --quiet --command -- sh -c " +O=/tmp/o; : > \$O +ent() { + curl -s --retry 3 --max-time 20 http://\$1:9000/metrics \ + | grep -E '^vendor_statistics_approximate_entries_unique.cache=.sessions' \ + | awk '{print \$NF}' +} +login() { i=0; while [ \$i -lt $N ]; do + curl -s -o /dev/null -X POST http://\$1:8080/realms/master/protocol/openid-connect/token \ + -d grant_type=password -d client_id=admin-cli \ + -d username=admin -d 'password=$ADMIN_PW' + i=\$((i+1)); done; sleep 5; } +{ + printf '%-32s %12s %12s\n' '단계' 'k0 entries' 'k1 entries' + printf '%-32s %12s %12s\n' '시작' \"\$(ent $K0_IP)\" \"\$(ent $K1_IP)\" + login $K1_IP + printf '%-32s %12s %12s\n' 'keycloak-1 에 로그인 ${N}회' \"\$(ent $K0_IP)\" \"\$(ent $K1_IP)\" + login $K0_IP + printf '%-32s %12s %12s\n' 'keycloak-0 에 로그인 ${N}회' \"\$(ent $K0_IP)\" \"\$(ent $K1_IP)\" +} >> \$O +cat \$O +" 2>&1 | grep -v '^pod .* deleted$' + +echo +echo "=== 대조: PostgreSQL 에는 몇 건인가 ===" +kubectl -n "$NS" exec deploy/postgres -- psql -U keycloak -d keycloak -tAc \ + "select count(*) from offline_user_session where offline_flag='0'" 2>/dev/null | sed 's/^/ online 세션 /' diff --git a/deploy/lab/scripts/experiment-cache-replication-delta.sh b/deploy/lab/scripts/experiment-cache-replication-delta.sh new file mode 100755 index 0000000..c2b16b7 --- /dev/null +++ b/deploy/lab/scripts/experiment-cache-replication-delta.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +# Experiment 0b — does the Infinispan cache itself replicate, or do both nodes +# merely agree because they read the same database? +# +# Experiment 0 proved the two nodes give the same answers. That alone does NOT +# prove Infinispan replicated anything: with persistent-user-sessions (the +# Keycloak 26 default) the session is written to PostgreSQL, so two nodes reading +# one database would agree even with the cache disabled entirely. +# +# This script separates the two by measuring the cache counters on BOTH nodes +# around a single login. If the write on keycloak-0 shows up as cache activity +# on keycloak-1, the replication is real and not a database artifact. +set -uo pipefail + +NS="${NS:-keycloak-lab}" +K0_IP=$(kubectl -n "$NS" get pod keycloak-0 -o jsonpath='{.status.podIP}') +K1_IP=$(kubectl -n "$NS" get pod keycloak-1 -o jsonpath='{.status.podIP}') +ADMIN_PW=$(kubectl -n "$NS" get secret keycloak-lab-secrets \ + -o jsonpath='{.data.KC_BOOTSTRAP_ADMIN_PASSWORD}' | base64 -d) + +echo "수집 시각: $(date '+%Y-%m-%d %H:%M:%S %Z')" +echo + +# 파드 출력을 스트리밍으로 받으면 조각이 유실된다. 실제로 첫 시도에서 +# keycloak-1 의 스냅샷과 그 다음 마커가 통째로 사라져 델타가 0 으로 보였다. +# 파드 안에서 파일로 모았다가 마지막에 한 번만 내보낸다. +kubectl -n "$NS" run kc-delta --rm -i --restart=Never \ + --image=curlimages/curl:8.11.1 --quiet --command -- sh -c " +set -u +K0='http://$K0_IP'; K1='http://$K1_IP' +O=/tmp/o.txt; : > \$O +snap() { + curl -s --retry 3 --retry-connrefused --max-time 20 \$1:9000/metrics \ + | grep -E '^vendor_(statistics_(stores|hits|misses|approximate_entries_unique)|rpc_manager_replication_count)\{cache=\"(sessions|clientSessions)\"' \ + | sed 's/,cache_manager=\"keycloak\"//; s/,node=\"[^\"]*\"//' >> \$O +} +echo '###BEFORE_K0' >> \$O; snap \$K0 +echo '###BEFORE_K1' >> \$O; snap \$K1 +echo '###LOGIN' >> \$O +curl -s -o /dev/null -w 'http_code=%{http_code}\n' -X POST \ + \"\$K0:8080/realms/master/protocol/openid-connect/token\" \ + -d grant_type=password -d client_id=admin-cli \ + -d username=admin -d 'password=$ADMIN_PW' >> \$O +sleep 5 +echo '###AFTER_K0' >> \$O; snap \$K0 +echo '###AFTER_K1' >> \$O; snap \$K1 +echo '###END' >> \$O +cat \$O +" 2>&1 | grep -v '^pod .* deleted$' > /tmp/cache-delta.txt + +python3 - /tmp/cache-delta.txt <<'PY' +import re, sys +raw = open(sys.argv[1]).read() +blocks, cur = {}, None +for line in raw.splitlines(): + if line.startswith('###'): + cur = line[3:]; blocks[cur] = {} + elif cur and '{' in line: + m = re.match(r'(\S+?)\{cache="(\w+)"\}\s+(\S+)', line) + if m: + blocks[cur][(m.group(1), m.group(2))] = float(m.group(3)) + +print('=== 로그인은 keycloak-0 에만 보냈다 ===') +code = [l for l in raw.splitlines() if l.startswith('http_code=')] +print(' 로그인 응답: ' + (code[0] if code else '없음')) +for n in ('BEFORE_K0','BEFORE_K1','AFTER_K0','AFTER_K1'): + if not blocks.get(n): + print(f' !! {n} 스냅샷이 비었다 — 델타를 신뢰할 수 없다') +print() +hdr = f" {'계수기':<42} {'캐시':<15} {'전':>8} {'후':>8} {'증가':>7}" +for node in ('K0', 'K1'): + who = 'keycloak-0 (로그인을 받은 노드)' if node == 'K0' else 'keycloak-1 (아무 요청도 받지 않은 노드)' + print(f'=== {who} ===') + print(hdr) + b, a = blocks.get(f'BEFORE_{node}', {}), blocks.get(f'AFTER_{node}', {}) + for k in sorted(set(b) | set(a)): + before, after = b.get(k[0:2], 0.0), a.get(k[0:2], 0.0) + d = after - before + mark = ' ←' if d else '' + name = k[0].replace('vendor_statistics_', '').replace('vendor_rpc_manager_', 'rpc.') + print(f" {name:<42} {k[1]:<15} {before:>8.0f} {after:>8.0f} {d:>+7.0f}{mark}") + print() +PY diff --git a/deploy/lab/scripts/experiment-session-replication.sh b/deploy/lab/scripts/experiment-session-replication.sh new file mode 100755 index 0000000..7734060 --- /dev/null +++ b/deploy/lab/scripts/experiment-session-replication.sh @@ -0,0 +1,207 @@ +#!/usr/bin/env bash +# Experiment 0 — is a session created on one Keycloak node usable on the other? +# +# Forming a cluster is not the same as sharing session state. The Infinispan log +# says "cluster view (2)", but that only proves the members found each other. +# +# Design notes, learned the hard way: +# +# * Every probe has a CONTROL. A result from the far node means nothing unless +# the same call against the issuing node is also measured. The first version +# of this script reported "403 on keycloak-1" as if it were a replication +# failure; the issuing node returned 403 too, and the cause was a missing +# openid scope. Measure both, always. +# +# * Sessions are tracked by SID, not by count. Both the test login and the +# admin API calls create sessions for the same user, so counts are noisy. +# A specific session id either appears in a node's answer or it does not. +# +# * The probe is the REFRESH TOKEN grant, not userinfo. userinfo only validates +# a signature and can succeed on a node that knows nothing about the session. +# Refreshing requires the node to find the session, check it is alive, and +# write back a new refresh time — it actually touches the session store. +# +# Talks to pod IPs directly: going through nginx/Traefik would hide which node +# handled each request, which is the entire question. +# +# ./deploy/lab/scripts/experiment-session-replication.sh +set -uo pipefail + +NS="${NS:-keycloak-lab}" +OUT="${OUT:-/tmp/session-replication}" +mkdir -p "$OUT" + +PSQL="kubectl -n $NS exec deploy/postgres -- psql -U keycloak -d keycloak -tAc" + +echo "수집 시각: $(date '+%Y-%m-%d %H:%M:%S %Z')" +echo + +K0_IP=$(kubectl -n "$NS" get pod keycloak-0 -o jsonpath='{.status.podIP}') +K1_IP=$(kubectl -n "$NS" get pod keycloak-1 -o jsonpath='{.status.podIP}') +K0_NODE=$(kubectl -n "$NS" get pod keycloak-0 -o jsonpath='{.spec.nodeName}') +K1_NODE=$(kubectl -n "$NS" get pod keycloak-1 -o jsonpath='{.spec.nodeName}') +ADMIN_PW=$(kubectl -n "$NS" get secret keycloak-lab-secrets \ + -o jsonpath='{.data.KC_BOOTSTRAP_ADMIN_PASSWORD}' | base64 -d) + +echo "=== 대상 ===" +printf ' keycloak-0 %-14s %s\n' "$K0_IP" "$K0_NODE" +printf ' keycloak-1 %-14s %s\n' "$K1_IP" "$K1_NODE" +echo + +echo "=== [0] 실험 전 DB 세션 ===" +$PSQL "select offline_flag, count(*) from offline_user_session group by offline_flag" 2>/dev/null \ + | sed 's/^/ offline_flag=/' || echo " (없음)" +echo + +# 파드 하나 안에서 전 단계를 실행한다. 단계마다 파드를 새로 띄우면 토큰을 +# 단계 사이로 넘길 수 없다. +kubectl -n "$NS" run kc-probe --rm -i --restart=Never \ + --image=curlimages/curl:8.11.1 --quiet --command -- sh -c " +set -u +K0='http://$K0_IP:8080'; K1='http://$K1_IP:8080' +TOKEN_EP='/realms/master/protocol/openid-connect/token' +jget() { sed -n \"s/.*\\\"\$1\\\":\\\"\\([^\\\"]*\\)\\\".*/\\1/p\"; } + +# ── [1] keycloak-0 에서 로그인. 이 노드가 세션의 출생지다 ────────────────── +LOGIN=\$(curl -s -X POST \"\$K0\$TOKEN_EP\" \ + -d grant_type=password -d client_id=admin-cli \ + -d username=admin -d 'password=$ADMIN_PW') +echo '###STEP1_LOGIN'; echo \"\$LOGIN\" + +AT=\$(echo \"\$LOGIN\" | jget access_token) +RT=\$(echo \"\$LOGIN\" | jget refresh_token) + +# ── [2] 관리 API 조회용 토큰. 세션 오염을 피하려고 따로 하나만 더 만든다 ── +ADMTOK=\$(curl -s -X POST \"\$K0\$TOKEN_EP\" \ + -d grant_type=password -d client_id=admin-cli \ + -d username=admin -d 'password=$ADMIN_PW' | jget access_token) +CID=\$(curl -s -H \"Authorization: Bearer \$ADMTOK\" \ + \"\$K0/admin/realms/master/clients?clientId=admin-cli\" | jget id | head -1) + +# ── [3] 두 노드에 같은 질문을 한다: admin-cli 의 세션 목록 ──────────────── +echo '###STEP3_SESSIONS_K0' +curl -s -H \"Authorization: Bearer \$ADMTOK\" \ + \"\$K0/admin/realms/master/clients/\$CID/user-sessions?max=100\" +echo +echo '###STEP3_SESSIONS_K1' +curl -s -H \"Authorization: Bearer \$ADMTOK\" \ + \"\$K1/admin/realms/master/clients/\$CID/user-sessions?max=100\" +echo + +# ── [4] 대조군: keycloak-0 이 발급한 refresh token 을 keycloak-0 에 쓴다 ── +# 먼저 반대편에 써야 하므로 여기서는 쓰지 않고, 순서를 [5] 뒤로 미룬다. +# refresh token 은 회전(rotation)되므로 한 번 쓰면 옛 것이 무효가 된다. +# 따라서 '반대편 먼저'가 유일하게 의미 있는 순서다. + +# ── [5] 시험군: keycloak-0 이 발급한 refresh token 을 keycloak-1 에 쓴다 ── +echo '###STEP5_REFRESH_ON_K1' +curl -s -w '\nhttp_code=%{http_code}\n' -X POST \"\$K1\$TOKEN_EP\" \ + -d grant_type=refresh_token -d client_id=admin-cli -d \"refresh_token=\$RT\" + +RT2=\$(curl -s -X POST \"\$K1\$TOKEN_EP\" \ + -d grant_type=refresh_token -d client_id=admin-cli -d \"refresh_token=\$RT\" \ + | jget refresh_token) + +# ── [6] 무효화가 반대 방향으로도 전파되는가 ─────────────────────────────── +# keycloak-1 에서 로그아웃시키고, keycloak-0 에서 갱신을 시도한다. +echo '###STEP6_LOGOUT_VIA_K1' +curl -s -o /dev/null -w 'http_code=%{http_code}\n' -X POST \"\$K1/realms/master/protocol/openid-connect/logout\" \ + -d client_id=admin-cli -d \"refresh_token=\$RT2\" + +echo '###STEP7_REFRESH_ON_K0_AFTER_LOGOUT' +curl -s -w '\nhttp_code=%{http_code}\n' -X POST \"\$K0\$TOKEN_EP\" \ + -d grant_type=refresh_token -d client_id=admin-cli -d \"refresh_token=\$RT2\" +echo '###END' +" > "$OUT/raw.txt" 2>&1 + +sed -i '/^pod .* deleted$/d' "$OUT/raw.txt" + +python3 - "$OUT/raw.txt" <<'PY' | tee "$OUT/report.txt" +import base64, json, sys + +raw = open(sys.argv[1]).read() +blocks, cur = {}, None +for line in raw.splitlines(): + if line.startswith('###'): + cur = line[3:]; blocks[cur] = [] + elif cur is not None: + blocks[cur].append(line) +get = lambda k: '\n'.join(blocks.get(k, [])).strip() + +def j(s): + try: return json.JSONDecoder().raw_decode(s.strip())[0] + except Exception: return None + +def claims(tok): + p = tok.split('.')[1]; p += '=' * (-len(p) % 4) + return json.loads(base64.urlsafe_b64decode(p)) + +login = j(get('STEP1_LOGIN')) +if not login or 'access_token' not in login: + print('로그인 실패:', get('STEP1_LOGIN')[:300]); sys.exit(1) + +ac = claims(login['access_token']) +rc = claims(login['refresh_token']) +SID = ac['sid'] +print('=== [1] keycloak-0 에서 로그인 ===') +print(f" sid {SID}") +print(f" sub {ac.get('sub')}") +print(f" iss {ac.get('iss')}") +print(f" access 수명 {ac['exp']-ac['iat']}초") +print(f" refresh 수명 {rc['exp']-rc['iat']}초 typ={rc.get('typ')}") +print(f" refresh jti {rc.get('jti')}") + +print() +print('=== [3] 같은 sid 가 두 노드 모두에서 보이는가 ===') +for step, who in (('STEP3_SESSIONS_K0', 'keycloak-0 (발급 노드)'), + ('STEP3_SESSIONS_K1', 'keycloak-1 (반대편)')): + d = j(get(step)) + if d is None: + print(f' {who:24} 파싱 실패: {get(step)[:120]}'); continue + ids = [s.get('id') for s in d] + mark = '보임 ✔' if SID in ids else '없음 ✘' + print(f' {who:24} 세션 {len(ids)}개 중 대상 sid → {mark}') + for s in d: + if s.get('id') == SID: + print(f" ipAddress={s.get('ipAddress')} start={s.get('start')} lastAccess={s.get('lastAccess')}") + +def show(step, title, expect): + print(); print(f'=== {title} ===') + body = get(step) + code = [l for l in body.splitlines() if l.startswith('http_code=')] + code = code[0].split('=')[1] if code else '?' + d = j(body) + ok = '기대대로' if code == expect else f'기대({expect})와 다름' + print(f' HTTP {code} ← {ok}') + if d and 'access_token' in d: + c = claims(d['access_token']) + same = '동일 ✔' if c.get('sid') == SID else f"다름 ✘ ({c.get('sid')})" + print(f' 새 토큰의 sid → {same}') + elif d: + print(f" error {d.get('error')}") + print(f" error_description {d.get('error_description')}") + +show('STEP5_REFRESH_ON_K1', + '[5] keycloak-0 이 발급한 refresh token 을 keycloak-1 에 사용', '200') + +print(); print('=== [6] keycloak-1 을 통해 로그아웃 ===') +print(' ' + get('STEP6_LOGOUT_VIA_K1').strip()) + +show('STEP7_REFRESH_ON_K0_AFTER_LOGOUT', + '[7] 로그아웃 후 keycloak-0 에서 갱신 시도 (무효화 전파)', '400') + +open('/tmp/session-replication/sid.txt','w').write(SID) +PY + +SID=$(cat /tmp/session-replication/sid.txt 2>/dev/null) +echo +echo "=== [8] PostgreSQL 에서 그 sid 를 직접 확인 ===" +echo " 대상 sid: $SID" +$PSQL "select user_session_id, offline_flag, created_on, last_session_refresh + from offline_user_session where user_session_id='$SID'" 2>/dev/null \ + | sed 's/^/ /' | grep -q . \ + && $PSQL "select user_session_id||' | flag='||offline_flag||' | created='||created_on||' | refresh='||last_session_refresh + from offline_user_session where user_session_id='$SID'" 2>/dev/null | sed 's/^/ /' \ + || echo " 행 없음 — 로그아웃으로 삭제되었다" +echo +echo " 전체 세션 수: $($PSQL 'select count(*) from offline_user_session' 2>/dev/null)" diff --git a/docs/evidence/session-replication/01-cross-node-session.txt b/docs/evidence/session-replication/01-cross-node-session.txt new file mode 100644 index 0000000..3381c13 --- /dev/null +++ b/docs/evidence/session-replication/01-cross-node-session.txt @@ -0,0 +1,52 @@ +=================================================================== + 실험 0 — 한 노드에서 만든 세션이 다른 노드에서 쓰이는가 +=================================================================== + +### 사전 확인: 클러스터가 2 멤버로 형성되었는가 +2026-09-04 00:52:09,294 INFO [org.infinispan.CLUSTER] (executor-thread-1) ISPN000094: Received new cluster view for channel ISPN: [keycloak-1-48749(v=16.0.12)|5] (2) [keycloak-1-48749(v=16.0.12), keycloak-0-30843(v=16.0.12)] + name | ip | coord +------------------+-----------------+------- + keycloak-1-48749 | 10.42.0.35:7800 | t + keycloak-0-30843 | 10.42.1.43:7800 | f +(2 rows) + + +수집 시각: 2026-09-04 09:54:29 KST + +=== 대상 === + keycloak-0 10.42.1.43 kc-lab-2 + keycloak-1 10.42.0.35 kc-lab-1 + +=== [0] 실험 전 DB 세션 === + +=== [1] keycloak-0 에서 로그인 === + sid jiv3rVZi1VeaO07oVJkL_MYW + sub None + iss https://auth.hyeonworks.com/realms/master + access 수명 60초 + refresh 수명 1800초 typ=Refresh + refresh jti 7669cc49-4778-851f-3c49-65f76964ae8e + +=== [3] 같은 sid 가 두 노드 모두에서 보이는가 === + keycloak-0 (발급 노드) 세션 2개 중 대상 sid → 보임 ✔ + ipAddress=10.42.1.44 start=1788483164000 lastAccess=1788483164000 + keycloak-1 (반대편) 세션 2개 중 대상 sid → 보임 ✔ + ipAddress=10.42.1.44 start=1788483164000 lastAccess=1788483164000 + +=== [5] keycloak-0 이 발급한 refresh token 을 keycloak-1 에 사용 === + HTTP 200 ← 기대대로 + 새 토큰의 sid → 동일 ✔ + +=== [6] keycloak-1 을 통해 로그아웃 === + http_code=204 + +=== [7] 로그아웃 후 keycloak-0 에서 갱신 시도 (무효화 전파) === + HTTP 400 ← 기대대로 + error invalid_grant + error_description Session not active + +=== [8] PostgreSQL 에서 그 sid 를 직접 확인 === + 대상 sid: jiv3rVZi1VeaO07oVJkL_MYW + 행 없음 — 로그아웃으로 삭제되었다 + + 전체 세션 수: 1 diff --git a/docs/evidence/session-replication/02-cache-delta.txt b/docs/evidence/session-replication/02-cache-delta.txt new file mode 100644 index 0000000..fd37f31 --- /dev/null +++ b/docs/evidence/session-replication/02-cache-delta.txt @@ -0,0 +1,35 @@ +=================================================================== + 실험 0b — Infinispan 이 복제한 것인가, DB 를 같이 본 것인가 +=================================================================== + +수집 시각: 2026-09-04 09:54:41 KST + +=== 로그인은 keycloak-0 에만 보냈다 === + 로그인 응답: http_code=200 + +=== keycloak-0 (로그인을 받은 노드) === + 계수기 캐시 전 후 증가 + rpc.replication_count clientSessions 1 1 +0 + rpc.replication_count sessions 1 1 +0 + approximate_entries_unique clientSessions 1 2 +1 ← + approximate_entries_unique sessions 1 2 +1 ← + hits clientSessions 2 2 +0 + hits sessions 2 2 +0 + misses clientSessions 2 3 +1 ← + misses sessions 3 4 +1 ← + stores clientSessions 2 3 +1 ← + stores sessions 2 3 +1 ← + +=== keycloak-1 (아무 요청도 받지 않은 노드) === + 계수기 캐시 전 후 증가 + rpc.replication_count clientSessions 7 7 +0 + rpc.replication_count sessions 7 7 +0 + approximate_entries_unique clientSessions 0 0 +0 + approximate_entries_unique sessions 0 0 +0 + hits clientSessions 4 4 +0 + hits sessions 4 4 +0 + misses clientSessions 0 0 +0 + misses sessions 0 0 +0 + stores clientSessions 1 1 +0 + stores sessions 1 1 +0 + diff --git a/docs/evidence/session-replication/03-cache-ownership.txt b/docs/evidence/session-replication/03-cache-ownership.txt new file mode 100644 index 0000000..5ff35f4 --- /dev/null +++ b/docs/evidence/session-replication/03-cache-ownership.txt @@ -0,0 +1,15 @@ +=================================================================== + 실험 0c — 세션 엔트리는 어느 노드에 있는가 (로컬 캐시인가 분산인가) +=================================================================== + +수집 시각: 2026-09-04 09:54:54 KST + keycloak-0 = 10.42.1.43 (kc-lab-2) + keycloak-1 = 10.42.0.35 (kc-lab-1) + +단계 k0 entries k1 entries +시작 2.0 0.0 +keycloak-1 에 로그인 5회 2.0 5.0 +keycloak-0 에 로그인 5회 7.0 5.0 + +=== 대조: PostgreSQL 에는 몇 건인가 === + online 세션 12 diff --git a/docs/evidence/session-replication/README.md b/docs/evidence/session-replication/README.md new file mode 100644 index 0000000..da6e7f6 --- /dev/null +++ b/docs/evidence/session-replication/README.md @@ -0,0 +1,17 @@ +# 실험 0 — 세션 복제 증거 + +수집: 2026-09-04 09:54 KST · Keycloak 26 / Infinispan 16.0.12 / PostgreSQL 16 +해설: [`docs/experiment-00-session-replication.md`](../../experiment-00-session-replication.md) + +| 파일 | 무엇을 보여주는가 | +|---|---| +| `01-cross-node-session.txt` | 클러스터 2멤버 확인 → keycloak-0 로그인 → 같은 sid 가 양쪽에서 보임 → **keycloak-1 이 refresh 성공(200)** → keycloak-1 로그아웃 → **keycloak-0 갱신 실패(400)** → DB 행 삭제 확인 | +| `02-cache-delta.txt` | 로그인 하나를 사이에 둔 양쪽 노드의 캐시 계수기. **keycloak-1 은 전부 +0** | +| `03-cache-ownership.txt` | 로그인을 반대편에 몰아준 결과. **요청을 받은 노드에서만 엔트리가 는다.** 캐시 합 7+5 = DB 12 | +| `session-cache-entries-per-pod.png` | 위 사실의 시계열. 파란 선(keycloak-1)이 0에 붙어 있는 동안 초록 선(keycloak-0)만 14까지 오른다 | +| `keycloak-admin-sessions.png` | 관리 콘솔의 Sessions 화면. 브라우저는 nginx→Traefik 을 거쳐 두 파드 중 하나에 닿지만 **어느 파드가 만든 세션이든 전부 보인다** | + +## 핵심 한 줄 + +클러스터는 형성되지만 **세션 엔트리는 노드를 건너가지 않는다.** +두 노드가 같은 답을 하는 이유는 Infinispan 복제가 아니라 **같은 PostgreSQL** 이다. diff --git a/docs/evidence/session-replication/keycloak-admin-sessions.png b/docs/evidence/session-replication/keycloak-admin-sessions.png new file mode 100644 index 0000000000000000000000000000000000000000..4e4d91902a45977f879dbf74d77a26373bfb6fbe GIT binary patch literal 118503 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 literal 0 HcmV?d00001 diff --git a/docs/evidence/session-replication/session-cache-entries-per-pod.png b/docs/evidence/session-replication/session-cache-entries-per-pod.png new file mode 100644 index 0000000000000000000000000000000000000000..309ba16123b611b44f05ba6cd20962b1ea9a3c90 GIT binary patch literal 77560 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%0Dl?EZJ%C!COjm07N_5$IMwUCHrZiJA?0&TC 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 z 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�$snC0Fpo6B6#DiGAoW{X}`8% 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 7800을 막았더니 세션이 깨졌다 → 역시 세션은 7800으로 복제되는구나 + +실제로는 7800으로 세션이 오가지 않는다는 것을 **먼저** 알아야, 7800을 막았을 +때 깨지는 것이 무엇인지 정확히 말할 수 있다. + +--- + +## 2. 실험 설계에서 배운 것 세 가지 + +측정값보다 **어떻게 측정할지**에서 더 많이 틀렸다. 세 번 고쳤다. + +### 2-1. 대조군 없는 측정은 해석할 수 없다 + +첫 판본은 이렇게 보고했다. + +``` +=== [4] keycloak-0 이 발급한 토큰을 keycloak-1 이 받는가 === + http_code=403 +``` + +**403을 "복제 실패"로 읽을 뻔했다.** 발급 노드에도 같은 요청을 보내보니 + +``` +--- userinfo, scope 없음 --- + k0(발급노드) 403 + k1(반대편) 403 +--- 403 본문 --- +WWW-Authenticate: Bearer realm="master", error="insufficient_scope", + error_description="Missing openid scope" +``` + +**양쪽 다 403이었다.** 원인은 복제가 아니라 요청에 `openid` scope가 없다는 +것이었다. 오히려 **두 노드가 똑같이 답했다는 사실 자체가 일치의 증거**였다. + +> **원칙** — 반대편 노드의 응답은 발급 노드의 응답과 나란히 놓기 전까지 +> 아무 의미가 없다. 시험군만 재는 측정은 측정이 아니다. + +### 2-2. 개수가 아니라 식별자로 추적한다 + +`client-session-stats`가 `active=2`를 돌려줬다. 그런데 스크립트 자체가 +로그인을 두 번 하고(시험용 + 관리 API 호출용) 있었다. **개수는 실험 도구가 +만든 잡음에 그대로 오염된다.** + +바꾼 방식: 토큰의 `sid`를 뽑아, 각 노드의 세션 목록에 **그 sid가 있는지**를 +본다. 개수가 몇이든 상관없다. + +``` + keycloak-0 (발급 노드) 세션 2개 중 대상 sid → 보임 ✔ + keycloak-1 (반대편) 세션 2개 중 대상 sid → 보임 ✔ +``` + +### 2-3. 세션 저장소를 실제로 건드리는 탐침을 골라야 한다 + +| 탐침 | 하는 일 | 적합한가 | +|---|---|---| +| `userinfo` | 서명 검증 + scope 확인 | **아니다.** 세션을 몰라도 통과할 수 있다 | +| **`refresh_token` 그랜트** | 세션을 찾고, 살아있는지 보고, 갱신 시각을 쓴다 | **그렇다** | + +refresh는 **읽고 쓴다.** 그래서 "저 노드가 이 세션을 정말로 아는가"에 답한다. + +여기에 더해 refresh token은 **회전(rotation)** 된다 — 한 번 쓰면 옛 것이 +무효가 된다. 따라서 **반대편 노드에 먼저 써야** 한다. 발급 노드에 먼저 쓰면 +시험군에 쓸 토큰이 사라진다. 대조군과 시험군의 순서가 강제된다. + +--- + +## 3. 실험 0 — 교차 노드 세션 사용 + +### 실행 + +```bash +kubectl -n keycloak-lab exec deploy/postgres -- \ + psql -U keycloak -d keycloak -c "delete from offline_user_session" +kubectl -n keycloak-lab rollout restart statefulset/keycloak # 캐시를 비운다 +./deploy/lab/scripts/experiment-session-replication.sh +``` + +nginx나 Traefik을 거치지 않고 **파드 IP로 직접** 말을 건다. 로드밸런서를 +거치면 어느 노드가 처리했는지가 감춰지는데, 그게 바로 이 실험의 질문이다. + +### 결과 — [`01-cross-node-session.txt`](evidence/session-replication/01-cross-node-session.txt) + +``` +### 사전 확인: 클러스터가 2 멤버로 형성되었는가 +ISPN000094: Received new cluster view for channel ISPN: + [keycloak-1-48749(v=16.0.12)|5] (2) [keycloak-1-48749, keycloak-0-30843] + + name | ip | coord +------------------+-----------------+------- + keycloak-1-48749 | 10.42.0.35:7800 | t + keycloak-0-30843 | 10.42.1.43:7800 | f + +=== 대상 === + keycloak-0 10.42.1.43 kc-lab-2 + keycloak-1 10.42.0.35 kc-lab-1 + +=== [1] keycloak-0 에서 로그인 === + sid jiv3rVZi1VeaO07oVJkL_MYW + iss https://auth.hyeonworks.com/realms/master + access 수명 60초 + refresh 수명 1800초 typ=Refresh + +=== [3] 같은 sid 가 두 노드 모두에서 보이는가 === + keycloak-0 (발급 노드) 세션 2개 중 대상 sid → 보임 ✔ + keycloak-1 (반대편) 세션 2개 중 대상 sid → 보임 ✔ + +=== [5] keycloak-0 이 발급한 refresh token 을 keycloak-1 에 사용 === + HTTP 200 ← 기대대로 + 새 토큰의 sid → 동일 ✔ + +=== [6] keycloak-1 을 통해 로그아웃 === + http_code=204 + +=== [7] 로그아웃 후 keycloak-0 에서 갱신 시도 (무효화 전파) === + HTTP 400 ← 기대대로 + error invalid_grant + error_description Session not active + +=== [8] PostgreSQL 에서 그 sid 를 직접 확인 === + 행 없음 — 로그아웃으로 삭제되었다 +``` + +**네 가지가 모두 기대대로다.** + +| | 확인된 것 | +|---|---| +| 조회 | 같은 sid가 양쪽에서 보인다 | +| **쓰기** | keycloak-0의 refresh token을 keycloak-1이 받아 갱신했고, **sid가 유지된다** | +| **역방향 무효화** | keycloak-1의 로그아웃이 keycloak-0의 갱신을 막았다 | +| 영속 | 로그아웃과 함께 DB 행이 사라졌다 | + +**`sid`는 JWT 안에만 있는 값이 아니다.** PostgreSQL의 +`OFFLINE_USER_SESSION.user_session_id` 컬럼에 **문자 그대로** 들어 있다. + +--- + +## 4. 실험 0b — 복제인가, 같은 DB를 본 것인가 + +실험 0은 "두 노드가 같은 답을 한다"까지만 증명한다. **그것으로는 Infinispan이 +복제했다고 말할 수 없다.** `persistent-user-sessions`(Keycloak 26 기본값)에서는 +세션이 PostgreSQL에 기록되므로, **캐시를 아예 꺼도 두 노드는 같은 답을 한다.** + +가르는 방법: 로그인 한 번을 사이에 두고 **양쪽 노드의 캐시 계수기**를 잰다. + +### 결과 — [`02-cache-delta.txt`](evidence/session-replication/02-cache-delta.txt) + +``` +=== 로그인은 keycloak-0 에만 보냈다 === + 로그인 응답: http_code=200 + +=== keycloak-0 (로그인을 받은 노드) === + 계수기 캐시 전 후 증가 + approximate_entries_unique sessions 1 2 +1 ← + stores sessions 2 3 +1 ← + misses sessions 3 4 +1 ← + rpc.replication_count sessions 1 1 +0 + +=== keycloak-1 (아무 요청도 받지 않은 노드) === + approximate_entries_unique sessions 0 0 +0 + stores sessions 1 1 +0 + hits sessions 4 4 +0 + rpc.replication_count sessions 7 7 +0 +``` + +**keycloak-1의 계수기가 하나도 움직이지 않았다.** 엔트리도 0, 저장도 0. + +그리고 keycloak-1의 `sessions` 캐시 엔트리는 **처음부터 끝까지 0**이다. +keycloak-0이 세션을 9개 들고 있는 동안에도 0이었다. + +--- + +## 5. 실험 0c — 엔트리는 어느 노드에 있는가 + +0b의 결과에는 두 가지 설명이 가능하다. + +| | | +|---|---| +| (a) **분산 캐시 + owners=1** | 일관 해싱으로 흩어지는데 이번 건이 우연히 keycloak-0에 떨어졌다 | +| (b) **로컬 캐시** | 각 노드는 자기가 처리한 것만 캐시한다 | + +**반대편 노드에 로그인을 몰아주면 갈린다.** (a)라면 어느 쪽에 요청하든 엔트리는 +양쪽에 흩어진다. (b)라면 **요청을 받은 노드에서만** 는다. + +### 결과 — [`03-cache-ownership.txt`](evidence/session-replication/03-cache-ownership.txt) + +``` +단계 k0 entries k1 entries +시작 2.0 0.0 +keycloak-1 에 로그인 5회 2.0 5.0 ← k0 그대로, k1 만 +5 +keycloak-0 에 로그인 5회 7.0 5.0 ← k0 만 +5, k1 그대로 + +=== 대조: PostgreSQL 에는 몇 건인가 === + online 세션 12 ← 7 + 5 = 12, 정확히 일치 +``` + +**(b)다.** 그리고 **7 + 5 = 12**로 DB 총계와 정확히 맞는다 — 모든 세션이 DB에 +있고, 각각은 **자기를 만든 노드 한 곳에만** 캐시되어 있다. + +### 그래프로 본 같은 사실 + +![세션 캐시 엔트리 수](evidence/session-replication/session-cache-entries-per-pod.png) + +`vendor_statistics_approximate_entries_unique{cache="sessions"}` — Grafana Explore. + +**파란 선(keycloak-1)이 0에 붙어 있는 동안 초록 선(keycloak-0)만 14까지 +올라간다.** 파란 선은 09:50, 즉 **keycloak-1에 직접 로그인을 보낸 순간에만** +5로 뛴다. 중간의 절벽은 캐시를 비우려고 파드를 재시작한 지점이다. + +> 캐시 설정은 파일에서 읽을 수 없다. 파드의 `/opt/keycloak/conf/cache-ispn.xml`은 +> `` 뿐이고, +> Keycloak 26은 캐시를 **코드에서** 만든다. 그래서 위 결론은 설정을 읽어서가 +> 아니라 **동작을 측정해서** 얻었다. + +--- + +## 6. 그래서 무엇이 세션을 공유하는가 + +``` + 로그인 (keycloak-0) + │ + ├──▶ PostgreSQL OFFLINE_USER_SESSION ← 진실의 원천. 양쪽이 본다 + │ + └──▶ keycloak-0 로컬 캐시 ← 자기 것만. 건너가지 않는다 + + keycloak-1 이 그 세션을 물으면 + │ + └──▶ 자기 캐시에 없음 → PostgreSQL 에서 읽는다 +``` + +| 계층 | 역할 | 노드 간 공유 | +|---|---|---| +| **PostgreSQL** | 진실의 원천 | **여기서 일어난다** | +| **Infinispan `sessions`** | 자기 노드가 처리한 세션의 룩어사이드 캐시 | **일어나지 않는다** | +| **Infinispan 클러스터** | 무효화 메시지, `work` 캐시 등 | 형성은 되어 있다 | + +이건 **Keycloak 26의 의도된 설계**다. `persistent-user-sessions`가 기본이 되면서 +DB가 진실의 원천이 됐고, 세션 캐시는 **복제할 이유가 없어졌다.** 복제를 하면 +네트워크와 메모리를 쓰면서 DB와 캐시 두 벌을 정합하게 유지해야 한다. + +--- + +## 7. 개념 + +### 7-1. `persistent-user-sessions` + +Keycloak 25에서 도입되고 **26에서 기본값**이 된 기능. 사용자 세션을 +Infinispan에만 두지 않고 **데이터베이스에 기록**한다. + +| | 켜져 있을 때 (기본) | 꺼져 있을 때 (volatile) | +|---|---|---| +| 진실의 원천 | **PostgreSQL** | Infinispan | +| 전체 재시작 후 | **세션이 남는다** | 전부 사라진다 | +| 노드 간 공유 | DB가 한다 | **복제가 해야 한다** | +| 로그인당 비용 | DB 쓰기 | 네트워크 복제 | + +**이 실험의 결론은 전부 "켜져 있을 때"의 이야기다.** 끄면 다른 그림이 나오고, +그 비교가 로드맵 A-2다. + +```bash +kubectl -n keycloak-lab exec keycloak-0 -- \ + /opt/keycloak/bin/kc.sh show-config 2>/dev/null | grep -i feature +``` + +### 7-2. 온라인 세션이 `OFFLINE_` 테이블에 들어간다 + +**`USER_SESSION` 테이블은 존재하지 않는다.** 처음에 이걸 찾다가 없어서 당황했다. + +``` + public | auth_session | table | keycloak + public | jgroups_ping | table | keycloak + public | offline_client_session | table | keycloak + public | offline_user_session | table | keycloak + public | revoked_token | table | keycloak + public | root_auth_session | table | keycloak +``` + +`persistent-user-sessions`는 **기존 오프라인 세션 테이블을 재사용**하고 +`offline_flag` 컬럼으로 구분한다. + +| `offline_flag` | 의미 | +|---|---| +| **`'0'`** | **온라인 세션** (일반 로그인) | +| `'1'` | 오프라인 세션 (`offline_access`) | + +기본키가 `(user_session_id, offline_flag)` 복합키인 이유다 — 같은 세션 id가 +온라인/오프라인 두 행으로 존재할 수 있다. + +```sql +select offline_flag, count(*) from offline_user_session group by offline_flag; +select user_session_id, offline_flag, created_on, last_session_refresh + from offline_user_session where user_session_id = ''; +``` + +**이름이 내용을 배신하는 스키마다.** 운영에서 "온라인 세션이 DB 어디 있냐"를 +찾을 때 이걸 모르면 한참 헤맨다. + +### 7-3. `sid` — 토큰과 DB를 잇는 열쇠 + +``` +JWT access_token 의 sid jiv3rVZi1VeaO07oVJkL_MYW + ↕ 같은 값 +DB user_session_id jiv3rVZi1VeaO07oVJkL_MYW + ↕ 같은 값 +Admin API 세션 목록의 id jiv3rVZi1VeaO07oVJkL_MYW +``` + +세 곳에서 같은 문자열이다. **장애를 추적할 때 이 값 하나로 토큰·DB·관리 API를 +꿰뚫을 수 있다.** 백채널 로그아웃의 `sid` 클레임도 이것이다. + +### 7-4. `openid` scope가 없으면 OIDC 토큰이 아니다 + +`admin-cli`에 `scope` 없이 direct grant를 하면 나오는 클레임은 이렇다. + +``` +--- access_token --- + 클레임: azp, exp, iat, iss, jti, scope, sid, typ + typ = Bearer | sub = None | sid = OxikTqdHCJ7ESm2GPKI1oa6c +``` + +**`sub`이 없다.** OIDC가 아니라 순수 OAuth2 액세스 토큰이기 때문이다. +`sub`은 OIDC가 요구하는 클레임이고, `openid` scope가 있어야 붙는다. + +같은 이유로 `userinfo`가 403 `insufficient_scope`를 준다 — userinfo는 OIDC +엔드포인트다. **두 현상은 하나의 원인**이다. + +### 7-5. 룩어사이드(lookaside) 캐시 + +``` + 읽기: 캐시 확인 → 없으면 DB → 캐시에 채움 + 쓰기: DB 에 쓰고 → 캐시에도 씀 +``` + +캐시가 **DB 앞에 서 있되 DB를 대체하지 않는** 구조. 캐시를 통째로 날려도 +정확성은 유지되고 느려지기만 한다. Keycloak 26의 세션 캐시가 이 모양이다. + +이 성질이 **노드 상실 실험(A-3)의 결과를 미리 결정한다** — 노드가 죽으면 +그 노드의 캐시는 사라지지만 세션은 DB에 있으므로 살아남아야 한다. + +--- + +## 8. 다음 실험에 대한 예측 + +기준선이 생겼으므로 **틀릴 수 있는 예측**을 세울 수 있다. 예측이 빗나가면 +그것이야말로 배울 거리다. + +| 실험 | 예측 | 근거 | +|---|---|---| +| **A-1** TCP 7800 차단 | **세션 공유는 안 깨진다.** 대신 무효화 전파와 `work` 캐시가 깨진다 | 세션은 7800으로 오가지 않는다 | +| **A-2** DB 손실 | **즉시 전면 장애.** 캐시에 있는 세션도 못 쓴다 | DB가 진실의 원천 | +| **A-3** 노드 상실 (kc-lab-2) | **세션은 살아남는다.** 죽은 노드의 캐시만 사라진다 | 룩어사이드 | +| **A-4** volatile 비교 | 7800 차단이 **A-1과 정반대로** 치명적이 된다 | 그때는 캐시가 진실의 원천 | + +특히 A-1은 **직관과 어긋나는 예측**이다. "클러스터 포트를 막으면 세션이 +깨진다"가 상식이지만, 이 기준선이 맞다면 안 깨져야 한다. + +--- + +## 9. 겪은 함정 + +### 9-1. kubectl 스트림에서 출력이 통째로 사라졌다 + +`kubectl run --rm -i ... | grep` 로 받으면 **중간 조각이 유실됐다.** +keycloak-1의 스냅샷과 그 다음 마커가 함께 없어져, 전값이 0으로 잡히면서 +**가짜 델타가 만들어졌다.** + +``` +###BEFORE_K1 ← 여기 있어야 할 지표 20줄과 +http_code=200 다음 마커 ###LOGIN 이 통째로 사라졌다 +###AFTER_K0 +``` + +이때 리포트는 keycloak-1이 `+9`, `+7` 증가한 것처럼 보였다. **없는 복제가 +있는 것처럼 보이는, 가장 나쁜 종류의 오류다.** + +| 고친 방법 | | +|---|---| +| 파드 안에서 파일로 모으고 마지막에 `cat` 한 번 | 스트리밍 중 유실을 없앤다 | +| 스냅샷이 비면 **경고를 출력**한다 | 조용히 0으로 계산되는 것을 막는다 | + +```bash +for n in ('BEFORE_K0','BEFORE_K1','AFTER_K0','AFTER_K1'): + if not blocks.get(n): + print(f' !! {n} 스냅샷이 비었다 — 델타를 신뢰할 수 없다') +``` + +**계측 코드는 자기가 실패했는지 스스로 말해야 한다.** + +### 9-2. DB에서 직접 지우면 캐시는 남는다 + +정리하려고 `delete from offline_user_session`을 실행했더니, **캐시 엔트리는 +그대로 남아** 캐시 합계(19)와 DB 총계(15)가 어긋났다. + +> 운영에서 세션 테이블을 직접 손대면 캐시와 DB가 갈라진다. 세션을 지울 때는 +> 관리 API(`logout-all`)를 쓰거나, DB를 건드렸다면 **파드를 재시작**해야 한다. + +이 실험의 최종 수치는 **파드 재시작 후** 다시 잰 것이다. + +### 9-3. Keycloak 이미지에는 `curl`이 없다 + +`kubectl exec keycloak-0 -- curl` 은 실패한다. 임시 `curlimages/curl` 파드를 +띄워 파드 네트워크 안에서 호출했다. 파드 IP는 클러스터 밖에서 닿지 않으므로 +이 방법이 사실상 유일하다. + +### 9-4. 중첩 셸의 변수 치환 + +`ssh host '... $VAR ...'` 안에 다시 `sh -c "..."` 를 넣으면 인용이 세 겹이 되어 +치환이 조용히 깨진다. 첫 시도에서 파드 IP가 빈 문자열이 되어 아무 출력도 +나오지 않았다. + +**스크립트 파일로 만들어 `scp` 로 옮기는 쪽이 옳다.** 재현도 되고 저장소에 +남는다. `deploy/lab/scripts/` 아래 세 스크립트가 그 결과다. + +--- + +## 10. 재현 + +```bash +# 1. 깨끗한 상태로 되돌린다 (DB 비우고 캐시 비우기) +ssh test-server ' + kubectl -n keycloak-lab exec deploy/postgres -- \ + psql -U keycloak -d keycloak -c "delete from offline_user_session" + kubectl -n keycloak-lab rollout restart statefulset/keycloak + kubectl -n keycloak-lab rollout status statefulset/keycloak --timeout=300s' + +# 2. 세 실험을 순서대로 +ssh test-server '/tmp/experiment-session-replication.sh' # 교차 노드 사용 +ssh test-server '/tmp/experiment-cache-replication-delta.sh' # 복제인가 DB인가 +ssh test-server '/tmp/experiment-cache-ownership.sh' # 엔트리 위치 + +# 3. 그래프 +# https://app2.hyeonworks.com/explore +# vendor_statistics_approximate_entries_unique{cache="sessions"} +# Legend: {{pod}} on {{node}} +``` + +### 확인용 명령 모음 + +```bash +# 클러스터 멤버 +kubectl -n keycloak-lab logs keycloak-0 | grep ISPN000094 | tail -1 +kubectl -n keycloak-lab exec deploy/postgres -- \ + psql -U keycloak -d keycloak -c "select name, ip, coord from jgroups_ping" + +# DB 세션 +kubectl -n keycloak-lab exec deploy/postgres -- psql -U keycloak -d keycloak \ + -c "select offline_flag, count(*) from offline_user_session group by offline_flag" + +# 노드별 캐시 엔트리 (파드 안에서) +curl -s http://:9000/metrics \ + | grep 'approximate_entries_unique{cache="sessions"' +```