Twelve SVG architecture diagrams cover the experiments whose documents had little or no structure drawing, embedded under a 구조 heading with a shared convention file. Seven documents carried their concepts under narrative headings and now have an explicit 개념 section so they can be found. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
6.0 KiB
6.0 KiB
실험 색인 — 23개 전부
각 실험은 자기 브랜치에 있고, 해설 문서와 증거 폴더가 한 벌이다.
| # | 실험 | 브랜치 | 한 줄 결과 |
|---|---|---|---|
| A-0 | 세션 복제 확인 | ...multinode-cluster-jdbc-ping |
세션 공유는 Infinispan 이 아니라 PostgreSQL 이 한다 |
| A-1 | TCP 7800 차단 | ...a1-jgroups-transport-block |
세션은 견디지만 로그아웃 무효화가 7800 을 탄다 |
| A-2 | DB 정상 정지 | ...a2-database-loss |
전면 장애. 그런데 up 은 1이었다 |
| A-3 | DB 강제 종료 | ...a3-database-crash |
153건 중 4건의 로그인이 사라졌다 |
| A-4 | 노드 전원 차단 | ...a4-node-loss |
죽은 파드가 산 파드보다 건강해 보인다 |
| A-5 | 비대칭 파티션 | ...a5-asymmetric-partition |
단방향은 자가 치유. 완전 분단도 한쪽은 산다 |
| A-6 | 지연 주입 | ...a6-latency-injection |
200ms → 22초 (왕복 × 풀 큐잉) |
| A-7 | volatile 비교 | ...a7-volatile-comparison |
세 결과가 정반대로 뒤집힌다 |
| A-8 | 롤링 재시작 | ...a8-rolling-restart |
무중단 + 세션 생존 |
| B-0 | 자동구성 확인 | ...b0-bff-redis-deploy |
조회 키에 session id 가 없다 |
| B-1 | Redis 세션 | ...b1-redis-session-store |
세션만 옮겨지고 토큰은 남는다 |
| B-2 | 다중 인스턴스 | ...b2-multi-instance-session |
공유는 되지만 평문·덮어쓰기·로그아웃 미정리 |
| B-3 | refresh 경쟁 | ...b3-refresh-token-contention |
경쟁이 아니라 세션이 파괴된다 |
| B-4 | Edge 인가 | ...b4-edge-authorization-scope |
nginx 는 설정하지 않은 헤더를 덮어쓰지 않는다 |
| B-5 | Redis 상실 | ...b5-redis-loss-persistence |
파드가 Ready 인 채로 계속 실패한다 |
| B-6 | key 회전 | ...b6-key-rotation |
회전은 안전, 옛 키를 버리는 순간이 위험 |
| B-7 | cookie secret | ...b7-cookie-secret-rotation |
겹침 구간이 없고 세션이 고아로 남는다 |
| C-1 | 다중 앱 SSO | ...c1-multi-app-sso |
IdP 세션을 죽여도 아무도 로그아웃되지 않는다 |
| C-2 | 백채널 로그아웃 | ...c2-backchannel-logout |
받는 쪽을 아무도 구현하지 않았다 |
| D-1 | 백업·복구 | ...d1-backup-restore |
빈 데이터베이스가 200 을 냈다 |
| D-2 | 버전 업그레이드 | ...d2-version-upgrade |
이미지를 되돌려도 스키마는 안 돌아온다 |
| D-3 | 비밀 관리 | ...d3-secret-management |
RBAC 만 실제로 감춘다 |
| D-4 | 인증서 갱신 | ...d4-certificate-renewal |
구성은 정상. 강제 갱신은 사람 손이 필요 |
| 후속 | 미측정 항목 채우기 | ...followup-untested-items |
정방향 업그레이드 무중단 · 롤백 불가는 조건부였다 · role 변경은 요청으로 반영 안 됨 |
시각 자료
diagrams/lab-topology.svg |
실험대 전체 구조 |
diagrams/_style.md |
다이어그램 규약 (붉은 점선 = 죽인 것) |
diagrams/*.svg |
실험별 구조도 12개 |
evidence/*/*.png |
Grafana · 브라우저 스크린샷 |
B층(B-1·B-3·B-4·B-5)에는 Grafana 증거가 없다. 안 찍은 것이 아니라
Prometheus 가 Redis·BFF·PostgreSQL 을 긁지 않는다 —
followup/04-observability-gap.txt 에 측정해 두었다.
문서 지도
| 문서 | 용도 |
|---|---|
session-lab-prerequisites.md |
먼저 읽을 것 — 왜 이런 걸 재는지 |
experiment-plan.md |
23개의 구조도·주입 방법·예측 |
open-questions-coverage.md |
공개 열린 질문 4개 대조 |
session-lab-concepts.md |
등장 개념 전체 (13층) |
반복해서 배운 것 — 주입이 안 걸린 사례
아홉 번 있었다. 전부 "아무 일도 없었다" 로 보였다.
| 실험 | 안 걸린 주입 | 원인 |
|---|---|---|
| A-1 | NetworkPolicy 로 7800 차단 | conntrack ESTABLISHED 가 먼저 통과시킨다 |
| A-3 | delete --grace-period=0 --force |
컨테이너 런타임이 SIGTERM → 정상 종료 |
| A-3 | kill -9 1 |
컨테이너 안에서 PID 1 은 SIGKILL 을 무시한다 |
| A-5 | iptables -I FORWARD 1 |
kube-router 가 자기 체인을 위로 재삽입 |
| A-5 | raw 테이블, 반대 노드 | 연결 방향이 뒤집혀 있었다 |
| A-6 | tc ... dev eth0 |
인터페이스가 enp1s0 이다 |
| A-6 | enp1s0 에 파드 IP 필터 |
VXLAN 캡슐화로 안 보인다 |
| B-2 | spring.sql.init 스키마 |
PostgreSQL 에 없는 blob 타입 + continue-on-error |
| B-7·D-4 | sudo nginx -T 등 |
호스트 sudo 가 비밀번호를 요구한다 |
그래서 실험마다 "주입 성공 신호" 를 먼저 정하게 됐다 —
cluster_size 하락, not properly shut down 로그, iptables 패킷 카운터,
tc -s qdisc 의 Sent.
예측이 빗나간 곳
| 실험 | 예측 | 실제 |
|---|---|---|
| A-1 | 로그아웃 전파는 안 깨진다 | 깨졌다 — 무효화는 7800 을 탄다 |
| A-2 | up 이 잡아줄 것 |
1로 평평했다 |
| A-6 | 낙관적 락 충돌이 는다 | 0건 — 로그인은 새 행을 만든다 |
| B-4 | nginx 가 동명 헤더를 덮어쓴다 | 둘 다 도착했다 |
| B-6 | JWKS 캐시가 유예를 준다 | 즉시 401 |
말할 수 있는 것과 없는 것
말할 수 있다 — Keycloak 멀티노드에서 세션과 토큰이 어디에 저장되고 각 저장소가 죽으면 무엇이 어떻게 실패하는지 재현하고 복구했다. 버전에 따라 결론이 뒤집힌다는 것을 같은 주입으로 양쪽 다 측정했다.
말하면 안 된다 — "운영해봤다", "대규모 트래픽을 다뤄봤다". 규모·시간·다른 사람·실제 사용자·비용은 이 실험대에 없다.