- generic [ref=f3e3]: - link "본문으로 건너뛰기" [ref=f3e4] [cursor=pointer]: - /url: "#main-content" - banner [ref=f3e5]: - generic [ref=f3e6]: - link "TechLog Studio" [ref=f3e7] [cursor=pointer]: - /url: /studio - text: TechLog - generic [ref=f3e8]: Studio - navigation "Studio 주 탐색" [ref=f3e10]: - link "작업본" [ref=f3e11] [cursor=pointer]: - /url: /studio/documents - link "게시 기록" [ref=f3e12] [cursor=pointer]: - /url: /studio/publications - link "새 문서" [ref=f3e13] [cursor=pointer]: - /url: /studio/documents/new - link "주제·프로젝트" [ref=f3e14] [cursor=pointer]: - /url: /studio/taxonomy - link "릴리즈" [ref=f3e15] [cursor=pointer]: - /url: /studio/releases - link "공개 사이트 보기" [ref=f3e16] [cursor=pointer]: - /url: / - button "로그아웃" [ref=f3e17] - main [ref=f3e18]: - generic [ref=f3e19]: - generic [ref=f3e20]: - generic [ref=f3e21]: - paragraph [ref=f3e22]: WORKSPACE - heading "작업 흐름" [level=1] [ref=f3e23] - paragraph [ref=f3e24]: 작성 중인 기록을 이어서 정리하고 검증·게시 흐름으로 연결합니다. - link "새 문서" [ref=f3e25] [cursor=pointer]: - /url: /studio/documents/new - region "Studio 요약" [ref=f3e26]: - generic [ref=f3e27]: - generic [ref=f3e28]: 전체 작업본 - strong [ref=f3e29]: "47" - generic [ref=f3e30]: - generic [ref=f3e31]: 검증할 기록 - strong [ref=f3e32]: "5" - generic [ref=f3e33]: - generic [ref=f3e34]: 게시 준비 - strong [ref=f3e35]: "0" - generic [ref=f3e36]: - generic [ref=f3e37]: 게시 기록 - strong [ref=f3e38]: "21" - generic [ref=f3e39]: - generic [ref=f3e40]: - heading "이어서 작성" [level=2] [ref=f3e41] - link "전체 보기" [ref=f3e42] [cursor=pointer]: - /url: /studio/documents - paragraph [ref=f3e44]: 이어서 작성할 문서가 없습니다. - generic [ref=f3e45]: - generic [ref=f3e46]: - heading "검증과 미리보기" [level=2] [ref=f3e47] - link "전체 보기" [ref=f3e48] [cursor=pointer]: - /url: /studio/documents - generic [ref=f3e49]: - article [ref=f3e50]: - paragraph [ref=f3e51]: 검증 기록 - generic [ref=f3e52]: - heading [level=3] [ref=f3e53]: - link "Forward-Auth에서 Client가 보낸 Identity Header를 신뢰하면 안 되는 이유" [ref=f3e54] [cursor=pointer]: - /url: /studio/documents/a0e1cc05-92b3-4dac-bce1-513ab8cd862b/edit - paragraph [ref=f3e55]: KeyCloak Patterns · 검증하기 - time [ref=f3e56]: 2026. 9. 7. - article [ref=f3e57]: - paragraph [ref=f3e58]: 검증 기록 - generic [ref=f3e59]: - heading [level=3] [ref=f3e60]: - link "Browser Token을 없애면서 BFF에 Session과 CSRF 책임이 생긴 과정" [ref=f3e61] [cursor=pointer]: - /url: /studio/documents/d85bd6af-7599-4ef7-9407-6609927d5b5c/edit - paragraph [ref=f3e62]: KeyCloak Patterns · 검증하기 - time [ref=f3e63]: 2026. 9. 7. - article [ref=f3e64]: - paragraph [ref=f3e65]: 검증 기록 - generic [ref=f3e66]: - heading [level=3] [ref=f3e67]: - link "Refresh Token 관리만 서버로 이전, Access Token은 여전히 Browser에 노출" [ref=f3e68] [cursor=pointer]: - /url: /studio/documents/488ce49b-afa4-42a5-a2ce-de2e0653cd82/edit - paragraph [ref=f3e69]: KeyCloak Patterns · 검증하기 - time [ref=f3e70]: 2026. 9. 7. - article [ref=f3e71]: - paragraph [ref=f3e72]: 검증 기록 - generic [ref=f3e73]: - heading [level=3] [ref=f3e74]: - link "SPA에서 OAuth Token을 JavaScript Memory에 보관한 경우" [ref=f3e75] [cursor=pointer]: - /url: /studio/documents/bf675775-4f3e-4744-8014-f0efff51422a/edit - paragraph [ref=f3e76]: KeyCloak Patterns · 검증하기 - time [ref=f3e77]: 2026. 9. 7. - article [ref=f3e78]: - paragraph [ref=f3e79]: 열린 질문 - generic [ref=f3e80]: - heading [level=3] [ref=f3e81]: - link "ANALYZE 이후 Cardinality Estimate는 어떻게 달라지는가" [ref=f3e82] [cursor=pointer]: - /url: /studio/documents/e1e0e2a0-c6b6-45bf-be42-f697ba5e2fff/edit - paragraph [ref=f3e83]: Liner N + 1문제 · 검증하기 - time [ref=f3e84]: 2026. 9. 4. - generic [ref=f3e85]: - generic [ref=f3e86]: - heading "게시 준비" [level=2] [ref=f3e87] - link "전체 보기" [ref=f3e88] [cursor=pointer]: - /url: /studio/documents - paragraph [ref=f3e90]: 게시 준비가 끝난 문서가 없습니다. - region [ref=f3e91]: - generic [ref=f3e92]: - paragraph [ref=f3e93]: PUBLIC HOME - heading "지금 집중하는 것" [level=2] [ref=f3e94] - paragraph [ref=f3e95]: 공개 홈 맨 위 영역입니다. 셋 다 비워 두면 그 영역은 나타나지 않습니다. - generic [ref=f3e96]: - generic [ref=f3e97]: - generic [ref=f3e98]: - generic [ref=f3e99]: 현재 작업 (프로젝트) - combobox "현재 작업 (프로젝트) 단계·현재 목표·다음 작업이 카드에 함께 나옵니다." [ref=f3e100]: - option "고르지 않음" - option "Liner N + 1문제" - option "Backend Clean Architecture" - option "KeyCloak Patterns" [selected] - generic [ref=f3e101]: 단계·현재 목표·다음 작업이 카드에 함께 나옵니다. - generic [ref=f3e102]: - generic [ref=f3e103]: 열린 질문 - combobox "열린 질문" [ref=f3e104]: - option "고르지 않음" - option "Forward-Auth 구조에서 Application Authorization을 어디까지 Edge에 둘 것인가" - option "BFF의 Session과 OAuth2AuthorizedClient를 어디에 저장할 것인가" [selected] - option "서버 세션 기반 인증 구조는 다중 인스턴스에서 어떻게 운영할 것인가" - option "Refresh Token Rotation과 다중 Replica 경쟁을 어떻게 처리할 것인가" - generic [ref=f3e105]: - generic [ref=f3e106]: 최근 결정 - combobox "최근 결정" [ref=f3e107]: - option "고르지 않음" - option "브라우저에 OAuth token을 노출하지 않으면서 애플리케이션이 Resource Server 호출을 중계하고 조합해야 하는 경우, BFF가 authorization code 교환과 token 보관, downstream API 호출을 소유한다. 브라우저에는 애플리케이션 session만 제공한다." [selected] - option "외부 IdP 연동은 별도의 인증 구조가 아니다. Google과 같은 외부 IDP는 사용자의 인증을 담당하고, Keycloak은 그 인증 결과를 받아 애플리케이션이 신뢰할 수있는 토큰을 발급한다. SPA, Mediator, BFF, OAuth2-proxy와 같은 4가지 구조는 이렇게 발급된 토큰이나 세션을 애플리케이션에서 어디까지 노출하고 관리할지를 구분한다." - generic [ref=f3e108]: - button "홈 설정 저장" [ref=f3e109] - paragraph [ref=f3e110]: - text: 저장하면 공개 홈에 바로 반영됩니다. - link "주제·프로젝트" [ref=f3e111] [cursor=pointer]: - /url: /studio/taxonomy - text: 에서 프로젝트를 만들고 게시할 수 있습니다. - generic [ref=f3e112]: - generic [ref=f3e113]: - heading "최근 게시" [level=2] [ref=f3e114] - link "게시 기록 보기" [ref=f3e115] [cursor=pointer]: - /url: /studio/publications - generic [ref=f3e116]: - article [ref=f3e117]: - paragraph [ref=f3e118]: 게시 - generic [ref=f3e119]: - heading "Collection Fetch Join Pagination의 In-memory Paging" [level=3] [ref=f3e120] - paragraph [ref=f3e121]: Liner N + 1문제 - time [ref=f3e122]: 2026. 9. 1. - article [ref=f3e123]: - paragraph [ref=f3e124]: 게시 - generic [ref=f3e125]: - heading "Collection Fetch Join으로 N+1을 해결하다 만난 MultiBag예외와 행 폭증 문제" [level=3] [ref=f3e126] - paragraph [ref=f3e127]: Liner N + 1문제 - time [ref=f3e128]: 2026. 9. 1. - article [ref=f3e129]: - paragraph [ref=f3e130]: 게시 - generic [ref=f3e131]: - heading "Fetch 타입이 아닌 조회 방식으로 인한 N+1" [level=3] [ref=f3e132] - paragraph [ref=f3e133]: Liner N + 1문제 - time [ref=f3e134]: 2026. 9. 1. - article [ref=f3e135]: - paragraph [ref=f3e136]: 게시 - generic [ref=f3e137]: - heading "외부 IdP Brokering의 동작" [level=3] [ref=f3e138] - paragraph [ref=f3e139]: KeyCloak Patterns - time [ref=f3e140]: 2026. 9. 1. - article [ref=f3e141]: - paragraph [ref=f3e142]: 게시 - generic [ref=f3e143]: - heading "BFF가 OAuth Token을 관리하는 조건" [level=3] [ref=f3e144] - paragraph [ref=f3e145]: KeyCloak Patterns - time [ref=f3e146]: 2026. 8. 31. - paragraph [ref=f3e147]