Files
document-haness/.playwright-mcp/studio-docs.json
T
DongHyeonkaandClaude Opus 5 024362d096 fix(setup): 실험대를 새로 세워 setup 35편을 밟고 어긋난 명령과 결과를 고친다
기반 가이드 7단계로 실험대를 철거하고 다시 세운 뒤 virtualization setup 9편과
keycloak-session-store 26편을 순서대로 밟았다. 24편은 끝까지, 11편은 되는 데까지
밟았고 밟은 범위를 편마다 적었다.

명령이 못 도는 것을 고쳤다.

- kubectl 을 `kc-lab-1` 에서 치라고 적었는데 그 기계에 kubeconfig 가 없다.
  라벨 639개와 각 편의 「어디서 치는가」를 `[lab host]` 로 옮겼다
- `-o custom-columns=…[0]…` 이 zsh 에서 글로브로 읽혀 안 돈다. 28곳에 따옴표
- busybox `sed` 가 끝 개행을 안 붙여 A-3 의 측정이 언제나 0 이었다
- `--token-file ~/node-token` 뒤에 그 파일을 지우면 k3s agent 가 재부팅을
  못 견딘다. `/etc/rancher/node-token` 으로 옮기는 처방을 재서 넣었다
- 게스트에 없는 도구를 전제로 한 명령 넷 — `conntrack`·`dig`·`strings`·`nginx -v`
- `echo` 와 JWT 헤더가 `"이름" : [ 값 ]` 으로 찍는데 문서는 공백 없이 옮겨 적어
  그 실측으로 만든 grep·sed 가 한 줄도 못 잡는다
- B-0 이 `directAccessGrantsEnabled` 와 계정 완성을 빠뜨려 B-3 이 못 돈다
- D-4·D-4a 가 `test-server` 와 `certbot-renew.*` 를 가리키는데 실제로는
  `kc-lab-edge` 의 `certbot.service` 다
- `virsh setmaxmem --config` 를 `dominfo` 로 판정하면 틀린다. `--inactive` 로
- `LIBVIRT_DEFAULT_URI` 를 rc 에만 넣으면 `ssh host '명령'` 에서 안 먹는다

결과가 조건부인 것을 갈랐다.

- readiness 는 즉시 안 뒤집힌다. A-1·A-2 의 60초 창을 적었다
- 03 의 층 ②③ `301` 은 04 이후의 값이고 그 단계에서는 `404` 다
- A-0 의 로그 필터를 요청 직후에 치면 정반대 결론이 나온다
- A-5 의 한 방향 차단은 잠깐 `1` 이었다 `2` 로 돌아온다

증거는 두 프로젝트의 `evidence/raw/` 에 99벌을 README 와 함께 남겼다. 비밀은
길이만 적었고 화면에 찍힌 토큰은 가렸다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 15:59:42 +09:00

695 lines
26 KiB
JSON

{
"count": 138,
"byId": {
"8d6b8a7f-e08e-4c9f-9772-a14a9d569260": {
"kind": "SETUP",
"title": "TTL 로 고아 세션을 골라내 지운다",
"version": null
},
"d53181b9-bb28-4703-97ed-98adfb5b18dc": {
"kind": "SETUP",
"title": "cookie secret 을 갈아치우고 로그인해 있던 세션이 어떻게 되는지 본다",
"version": null
},
"9bb0b051-c158-497f-a744-b24769c93783": {
"kind": "SETUP",
"title": "신원 헤더를 위조해 보내고 어디까지 도착하는지 본다",
"version": null
},
"cf2e783c-424b-4167-aa27-3bd6b5f46ee2": {
"kind": "SETUP",
"title": "flannel.1 에 200ms 를 넣고 커넥션 풀이 고갈되는 것을 본다",
"version": null
},
"b90d719f-39fb-4bab-a263-0e32eedb2b36": {
"kind": "SETUP",
"title": "한 방향만 끊어 보고 raw PREROUTING 까지 내려간다",
"version": null
},
"d845adc8-be2c-4471-aa1d-7e4db864c471": {
"kind": "SETUP",
"title": "기계 전원을 뽑고 쿠버네티스가 알아채는 시각을 잰다",
"version": null
},
"91ce17ad-758d-4a63-be5b-489786609557": {
"kind": "SETUP",
"title": "PostgreSQL 을 진짜로 크래시시키고 잃은 로그인을 센다",
"version": null
},
"bf169fef-f900-4247-88f8-427742ae3fe9": {
"kind": "SETUP",
"title": "PostgreSQL 을 정상 종료시키고 네 경로를 잰다",
"version": null
},
"4f32b469-185a-4dea-8eba-599864a3b476": {
"kind": "SETUP",
"title": "deploy 훅 파일 하나를 넣고 nginx 워커가 저절로 갈리는지 확인한다",
"version": null
},
"9349a3fe-5234-48ae-af9f-029ffc0d2296": {
"kind": "SETUP",
"title": "인증서를 강제로 갱신하고 밖에서 보이는 일련번호가 언제 바뀌는지 잰다",
"version": null
},
"186443e8-a32a-4a94-8609-845a4247d120": {
"kind": "SETUP",
"title": "카나리아 Secret 을 심고 네 경로에서 평문이 어디까지 나오는지 본다",
"version": null
},
"e53c5947-e1df-400a-ad79-e9d55b1da452": {
"kind": "SETUP",
"title": "이미지 태그를 올렸다 내리며 롤백이 언제 막히는지 가른다",
"version": null
},
"7dc48b91-e31b-455c-9a9d-c766f95ff491": {
"kind": "SETUP",
"title": "스키마를 통째로 지우고 덤프 하나로 되살아나는지 본다",
"version": null
},
"5296a106-4c42-437d-b721-33a5e53a045c": {
"kind": "SETUP",
"title": "IdP 쪽에만 로그아웃 주소를 넣고 한쪽만 고치면 안 퍼지는 것을 확인한다",
"version": null
},
"3421185f-5f3c-4263-9455-6243306e9fc9": {
"kind": "SETUP",
"title": "두 앱을 한 로그인으로 묶고 IdP 세션만 끊어 앱 세션이 남는지 본다",
"version": null
},
"7447ccbf-1800-43a4-a9d2-8ac774965c4b": {
"kind": "SETUP",
"title": "서명 키를 더한 뒤 옛 키를 지우고 옛 토큰이 언제 끊기는지 본다",
"version": null
},
"af9645a0-8ca8-481d-9624-69fce6449b7c": {
"kind": "SETUP",
"title": "Redis 를 0대로 내리고 파드가 Ready 를 유지하는지 본다",
"version": null
},
"405c4206-9b59-491f-aed1-8b97cfd9f584": {
"kind": "SETUP",
"title": "같은 refresh token 다섯 개를 동시에 던지고 client session 을 센다",
"version": null
},
"df2ee798-7f31-4570-a355-11f96c0eea84": {
"kind": "SETUP",
"title": "토큰을 PostgreSQL 로 옮기고 기본키와 로그아웃 정리를 확인한다",
"version": null
},
"1e5d05fa-88f4-4ef5-a402-4a520ae4a52d": {
"kind": "SETUP",
"title": "Redis 를 붙이고 무엇이 옮겨졌는지 빈 목록으로 견준다",
"version": null
},
"4ef91d43-1f1d-481a-8b6f-5e015d068578": {
"kind": "SETUP",
"title": "아무 저장소도 주지 않고 Spring 이 무엇을 고르는지 찍어서 확인한다",
"version": null
},
"975a6d61-4e34-4034-a0d2-01fea3b498a3": {
"kind": "SETUP",
"title": "DNS-01 으로 와일드카드 인증서를 받고 갱신이 서빙까지 닿게 한다",
"version": null
},
"0cb0f195-b06b-4f8e-b52e-675eb0918805": {
"kind": "SETUP",
"title": "Prometheus 와 Grafana 를 올려 클러스터 안을 밖에서 본다",
"version": null
},
"7c66a553-0008-4294-a27a-687bd1bda0c1": {
"kind": "SETUP",
"title": "lab host 에 가상화 패키지를 깔고 virsh 가 sudo 없이 돌게 만든다",
"version": null
},
"7b113a04-180a-40ec-9270-033531c22221": {
"kind": "SETUP",
"title": "Keycloak 2노드와 PostgreSQL 을 k3s 에 올리고 클러스터가 묶였는지 확인한다",
"version": null
},
"5e629c2f-e653-4dd9-b1c9-1fe6b2bb181d": {
"kind": "SETUP",
"title": "k3s server 와 agent 를 게스트 두 대에 깔고 lab host 에서 kubectl 로 본다",
"version": null
},
"74a7bacf-e5d8-4129-926a-c8cf5cacb8c9": {
"kind": "SETUP",
"title": "엣지 게스트에 nginx 를 세우고 호스트 DNAT 으로 밖에서 들어오는 길을 연다",
"version": null
},
"f972ca27-7e18-41c1-9494-59cc6f676ae2": {
"kind": "SETUP",
"title": "cloud-init 시드로 게스트 세 대를 만들고 SSH 가 키로 붙게 한다",
"version": null
},
"0b64d23a-f82a-44b4-ad54-e079578977c4": {
"kind": "SETUP",
"title": "롤링 재시작을 걸고 재시작 전 토큰이 통하는지 본다",
"version": null
},
"21dce25a-a165-47dc-bb40-2ed9f6f9efea": {
"kind": "SETUP",
"title": "문장 로깅으로 그 500 을 낸 SQL 을 확정하고 캐시 온도 셋을 재현한다",
"version": null
},
"b8d7db33-afdc-4e49-9eab-ed4edbbe398e": {
"kind": "SETUP",
"title": "persistent-user-sessions 를 끄고 A층 결론 넷을 다시 잰다",
"version": null
},
"95e29500-b535-4246-86db-d569ed814904": {
"kind": "SETUP",
"title": "7800 을 막고 디스커버리와 트랜스포트를 갈라 끊는다",
"version": null
},
"4f56ed58-fc82-4ed1-ac87-c356b30c34f7": {
"kind": "SETUP",
"title": "세션을 공유하는 것이 Infinispan 인지 PostgreSQL 인지 손으로 가른다",
"version": null
},
"3b05c1f0-13e9-414a-97a6-2078fb4bab26": {
"kind": "CONCEPT",
"title": "Guest 의 write() 요청부터 virtqueue까지",
"version": null
},
"5b1de31c-0495-4226-8607-73ed7284b314": {
"kind": "CONCEPT",
"title": "Guest 의 packet에서 Host Physical NIC까지",
"version": null
},
"5bcae89b-0873-4a2b-af4a-10e5234c085b": {
"kind": "CONCEPT",
"title": "KVM 에서 vCPU 가 물리 CPU 에서 실행되기까지",
"version": null
},
"ecaaa37d-7b33-4cbf-9bc5-4c6caad14ee5": {
"kind": "CONCEPT",
"title": "VM 아래에 한 번 더 있는 Host block stack — blk-mq · I/O Scheduler · NVMe",
"version": null
},
"8fafaeea-8746-4537-87a4-679a3a91aa4c": {
"kind": "CONCEPT",
"title": "완료라는 말의 네 가지 뜻 — write · writeback · flush · 전원 장애 생존",
"version": null
},
"eead2379-94fe-463a-9e5e-06a01bf2105d": {
"kind": "QUESTION",
"title": "disk image 는 최종적으로 어느 Host block device 위에 있는가",
"version": null
},
"480f86ac-86fb-4290-9bf5-584763aa1363": {
"kind": "QUESTION",
"title": "이 VM 들의 QEMU disk cache mode 는 무엇인가",
"version": null
},
"decbab8d-9c98-45c6-b5b8-e6162e407299": {
"kind": "REFERENCE",
"title": "빨라진 구성이 durability contract 를 지운 것은 아닌지 먼저 가른다",
"version": null
},
"b1cda8c4-d31d-4ae4-a4d9-4103a0ab3109": {
"kind": "REFERENCE",
"title": "지연 원인을 CPU 로 읽기 전에 storage 계층을 따로 잰다",
"version": null
},
"ed64d4ff-aa01-48cc-ae68-6a683b025cde": {
"kind": "QUESTION",
"title": "VM1 의 storage 부하가 VM2 의 지연을 실제로 밀어 올리는가",
"version": null
},
"77aa0188-5c2b-4f47-bda7-7c66b084968d": {
"kind": "QUESTION",
"title": "이 호스트의 I/O Scheduler 는 무엇인가",
"version": null
},
"be3c2c58-1ed4-4eae-876a-3114faa61c94": {
"kind": "QUESTION",
"title": "Guest 의 fsync() 지연과 Host storage 지연은 같이 오르는가",
"version": null
},
"892b6087-8961-486c-b4d9-d3dd46bc2605": {
"kind": "CONCEPT",
"title": "/dev/vda 뒤에 있는 것 — qcow2 · RAW · Host block device",
"version": null
},
"ae69e2e1-1a3b-4ae3-ae2a-572af07b95d7": {
"kind": "QUESTION",
"title": "이 disk image 는 qcow2 인가 RAW 인가, 그리고 Guest 가 보는 크기와 Host 가 실제로 쓰는 크기는 얼마나 다른가",
"version": null
},
"1f76d54b-bb17-4174-8128-0c2d71d4256f": {
"kind": "QUESTION",
"title": "이 호스트의 /dev/vda 는 어떤 backend 에 붙어 있는가",
"version": null
},
"274c5636-33f6-4c19-a54b-d2a96af31289": {
"kind": "REFERENCE",
"title": "Guest 안에서 본 disk 로 backend 를 단정하지 않는다",
"version": null
},
"484fd832-c7d3-413e-897a-97892e4e10ac": {
"kind": "QUESTION",
"title": "이 호스트에서 vhost-net 이 실제로 packet datapath 를 맡고 있는가",
"version": null
},
"397c4789-0272-449b-86d6-2c4a3a122401": {
"kind": "QUESTION",
"title": "VM1 과 VM2 의 TAP/vnet interface 는 무엇이고 어디에 붙어 있는가",
"version": null
},
"38716d7f-1aa1-48d8-ab4c-3fc505332128": {
"kind": "QUESTION",
"title": "이 호스트의 가상 머신 네트워크는 Bridge 인가 NAT 인가 Routing 인가",
"version": null
},
"ca36f0db-9028-4761-91a8-afb7eb30f2b9": {
"kind": "REFERENCE",
"title": "Keycloak 실험 결과를 애플리케이션 원인으로 읽기 전에 network 계층을 따로 검증한다",
"version": null
},
"68a848c7-eaff-4421-ad25-de21673ca40c": {
"kind": "REFERENCE",
"title": "packet 이 어디서 끊겼는지는 계층마다 capture 해서 가른다",
"version": null
},
"79ac61d6-cbe6-483b-9961-02ca8c02b5c2": {
"kind": "QUESTION",
"title": "부하 중 network 가상화가 지연을 바꿀 만큼 호스트 CPU 를 쓰는가",
"version": null
},
"600a2621-f6d8-42df-9629-7db65011545d": {
"kind": "QUESTION",
"title": "Host Nginx 에서 Keycloak 까지 packet 은 실제로 어디를 지나는가",
"version": null
},
"1a996f8d-b04e-49d2-88ef-4877e21f7c0e": {
"kind": "QUESTION",
"title": "이 가상 머신들의 virtio-net 에 multi-queue 가 켜져 있는가",
"version": null
},
"bded6560-dc8d-473d-966c-5b037bb84c4c": {
"kind": "QUESTION",
"title": "QEMU backend 와 vhost-net 의 차이가 이 호스트에서 실제로 보이는가",
"version": null
},
"32d0be7d-d88e-4760-8d91-35d3a233a99a": {
"kind": "CASE",
"title": "Fetch 타입이 아닌 조회 방식으로 인한 N+1",
"version": null
},
"c1158754-e3d2-47b8-bb41-81787c0ca84b": {
"kind": "CASE",
"title": "Collection Fetch Join Pagination의 In-memory Paging",
"version": null
},
"1b59e6de-16f1-42b2-81bb-01d6198e34bf": {
"kind": "QUESTION",
"title": "QEMU 메모리는 vCPU 가 도는 NUMA node 와 같은 node 에 있는가",
"version": null
},
"6a60abe7-ea2c-46c2-bb9f-8281bfbe9644": {
"kind": "QUESTION",
"title": "balloon target 을 바꾸면 게스트가 쓸 수 있는 메모리는 어떻게 따라 움직이는가",
"version": null
},
"a05fe2a6-eb7c-4bcc-a7da-58e729436468": {
"kind": "QUESTION",
"title": "호스트 메모리 압박이 게스트 애플리케이션 지연을 실제로 밀어 올리는가",
"version": null
},
"380d4975-3be5-451d-aede-2e24c5a2a09e": {
"kind": "QUESTION",
"title": "NUMA remote access 가 이 작업의 지연을 실제로 바꾸는가",
"version": null
},
"63aef96b-03ef-4dbd-9ba6-9e61c6e695e1": {
"kind": "QUESTION",
"title": "이 가상 머신들에 virtio-balloon 이 붙어 있는가",
"version": null
},
"074a1cb4-cea8-4dad-bc4c-899692ff9aa9": {
"kind": "QUESTION",
"title": "게스트 page fault 증가는 workload 변화를 따라가는가",
"version": null
},
"a2cbc828-59ab-4e70-916a-d053e71960ae": {
"kind": "QUESTION",
"title": "호스트 major fault 와 스토리지 지연은 같은 시간축에서 함께 움직이는가",
"version": null
},
"50730203-df5f-4604-8535-7e93ab6fb724": {
"kind": "QUESTION",
"title": "이 호스트의 THP 정책과 huge page 상태는 무엇인가",
"version": null
},
"fa5b3782-9fcf-4113-8f51-a55c8023b2db": {
"kind": "QUESTION",
"title": "QEMU 프로세스가 실제로 붙잡고 있는 호스트 메모리는 얼마이고 어떻게 나뉘어 있는가",
"version": null
},
"67285d51-7eaf-4540-9577-cfd0b273b40e": {
"kind": "QUESTION",
"title": "이 호스트의 가상 머신들은 설정한 메모리와 지금 잡고 있는 메모리가 얼마나 다른가",
"version": null
},
"63fa33e5-9957-4d28-8d3c-c75735a73bd6": {
"kind": "REFERENCE",
"title": "메모리 증상 하나로 계층을 단정하지 않는다",
"version": null
},
"ded41b52-ec08-4231-a54c-86d6c80d38f0": {
"kind": "REFERENCE",
"title": "메모리 실험 결과에는 Host · VM · Workload 조건을 함께 남긴다",
"version": null
},
"f460e9a2-35ef-46ff-81cf-b36627a1b231": {
"kind": "QUESTION",
"title": "가상 머신 RAM 이 HugeTLB 로 명시적으로 backing 되어 있는가",
"version": null
},
"d3e8501f-e1b5-4f8f-aa9a-89f9c89a308e": {
"kind": "QUESTION",
"title": "지금 게스트와 호스트에서 swap 이 실제로 오가고 있는가",
"version": null
},
"647d6d11-5bb2-4028-a530-b10c8925aa11": {
"kind": "CONCEPT",
"title": "Host 메모리 압박이 Guest 와 스토리지까지 내려가는 경로",
"version": null
},
"68811272-5352-4409-aa20-7e22e601ede8": {
"kind": "CONCEPT",
"title": "NUMA 에서는 vCPU 배치와 메모리 배치를 함께 본다",
"version": null
},
"ebdf93d7-2dcb-4fc8-91b9-2364ac8196e6": {
"kind": "CONCEPT",
"title": "virtio-balloon 이 Guest 메모리를 회수하고 돌려주는 방식",
"version": null
},
"2f2ffafc-91ff-4971-a6a8-7c0e7d844ca2": {
"kind": "CONCEPT",
"title": "Guest 메모리 주소가 물리 RAM 에 닿기까지 — GVA · GPA · HPA",
"version": null
},
"efce9a6e-5f5d-45ec-86e5-056d8cb1b8d2": {
"kind": "CONCEPT",
"title": "Huge Page 를 VM 에서 볼 때 갈라지는 세 자리",
"version": null
},
"e80853fa-98b8-4cc3-a2df-427c7147794b": {
"kind": "CONCEPT",
"title": "VM 에서 page fault 는 세 계층에서 따로 일어난다",
"version": null
},
"688c6c02-c1bd-4cd2-a615-2396db145386": {
"kind": "QUESTION",
"title": "이 호스트의 NUMA 토폴로지는 가상 머신 성능을 고려해야 할 구조인가",
"version": null
},
"d103bb81-45df-402f-86e5-e41d66ed7f8d": {
"kind": "QUESTION",
"title": "Keycloak 작업의 VM Exit 분포는 idle · CPU-bound · I/O-bound 와 어떻게 다른가",
"version": null
},
"62319064-17ef-4b2f-bf8b-e363cd0e36a6": {
"kind": "QUESTION",
"title": "CPU pinning 전후로 Keycloak 지연과 vCPU 스케줄링 변동이 달라지는가",
"version": null
},
"116b806c-b176-401c-9363-1489fffb721c": {
"kind": "QUESTION",
"title": "cgroup CPU 제한과 호스트 vCPU 경쟁을 지표로 가를 수 있는가",
"version": null
},
"723d8930-9e82-4552-8376-038a6446ec71": {
"kind": "QUESTION",
"title": "vCPU 를 늘릴수록 이 호스트에서 Keycloak 처리량도 계속 오르는가",
"version": null
},
"2d058fb5-01f1-4be8-80bb-0e377868573c": {
"kind": "QUESTION",
"title": "가상 머신 두 대를 CPU-bound 로 만들면 게스트 steal time 은 얼마나 오르는가",
"version": null
},
"2acec7d5-3eaf-4115-9d61-45647c4ec01e": {
"kind": "QUESTION",
"title": "운영 서버는 CPU 가상화 계층의 영향을 받는 구조인가",
"version": null
},
"cd58d35d-3a93-4682-82b8-b64ce3a8813c": {
"kind": "QUESTION",
"title": "pinning 없이 vCPU 스레드는 호스트 논리 CPU 사이를 옮겨 다니는가",
"version": null
},
"61b7486f-5dab-41df-8f4f-e8fc21d88617": {
"kind": "QUESTION",
"title": "실제 작업에서 주로 발생하는 VM Exit 은 무엇인가",
"version": null
},
"4a2d3332-81c3-44fa-a4fb-216a41abb504": {
"kind": "QUESTION",
"title": "게스트가 유휴 상태일 때 vCPU 스레드는 이 테스트 환경에서 어떻게 보이는가",
"version": null
},
"da3a7b56-5691-4a9f-90c5-3a1a5d0f0013": {
"kind": "QUESTION",
"title": "Keycloak 동시 refresh 실험 중 CPU 가상화 계층이 결과를 흔들 만큼 포화되는가",
"version": null
},
"eba4a877-276a-4050-9a97-d32614546c71": {
"kind": "QUESTION",
"title": "가상 머신 두 대에 동시에 부하를 주면 이 호스트에서 vCPU 경쟁이 실제로 생기는가",
"version": null
},
"a0e1cc05-92b3-4dac-bce1-513ab8cd862b": {
"kind": "CASE",
"title": "Forward-Auth에서 Client가 보낸 Identity Header를 신뢰하면 안 되는 이유",
"version": null
},
"488ce49b-afa4-42a5-a2ce-de2e0653cd82": {
"kind": "CASE",
"title": "Refresh Token 관리만 서버로 이전, Access Token은 여전히 Browser에 노출",
"version": null
},
"bf675775-4f3e-4744-8014-f0efff51422a": {
"kind": "CASE",
"title": "SPA에서 OAuth Token을 JavaScript Memory에 보관한 경우",
"version": null
},
"036563a1-3a43-4931-a017-0e693b591e89": {
"kind": "REFERENCE",
"title": "패턴 검증을 실제로 돌릴 때의 안전한 순서",
"version": null
},
"4c9c3b90-bc89-4300-9334-088ea95d37d8": {
"kind": "CASE",
"title": "Projection 이후에도 1,509행을 읽은 Row Over-fetch",
"version": null
},
"7ed75172-fd56-42bf-956a-8f9fc1cca235": {
"kind": "CASE",
"title": "Collection Fetch Join으로 N+1을 해결하다 만난 MultiBag예외와 행 폭증 문제",
"version": null
},
"a3493786-d3fb-4b01-b1c5-ecb23c3d5497": {
"kind": "CONCEPT",
"title": "Forward-Auth와 Nginx auth_request의 동작",
"version": null
},
"5c8f12d5-1ead-469b-8e91-2de69401df48": {
"kind": "CONCEPT",
"title": "Cookie로 인증하는 요청에서 CSRF token이 하는 일",
"version": null
},
"d85bd6af-7599-4ef7-9407-6609927d5b5c": {
"kind": "CASE",
"title": "Browser Token을 없애면서 BFF에 Session과 CSRF 책임이 생긴 과정",
"version": null
},
"e1e0e2a0-c6b6-45bf-be42-f697ba5e2fff": {
"kind": "QUESTION",
"title": "ANALYZE 이후 Cardinality Estimate는 어떻게 달라지는가",
"version": null
},
"5159c415-232d-424a-970a-b0db52746767": {
"kind": "QUESTION",
"title": "Round Trip과 Row Volume을 독립 측정할 것인가",
"version": null
},
"b0b55ac9-c0a3-4c01-ba84-0aa478923ace": {
"kind": "REFERENCE",
"title": "JPA N+1 정량 진단 기준",
"version": null
},
"ae6c9bea-d3a3-46e1-bbd4-8d580d336394": {
"kind": "PROJECT_DECISION",
"title": "Query Plan은 실제 PostgreSQL에서 측정한다",
"version": null
},
"d99fdec9-fe9e-4e0f-a50b-6fb9b9ed5719": {
"kind": "CONCEPT",
"title": "외부 IdP Brokering의 동작",
"version": null
},
"bf5f2462-0e94-4723-bdc8-f7dd709b2dbb": {
"kind": "REFERENCE",
"title": "Top-N-per-group 선택 기준",
"version": null
},
"e8c2e9ea-cd87-46f8-9469-849dbd433d86": {
"kind": "REFERENCE",
"title": "PostgreSQL Query Plan 측정 기준",
"version": null
},
"06788903-3dfa-4f70-b159-f1224384fd0b": {
"kind": "REFERENCE",
"title": "Keyset Pagination 설계 기준",
"version": null
},
"51095f6e-2cc8-439c-8648-065033614215": {
"kind": "REFERENCE",
"title": "Fetch Type과 Fetch Strategy 구분",
"version": null
},
"db99cbc5-9123-4599-b368-39ff3170e81d": {
"kind": "REFERENCE",
"title": "Fetch Join · Batch · Projection 선택 기준",
"version": null
},
"635fcedd-d402-4297-bcf3-9fcdf4200d28": {
"kind": "REFERENCE",
"title": "Feed Visibility Query Pattern",
"version": null
},
"30a37f34-b406-4061-b924-e22e0be0c3bf": {
"kind": "PROJECT_DECISION",
"title": "화면 조회는 Read Projection을 사용한다",
"version": null
},
"4e3200c8-eff5-4442-ae84-ae7b7fa92c8b": {
"kind": "PROJECT_DECISION",
"title": "Query Strategy는 FeedQueryPort 뒤에서 소유한다",
"version": null
},
"5e4d033c-d6fe-4257-a4dc-1ade44473c72": {
"kind": "PROJECT_DECISION",
"title": "Collection Fetch Join과 Pagination을 같이 사용하지 않는다",
"version": null
},
"1dbce381-f0dc-4d49-ad68-bd31d205677e": {
"kind": "PROJECT_DECISION",
"title": "Feed Pagination은 Keyset을 사용한다",
"version": null
},
"7f248f68-ce2b-43ec-94ce-82324d0bd1a7": {
"kind": "PROJECT_DECISION",
"title": "현재 Read Model은 CQRS-lite로 유지한다",
"version": null
},
"08a74b35-10c3-4874-8fbc-209b0b6e942e": {
"kind": "PROJECT_DECISION",
"title": "Entity Graph 조회에는 Batch Fetch를 사용한다",
"version": null
},
"5088ce14-b096-41d3-abba-64b7afb48bb9": {
"kind": "QUESTION",
"title": "feed_visible을 Production CQRS로 승격할 것인가",
"version": null
},
"b099ca65-bf9f-4d61-814c-74722453fa3c": {
"kind": "QUESTION",
"title": "Highlight 없는 FeedItem을 허용할 것인가",
"version": null
},
"6cbe963f-86f8-4df6-be5a-900712970d01": {
"kind": "QUESTION",
"title": "실제 동시 트래픽에서도 이 구조가 안정적인가",
"version": null
},
"e6715e81-6dbd-4287-8e19-946c334f38fb": {
"kind": "CASE",
"title": "Visibility OR이 Keyset Index를 깨뜨린 문제",
"version": null
},
"3f886154-1b85-407b-bda4-57d28370e745": {
"kind": "REFERENCE",
"title": "OAuth/OIDC 인증 패턴 선택 기준",
"version": null
},
"19b55c39-c583-4161-9775-df954280a568": {
"kind": "PROJECT_DECISION",
"title": "BFF가 OAuth Token을 관리하는 조건",
"version": null
},
"7ff40767-a00b-4db2-98f6-0cdfce8c8936": {
"kind": "QUESTION",
"title": "Forward-Auth 구조에서 Application Authorization을 어디까지 Edge에 둘 것인가",
"version": null
},
"18a5cde2-dd1e-4bff-9f1c-997577ae438f": {
"kind": "QUESTION",
"title": "BFF의 Session과 OAuth2AuthorizedClient를 어디에 저장할 것인가",
"version": null
},
"66c18e42-116c-459f-86bd-b7e4bf394866": {
"kind": "REFERENCE",
"title": "OAuth Token과 Application Session을 구분하는 기준",
"version": null
},
"97eddd97-1096-426a-a2c6-a6c5bf1cd09f": {
"kind": "REFERENCE",
"title": "BFF 인증 구조 설계 기준",
"version": null
},
"004dd0a2-5fb3-4f25-80c9-576f709de331": {
"kind": "REFERENCE",
"title": "Forward-Auth에서 Identity Header를 신뢰하기 위한 조건",
"version": null
},
"1a00a640-8987-4075-a9e4-7ec023cdffbb": {
"kind": "REFERENCE",
"title": "외부 IdP 연동과 Application 인증 구조의 경계",
"version": null
},
"ede6b9ce-eeed-40c8-9175-9e8116029395": {
"kind": "REFERENCE",
"title": "Public Client와 Confidential Client 구분 기준",
"version": null
},
"c72656b5-842d-45d9-b5f6-82b66b09d0b9": {
"kind": "QUESTION",
"title": "서버 세션 기반 인증 구조는 다중 인스턴스에서 어떻게 운영할 것인가",
"version": null
},
"bb5c37ae-2d94-48f7-ad4e-a37c61c3fd07": {
"kind": "CONCEPT",
"title": "브라우저가 credential을 보관하는 위치와 그 성질",
"version": null
},
"87000d59-b69f-4010-9481-0b71c8bde32d": {
"kind": "CONCEPT",
"title": "Bearer JWT가 인증된 principal이 되기까지",
"version": null
},
"75c6c657-3e03-47a0-a9d0-5637fce9dd3f": {
"kind": "CONCEPT",
"title": "Authorization Code와 PKCE가 보호하는 구간",
"version": null
},
"8c1ebea7-204e-445c-9812-0421d9eb0e9c": {
"kind": "PROJECT_DECISION",
"title": "외부 IdP와의 연동이라도 별도의 인증 방식이 아니다.",
"version": null
},
"9ae4ec71-a32e-49a7-88c2-f7368541c28d": {
"kind": "QUESTION",
"title": "Refresh Token Rotation과 다중 Replica 경쟁을 어떻게 처리할 것인가",
"version": null
},
"39fdf472-82c4-43ed-abec-73de672f08ae": {
"kind": "REFERENCE",
"title": "Authorization Code Flow의 Endpoint와 Credential 이동 기준",
"version": null
}
}
}