feat: 문서 구조 변경 및 tech-visual 스킬 추가

This commit is contained in:
DongHyeonka
2026-09-04 18:20:00 +09:00
parent 43901f0abf
commit 2efb7ee1f2
683 changed files with 61180 additions and 10479 deletions
+559
View File
@@ -0,0 +1,559 @@
# Evidence and decision provenance
> This is an internal sidecar. It is not reader-facing article content.
> Source IDs, repository paths, line ranges, status labels, and access dates belong here—not in `document.md`.
- Document: **브라우저 토큰에서 엣지 세션까지: Keycloak 인증 패턴 네 가지의 경계 설계**
- Citation rendering: `hidden`
- Evidence sources: **48**
## Section evidence map
| Section | Decision contract | Evidence | Status / location |
|---|---|---|---|
| 코드보다 먼저 드러난 문제 | — | `L4121b8d86b` four pattern tradeoff matrix — Four Keycloak integration patterns | `unspecified` · docs/four-pattern-tradeoff-matrix.md — Four Keycloak integration patterns (lines 1-14) |
| ↳ | — | `AP1_BOUNDARY` AP1 SPA direct의 OAuth·token 책임 경계 | `reviewed` · docs/internal-spa-direct-no-google.md — AP1 internal SPA direct: local identity profile (lines 3-10) |
| ↳ | — | `AP2_BOUNDARY` AP2 confidential token mediator의 책임 경계 | `reviewed` · docs/ap2-token-boundary.md — 책임 경계 (lines 3-18) |
| ↳ | — | `AP3_BOUNDARY` AP3 BFF의 tokenless browser 경계 | `reviewed` · docs/ap3-bff-boundary.md — 요청과 token 경계 (lines 3-18) |
| ↳ | — | `AP4_BOUNDARY` AP4 oauth2-proxy와 nginx edge 책임 경계 | `reviewed` · docs/ap4-edge-forward-auth.md — AP4 oauth2-proxy Edge Forward Auth (lines 3-70) |
| 문제를 어렵게 만든 제약 | — | `L4121b8d86b` four pattern tradeoff matrix — Four Keycloak integration patterns | `unspecified` · docs/four-pattern-tradeoff-matrix.md — Four Keycloak integration patterns (lines 1-14) |
| ↳ | — | `AP1_STORAGE` AP1 token 저장 선택과 수용 비용 | `reviewed` · docs/ap1-token-storage.md — AP1 token storage trade-off (lines 3-29) |
| ↳ | — | `AP2_GUARDRAILS` AP2 session, refresh custody, CORS와 audience 가드레일 | `reviewed` · token-mediator/src/main/resources/application.yml — AP2 session and OAuth client configuration (lines 3-34) |
| ↳ | — | `AP3_TRADEOFF` AP3와 AP1의 위협 모델·운영비 교환 | `reviewed` · docs/bff-vs-spa-direct.md — BFF vs SPA direct (lines 3-22) |
| ↳ | — | `AP4_BOUNDARY` AP4 oauth2-proxy와 nginx edge 책임 경계 | `reviewed` · docs/ap4-edge-forward-auth.md — AP4 oauth2-proxy Edge Forward Auth (lines 3-70) |
| ↳ | — | `AP4_RESPONSE_RUNTIME` AP4 trusted header input에서 edge identity JSON까지 | `reviewed` · backend/src/main/java/com/example/keycloakpattern/EdgeIdentityController.java — currentUser and hasValidInternalToken (lines 27-53) |
| 검토한 선택지와 막힌 지점 | 상황·제약, 선택, 선택 이유, 검토한 대안, 수용한 비용, 보완 가드레일 | `L4121b8d86b` four pattern tradeoff matrix — Four Keycloak integration patterns | `unspecified` · docs/four-pattern-tradeoff-matrix.md — Four Keycloak integration patterns (lines 1-14) |
| ↳ | — | `AP1_BOUNDARY` AP1 SPA direct의 OAuth·token 책임 경계 | `reviewed` · docs/internal-spa-direct-no-google.md — AP1 internal SPA direct: local identity profile (lines 3-10) |
| ↳ | — | `AP1_STORAGE` AP1 token 저장 선택과 수용 비용 | `reviewed` · docs/ap1-token-storage.md — AP1 token storage trade-off (lines 3-29) |
| ↳ | — | `AP2_BOUNDARY` AP2 confidential token mediator의 책임 경계 | `reviewed` · docs/ap2-token-boundary.md — 책임 경계 (lines 3-18) |
| ↳ | — | `AP2_IMPLEMENTATION` AP2 access-only handoff의 실제 구현 | `reviewed-discrepancy` · token-mediator/src/main/java/com/example/keycloakpattern/mediator/AccessTokenController.java — accessToken (lines 28-55) |
| ↳ | — | `AP3_BOUNDARY` AP3 BFF의 tokenless browser 경계 | `reviewed` · docs/ap3-bff-boundary.md — 요청과 token 경계 (lines 3-18) |
| ↳ | — | `AP3_TRADEOFF` AP3와 AP1의 위협 모델·운영비 교환 | `reviewed` · docs/bff-vs-spa-direct.md — BFF vs SPA direct (lines 3-22) |
| ↳ | — | `AP4_BOUNDARY` AP4 oauth2-proxy와 nginx edge 책임 경계 | `reviewed` · docs/ap4-edge-forward-auth.md — AP4 oauth2-proxy Edge Forward Auth (lines 3-70) |
| ↳ | — | `AP4_ALTERNATIVE` AP4 Traefik ForwardAuth 대안과 추가 비용 | `config-tested` · docs/traefik-forwardauth-alternative.md — Traefik ForwardAuth alternative (lines 3-22) |
| 선택의 이유와 지킨 경계 | 상황·제약, 선택, 선택 이유, 검토한 대안, 수용한 비용, 보완 가드레일 | `AP1_BOUNDARY` AP1 SPA direct의 OAuth·token 책임 경계 | `reviewed` · docs/internal-spa-direct-no-google.md — AP1 internal SPA direct: local identity profile (lines 3-10) |
| ↳ | — | `AP1_STORAGE` AP1 token 저장 선택과 수용 비용 | `reviewed` · docs/ap1-token-storage.md — AP1 token storage trade-off (lines 3-29) |
| ↳ | — | `AP2_BOUNDARY` AP2 confidential token mediator의 책임 경계 | `reviewed` · docs/ap2-token-boundary.md — 책임 경계 (lines 3-18) |
| ↳ | — | `AP3_BOUNDARY` AP3 BFF의 tokenless browser 경계 | `reviewed` · docs/ap3-bff-boundary.md — 요청과 token 경계 (lines 3-18) |
| ↳ | — | `AP3_TRADEOFF` AP3와 AP1의 위협 모델·운영비 교환 | `reviewed` · docs/bff-vs-spa-direct.md — BFF vs SPA direct (lines 3-22) |
| ↳ | — | `AP4_BOUNDARY` AP4 oauth2-proxy와 nginx edge 책임 경계 | `reviewed` · docs/ap4-edge-forward-auth.md — AP4 oauth2-proxy Edge Forward Auth (lines 3-70) |
| ↳ | — | `AP4_ALTERNATIVE` AP4 Traefik ForwardAuth 대안과 추가 비용 | `config-tested` · docs/traefik-forwardauth-alternative.md — Traefik ForwardAuth alternative (lines 3-22) |
| 선택이 코드와 흐름에 반영되는 방식 | — | `AP1_LOGIN_RUNTIME` AP1 SPA authorization, callback와 browser token data flow | `reviewed` · frontend/src/app.js — UserManager configuration, callback, and renderSession (lines 9-81) |
| ↳ | — | `AP1_PKCE_DEMO_GAP` AP1 manual PKCE helper와 실제 signin path의 구분 | `reviewed-gap` · frontend/src/pkce.js — createPkcePair (lines 1-25) |
| ↳ | — | `AP1_API_RUNTIME` AP1 browser Bearer input에서 /api/me JSON까지 | `reviewed` · frontend/src/app.js — callProtectedApi (lines 83-109) |
| ↳ | — | `AP1_ROLE_FAILURE_RUNTIME` AP1 JWT failure와 realm role authorization 경계 | `reviewed-gap` · backend/src/main/java/com/example/keycloakpattern/KeycloakRealmRoleConverter.java — convert (lines 12-27) |
| ↳ | — | `AP2_LOGIN_FLOW` AP2 browser entry와 Spring oauth2Login code 교환 | `reviewed` · token-mediator/src/main/resources/static/app.js — loginButton click and OAuth client registration (lines 7-9) |
| ↳ | — | `AP2_BOUNDARY_RUNTIME` AP2 token boundary endpoint input과 output | `reviewed` · token-mediator/src/main/java/com/example/keycloakpattern/mediator/TokenBoundaryController.java — tokenBoundary (lines 25-42) |
| ↳ | — | `AP2_ACCESS_RUNTIME` AP2 access handoff와 browser direct API의 data transformation | `reviewed` · token-mediator/src/main/java/com/example/keycloakpattern/mediator/AccessTokenController.java — accessToken (lines 28-54) |
| ↳ | — | `AP2_RESOURCE_RUNTIME` AP2 Resource Server의 JWT input과 /api/me output | `reviewed` · backend/src/main/java/com/example/keycloakpattern/ApiController.java — currentUser (lines 21-28) |
| ↳ | — | `AP3_LOGIN_FLOW` AP3 oauth2Login과 server-side PKCE data flow | `reviewed` · bff/src/main/java/com/example/keycloakpattern/bff/SecurityConfig.java — authorizationRequestResolver and bffSecurity (lines 20-58) |
| ↳ | — | `AP3_BOUNDARY_RUNTIME` AP3 token boundary endpoint의 input과 관측 output | `reviewed` · bff/src/main/java/com/example/keycloakpattern/bff/BffController.java — tokenBoundary (lines 44-64) |
| ↳ | — | `AP3_API_RUNTIME` AP3 session input에서 downstream Bearer와 reader JSON까지 | `reviewed` · bff/src/main/java/com/example/keycloakpattern/bff/BffController.java — currentUser and authorizedClient (lines 67-111) |
| ↳ | — | `AP3_CSRF_RUNTIME` AP3 CSRF cookie-to-header transformation과 preferences output | `reviewed` · bff/src/main/java/com/example/keycloakpattern/bff/CsrfController.java — csrf (lines 14-23) |
| ↳ | — | `AP3_PREFERENCE_SCOPE` AP3 preferences 예시의 process-global state 간극 | `reviewed-gap` · bff/src/main/java/com/example/keycloakpattern/bff/BffController.java — preferenceTheme and updatePreferences (lines 28-95) |
| ↳ | — | `AP4_LOGIN_RUNTIME` AP4 unauthenticated navigation에서 oauth2-proxy session까지 | `reviewed` · docker-compose.yml — oauth2-proxy service (lines 92-143) |
| ↳ | — | `AP4_REQUEST_RUNTIME` AP4 external request에서 auth subrequest와 upstream input까지 | `reviewed` · frontend/default.conf.template — auth_request and upstream mapping (lines 13-74) |
| ↳ | — | `AP4_RESPONSE_RUNTIME` AP4 trusted header input에서 edge identity JSON까지 | `reviewed` · backend/src/main/java/com/example/keycloakpattern/EdgeIdentityController.java — currentUser and hasValidInternalToken (lines 27-53) |
| 결정이 지켜지는지 확인하는 방법 | — | `AP1_VERIFY` AP1 브라우저 흐름과 token 수명주기 검증 계약 | `test-defined` · e2e/pattern1.mjs — AP1 Playwright acceptance contract (lines 82-202) |
| ↳ | — | `AP1_ROLE_FAILURE_RUNTIME` AP1 JWT failure와 realm role authorization 경계 | `reviewed-gap` · backend/src/main/java/com/example/keycloakpattern/KeycloakRealmRoleConverter.java — convert (lines 12-27) |
| ↳ | — | `AP2_VERIFY` AP2 access-only 전달과 브라우저 직접 API 호출 검증 계약 | `test-defined` · e2e/pattern2.mjs — AP2 Playwright acceptance contract (lines 39-112) |
| ↳ | — | `AP2_ACCESS_RUNTIME` AP2 access handoff와 browser direct API의 data transformation | `reviewed` · token-mediator/src/main/java/com/example/keycloakpattern/mediator/AccessTokenController.java — accessToken (lines 28-54) |
| ↳ | — | `AP3_VERIFY` AP3 browser token 비노출과 CSRF 방어 검증 계약 | `test-defined` · e2e/pattern3.mjs — AP3 Playwright acceptance contract (lines 43-191) |
| ↳ | — | `AP3_CSRF_RUNTIME` AP3 CSRF cookie-to-header transformation과 preferences output | `reviewed` · bff/src/main/java/com/example/keycloakpattern/bff/CsrfController.java — csrf (lines 14-23) |
| ↳ | — | `AP4_VERIFY` AP4 edge login과 header spoofing 방어 검증 계약 | `test-defined` · e2e/pattern4.mjs — AP4 Playwright acceptance contract (lines 44-131) |
| ↳ | — | `AP4_RESPONSE_RUNTIME` AP4 trusted header input에서 edge identity JSON까지 | `reviewed` · backend/src/main/java/com/example/keycloakpattern/EdgeIdentityController.java — currentUser and hasValidInternalToken (lines 27-53) |
| ↳ | — | `BRANCH_REACHABILITY` 네 pattern branch와 39개 feature ref의 도달성 | `partially-verified` · docs/keycloak-branch-manifest.tsv — branch target delivery registry (lines 1-40) |
| 얻은 것, 잃은 것, 적용하지 않을 때 | 상황·제약, 선택, 선택 이유, 검토한 대안, 수용한 비용, 보완 가드레일 | `L4121b8d86b` four pattern tradeoff matrix — Four Keycloak integration patterns | `unspecified` · docs/four-pattern-tradeoff-matrix.md — Four Keycloak integration patterns (lines 1-14) |
| ↳ | — | `AP1_STORAGE` AP1 token 저장 선택과 수용 비용 | `reviewed` · docs/ap1-token-storage.md — AP1 token storage trade-off (lines 3-29) |
| ↳ | — | `AP2_GUARDRAILS` AP2 session, refresh custody, CORS와 audience 가드레일 | `reviewed` · token-mediator/src/main/resources/application.yml — AP2 session and OAuth client configuration (lines 3-34) |
| ↳ | — | `AP3_TRADEOFF` AP3와 AP1의 위협 모델·운영비 교환 | `reviewed` · docs/bff-vs-spa-direct.md — BFF vs SPA direct (lines 3-22) |
| ↳ | — | `AP3_PREFERENCE_SCOPE` AP3 preferences 예시의 process-global state 간극 | `reviewed-gap` · bff/src/main/java/com/example/keycloakpattern/bff/BffController.java — preferenceTheme and updatePreferences (lines 28-95) |
| ↳ | — | `AP4_BOUNDARY` AP4 oauth2-proxy와 nginx edge 책임 경계 | `reviewed` · docs/ap4-edge-forward-auth.md — AP4 oauth2-proxy Edge Forward Auth (lines 3-70) |
| ↳ | — | `AP4_ALTERNATIVE` AP4 Traefik ForwardAuth 대안과 추가 비용 | `config-tested` · docs/traefik-forwardauth-alternative.md — Traefik ForwardAuth alternative (lines 3-22) |
| 결국 지키려던 것은 무엇이었나 | — | `L4121b8d86b` four pattern tradeoff matrix — Four Keycloak integration patterns | `unspecified` · docs/four-pattern-tradeoff-matrix.md — Four Keycloak integration patterns (lines 1-14) |
| ↳ | — | `AP1_BOUNDARY` AP1 SPA direct의 OAuth·token 책임 경계 | `reviewed` · docs/internal-spa-direct-no-google.md — AP1 internal SPA direct: local identity profile (lines 3-10) |
| ↳ | — | `AP2_BOUNDARY` AP2 confidential token mediator의 책임 경계 | `reviewed` · docs/ap2-token-boundary.md — 책임 경계 (lines 3-18) |
| ↳ | — | `AP3_BOUNDARY` AP3 BFF의 tokenless browser 경계 | `reviewed` · docs/ap3-bff-boundary.md — 요청과 token 경계 (lines 3-18) |
| ↳ | — | `AP4_BOUNDARY` AP4 oauth2-proxy와 nginx edge 책임 경계 | `reviewed` · docs/ap4-edge-forward-auth.md — AP4 oauth2-proxy Edge Forward Auth (lines 3-70) |
## Source details
### `AP1_BOUNDARY` AP1 SPA direct의 OAuth·token 책임 경계
- Type: `branch-note`
- Status: `reviewed`
- Location: `docs/internal-spa-direct-no-google.md — AP1 internal SPA direct: local identity profile (lines 3-10)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern1/docs/internal-spa-direct-no-google.md`
- Claim IDs: `AP1-C1`
- Decision IDs: `AP1-D1`
- Retrieval priority: `100.0000`
### `AP1_STORAGE` AP1 token 저장 선택과 수용 비용
- Type: `branch-note`
- Status: `reviewed`
- Location: `docs/ap1-token-storage.md — AP1 token storage trade-off (lines 3-29)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern1/docs/ap1-token-storage.md`
- Claim IDs: `AP1-C2`
- Decision IDs: `AP1-D2`
- Retrieval priority: `100.0000`
### `AP1_LOGIN_RUNTIME` AP1 SPA authorization, callback와 browser token data flow
- Type: `canonical-project`
- Status: `reviewed`
- Location: `frontend/src/app.js — UserManager configuration, callback, and renderSession (lines 9-81)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern1/frontend/src/app.js`
- Claim IDs: `AP1-C4`
- Decision IDs: —
- Retrieval priority: `100.0000`
### `AP1_PKCE_DEMO_GAP` AP1 manual PKCE helper와 실제 signin path의 구분
- Type: `canonical-project`
- Status: `reviewed-gap`
- Location: `frontend/src/pkce.js — createPkcePair (lines 1-25)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern1/frontend/src/pkce.js`
- Claim IDs: `AP1-C5`
- Decision IDs: —
- Retrieval priority: `85.0000`
### `AP1_API_RUNTIME` AP1 browser Bearer input에서 /api/me JSON까지
- Type: `canonical-project`
- Status: `reviewed`
- Location: `frontend/src/app.js — callProtectedApi (lines 83-109)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern1/frontend/src/app.js`
- Claim IDs: `AP1-C6`
- Decision IDs: —
- Retrieval priority: `100.0000`
### `AP1_ROLE_FAILURE_RUNTIME` AP1 JWT failure와 realm role authorization 경계
- Type: `canonical-project`
- Status: `reviewed-gap`
- Location: `backend/src/main/java/com/example/keycloakpattern/KeycloakRealmRoleConverter.java — convert (lines 12-27)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern1/backend/src/main/java/com/example/keycloakpattern/KeycloakRealmRoleConverter.java`
- Claim IDs: `AP1-C7`
- Decision IDs: —
- Retrieval priority: `90.0000`
### `AP1_GUARDRAILS` AP1 public client와 Resource Server 가드레일
- Type: `canonical-project`
- Status: `reviewed`
- Location: `keycloak/import/keycloak-patterns-realm.json — spa-public client and realm token settings (lines 11-73)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern1/keycloak/import/keycloak-patterns-realm.json`
- Claim IDs: `AP1-C3`
- Decision IDs: —
- Retrieval priority: `85.0000`
### `AP1_VERIFY` AP1 브라우저 흐름과 token 수명주기 검증 계약
- Type: `canonical-project`
- Status: `test-defined`
- Location: `e2e/pattern1.mjs — AP1 Playwright acceptance contract (lines 82-202)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern1/e2e/pattern1.mjs`
- Claim IDs: `AP1-T1`
- Decision IDs: —
- Retrieval priority: `80.0000`
### `AP2_BOUNDARY` AP2 confidential token mediator의 책임 경계
- Type: `branch-note`
- Status: `reviewed`
- Location: `docs/ap2-token-boundary.md — 책임 경계 (lines 3-18)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern2/docs/ap2-token-boundary.md`
- Claim IDs: `AP2-C1`
- Decision IDs: `AP2-D1`
- Retrieval priority: `100.0000`
### `AP2_IMPLEMENTATION` AP2 access-only handoff의 실제 구현
- Type: `canonical-project`
- Status: `reviewed-discrepancy`
- Location: `token-mediator/src/main/java/com/example/keycloakpattern/mediator/AccessTokenController.java — accessToken (lines 28-55)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern2/token-mediator/src/main/java/com/example/keycloakpattern/mediator/AccessTokenController.java`
- Claim IDs: `AP2-C2`
- Decision IDs: —
- Retrieval priority: `100.0000`
### `AP2_LOGIN_FLOW` AP2 browser entry와 Spring oauth2Login code 교환
- Type: `canonical-project`
- Status: `reviewed`
- Location: `token-mediator/src/main/resources/static/app.js — loginButton click and OAuth client registration (lines 7-9)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern2/token-mediator/src/main/resources/static/app.js`
- Claim IDs: `AP2-C4`
- Decision IDs: —
- Retrieval priority: `90.0000`
### `AP2_BOUNDARY_RUNTIME` AP2 token boundary endpoint input과 output
- Type: `canonical-project`
- Status: `reviewed`
- Location: `token-mediator/src/main/java/com/example/keycloakpattern/mediator/TokenBoundaryController.java — tokenBoundary (lines 25-42)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern2/token-mediator/src/main/java/com/example/keycloakpattern/mediator/TokenBoundaryController.java`
- Claim IDs: `AP2-C5`
- Decision IDs: —
- Retrieval priority: `95.0000`
### `AP2_ACCESS_RUNTIME` AP2 access handoff와 browser direct API의 data transformation
- Type: `canonical-project`
- Status: `reviewed`
- Location: `token-mediator/src/main/java/com/example/keycloakpattern/mediator/AccessTokenController.java — accessToken (lines 28-54)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern2/token-mediator/src/main/java/com/example/keycloakpattern/mediator/AccessTokenController.java`
- Claim IDs: `AP2-C6`
- Decision IDs: —
- Retrieval priority: `100.0000`
### `AP2_RESOURCE_RUNTIME` AP2 Resource Server의 JWT input과 /api/me output
- Type: `canonical-project`
- Status: `reviewed`
- Location: `backend/src/main/java/com/example/keycloakpattern/ApiController.java — currentUser (lines 21-28)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern2/backend/src/main/java/com/example/keycloakpattern/ApiController.java`
- Claim IDs: `AP2-C7`
- Decision IDs: —
- Retrieval priority: `95.0000`
### `AP2_GUARDRAILS` AP2 session, refresh custody, CORS와 audience 가드레일
- Type: `canonical-project`
- Status: `reviewed`
- Location: `token-mediator/src/main/resources/application.yml — AP2 session and OAuth client configuration (lines 3-34)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern2/token-mediator/src/main/resources/application.yml`
- Claim IDs: `AP2-C3`
- Decision IDs: —
- Retrieval priority: `85.0000`
### `AP2_VERIFY` AP2 access-only 전달과 브라우저 직접 API 호출 검증 계약
- Type: `canonical-project`
- Status: `test-defined`
- Location: `e2e/pattern2.mjs — AP2 Playwright acceptance contract (lines 39-112)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern2/e2e/pattern2.mjs`
- Claim IDs: `AP2-T1`
- Decision IDs: —
- Retrieval priority: `80.0000`
### `AP3_BOUNDARY` AP3 BFF의 tokenless browser 경계
- Type: `branch-note`
- Status: `reviewed`
- Location: `docs/ap3-bff-boundary.md — 요청과 token 경계 (lines 3-18)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern3/docs/ap3-bff-boundary.md`
- Claim IDs: `AP3-C1`
- Decision IDs: `AP3-D1`
- Retrieval priority: `100.0000`
### `AP3_TRADEOFF` AP3와 AP1의 위협 모델·운영비 교환
- Type: `branch-note`
- Status: `reviewed`
- Location: `docs/bff-vs-spa-direct.md — BFF vs SPA direct (lines 3-22)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern3/docs/bff-vs-spa-direct.md`
- Claim IDs: `AP3-C2`
- Decision IDs: `AP3-D2`
- Retrieval priority: `100.0000`
### `AP3_GUARDRAILS` AP3 CSRF token과 SameSite 가드레일
- Type: `canonical-project`
- Status: `reviewed`
- Location: `bff/src/main/java/com/example/keycloakpattern/bff/SecurityConfig.java — bffSecurity (lines 25-58)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern3/bff/src/main/java/com/example/keycloakpattern/bff/SecurityConfig.java`
- Claim IDs: `AP3-C3`
- Decision IDs: —
- Retrieval priority: `85.0000`
### `AP3_LOGIN_FLOW` AP3 oauth2Login과 server-side PKCE data flow
- Type: `canonical-project`
- Status: `reviewed`
- Location: `bff/src/main/java/com/example/keycloakpattern/bff/SecurityConfig.java — authorizationRequestResolver and bffSecurity (lines 20-58)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern3/bff/src/main/java/com/example/keycloakpattern/bff/SecurityConfig.java`
- Claim IDs: `AP3-C4`
- Decision IDs: —
- Retrieval priority: `95.0000`
### `AP3_BOUNDARY_RUNTIME` AP3 token boundary endpoint의 input과 관측 output
- Type: `canonical-project`
- Status: `reviewed`
- Location: `bff/src/main/java/com/example/keycloakpattern/bff/BffController.java — tokenBoundary (lines 44-64)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern3/bff/src/main/java/com/example/keycloakpattern/bff/BffController.java`
- Claim IDs: `AP3-C5`
- Decision IDs: —
- Retrieval priority: `95.0000`
### `AP3_API_RUNTIME` AP3 session input에서 downstream Bearer와 reader JSON까지
- Type: `canonical-project`
- Status: `reviewed`
- Location: `bff/src/main/java/com/example/keycloakpattern/bff/BffController.java — currentUser and authorizedClient (lines 67-111)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern3/bff/src/main/java/com/example/keycloakpattern/bff/BffController.java`
- Claim IDs: `AP3-C6`
- Decision IDs: —
- Retrieval priority: `100.0000`
### `AP3_CSRF_RUNTIME` AP3 CSRF cookie-to-header transformation과 preferences output
- Type: `canonical-project`
- Status: `reviewed`
- Location: `bff/src/main/java/com/example/keycloakpattern/bff/CsrfController.java — csrf (lines 14-23)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern3/bff/src/main/java/com/example/keycloakpattern/bff/CsrfController.java`
- Claim IDs: `AP3-C7`
- Decision IDs: —
- Retrieval priority: `100.0000`
### `AP3_PREFERENCE_SCOPE` AP3 preferences 예시의 process-global state 간극
- Type: `canonical-project`
- Status: `reviewed-gap`
- Location: `bff/src/main/java/com/example/keycloakpattern/bff/BffController.java — preferenceTheme and updatePreferences (lines 28-95)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern3/bff/src/main/java/com/example/keycloakpattern/bff/BffController.java`
- Claim IDs: `AP3-C8`
- Decision IDs: —
- Retrieval priority: `90.0000`
### `AP3_VERIFY` AP3 browser token 비노출과 CSRF 방어 검증 계약
- Type: `canonical-project`
- Status: `test-defined`
- Location: `e2e/pattern3.mjs — AP3 Playwright acceptance contract (lines 43-191)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern3/e2e/pattern3.mjs`
- Claim IDs: `AP3-T1`
- Decision IDs: —
- Retrieval priority: `80.0000`
### `AP4_BOUNDARY` AP4 oauth2-proxy와 nginx edge 책임 경계
- Type: `branch-note`
- Status: `reviewed`
- Location: `docs/ap4-edge-forward-auth.md — AP4 oauth2-proxy Edge Forward Auth (lines 3-70)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern4/docs/ap4-edge-forward-auth.md`
- Claim IDs: `AP4-C1`
- Decision IDs: `AP4-D1`
- Retrieval priority: `100.0000`
### `AP4_NGINX` AP4 auth_request와 identity header 덮어쓰기
- Type: `canonical-project`
- Status: `reviewed`
- Location: `frontend/default.conf.template — nginx AP4 server configuration (lines 13-74)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern4/frontend/default.conf.template`
- Claim IDs: `AP4-C2`
- Decision IDs: —
- Retrieval priority: `90.0000`
### `AP4_LOGIN_RUNTIME` AP4 unauthenticated navigation에서 oauth2-proxy session까지
- Type: `canonical-project`
- Status: `reviewed`
- Location: `docker-compose.yml — oauth2-proxy service (lines 92-143)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern4/docker-compose.yml`
- Claim IDs: `AP4-C5`
- Decision IDs: —
- Retrieval priority: `100.0000`
### `AP4_REQUEST_RUNTIME` AP4 external request에서 auth subrequest와 upstream input까지
- Type: `canonical-project`
- Status: `reviewed`
- Location: `frontend/default.conf.template — auth_request and upstream mapping (lines 13-74)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern4/frontend/default.conf.template`
- Claim IDs: `AP4-C6`
- Decision IDs: —
- Retrieval priority: `100.0000`
### `AP4_RESPONSE_RUNTIME` AP4 trusted header input에서 edge identity JSON까지
- Type: `canonical-project`
- Status: `reviewed`
- Location: `backend/src/main/java/com/example/keycloakpattern/EdgeIdentityController.java — currentUser and hasValidInternalToken (lines 27-53)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern4/backend/src/main/java/com/example/keycloakpattern/EdgeIdentityController.java`
- Claim IDs: `AP4-C7`
- Decision IDs: —
- Retrieval priority: `100.0000`
### `AP4_BACKEND` AP4 upstream의 내부 token 검증
- Type: `canonical-project`
- Status: `reviewed`
- Location: `backend/src/main/java/com/example/keycloakpattern/EdgeIdentityController.java — currentUser and hasValidInternalToken (lines 18-53)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern4/backend/src/main/java/com/example/keycloakpattern/EdgeIdentityController.java`
- Claim IDs: `AP4-C3`
- Decision IDs: —
- Retrieval priority: `85.0000`
### `AP4_VERIFY` AP4 edge login과 header spoofing 방어 검증 계약
- Type: `canonical-project`
- Status: `test-defined`
- Location: `e2e/pattern4.mjs — AP4 Playwright acceptance contract (lines 44-131)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern4/e2e/pattern4.mjs`
- Claim IDs: `AP4-T1`
- Decision IDs: —
- Retrieval priority: `80.0000`
### `AP4_ALTERNATIVE` AP4 Traefik ForwardAuth 대안과 추가 비용
- Type: `branch-note`
- Status: `config-tested`
- Location: `docs/traefik-forwardauth-alternative.md — Traefik ForwardAuth alternative (lines 3-22)`
- Public/reference URL: `repo://keycloak-pattern/develop-keycloak-pattern4/docs/traefik-forwardauth-alternative.md`
- Claim IDs: `AP4-C4`
- Decision IDs: `AP4-D2`
- Retrieval priority: `85.0000`
### `BRANCH_REACHABILITY` 네 pattern branch와 39개 feature ref의 도달성
- Type: `canonical-project`
- Status: `partially-verified`
- Location: `docs/keycloak-branch-manifest.tsv — branch target delivery registry (lines 1-40)`
- Public/reference URL: `repo://keycloak-pattern/develop/docs/keycloak-branch-manifest.tsv`
- Claim IDs: `COMMON-T1`
- Decision IDs: —
- Retrieval priority: `70.0000`
### `L4121b8d86b` four pattern tradeoff matrix — Four Keycloak integration patterns
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/four-pattern-tradeoff-matrix.md — Four Keycloak integration patterns (lines 1-14)`
- Public/reference URL: `repo:///docs/four-pattern-tradeoff-matrix.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `45.7404`
### `La5d0a70f24` four pattern tradeoff matrix — 이 repository의 실행 증거
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/four-pattern-tradeoff-matrix.md — 이 repository의 실행 증거 (lines 28-37)`
- Public/reference URL: `repo:///docs/four-pattern-tradeoff-matrix.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `21.7129`
### `L2c120c8093` four pattern tradeoff matrix — 선택 기준
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/four-pattern-tradeoff-matrix.md — 선택 기준 (lines 15-27)`
- Public/reference URL: `repo:///docs/four-pattern-tradeoff-matrix.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `17.2810`
### `L4ec23ba045` keycloak branch index — Keycloak branch implementation index
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/keycloak-branch-index.md — Keycloak branch implementation index (lines 1-29)`
- Public/reference URL: `repo:///docs/keycloak-branch-index.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `14.8301`
### `Lb39734ea9b` google idp brokering — Google IdP brokering
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/google-idp-brokering.md — Google IdP brokering (lines 1-5)`
- Public/reference URL: `repo:///docs/google-idp-brokering.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `5.8515`
### `La28755902d` google claim to role — Google claim-to-role mapping
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/google-claim-to-role.md — Google claim-to-role mapping (lines 1-18)`
- Public/reference URL: `repo:///docs/google-claim-to-role.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `4.7503`
### `Le8474e5ddd` https termination — HTTPS termination: nginx or Caddy
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/https-termination.md — HTTPS termination: nginx or Caddy (lines 1-20)`
- Public/reference URL: `repo:///docs/https-termination.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `2.6850`
### `L0eb117abf5` google redirect uri policy — Google redirect URI policy
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/google-redirect-uri-policy.md — Google redirect URI policy (lines 1-24)`
- Public/reference URL: `repo:///docs/google-redirect-uri-policy.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `2.5149`
### `L5d2c3b8016` reverse proxy headers — Reverse proxy headers
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/reverse-proxy-headers.md — Reverse proxy headers (lines 1-15)`
- Public/reference URL: `repo:///docs/reverse-proxy-headers.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `1.8170`
### `L03b6abccb3` google claim mapping — Google claim and identity mapping
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/google-claim-mapping.md — Google claim and identity mapping (lines 1-23)`
- Public/reference URL: `repo:///docs/google-claim-mapping.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `1.5038`
### `L0217277f31` account linking sub vs email — Federated account key: `sub`, not email
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/account-linking-sub-vs-email.md — Federated account key: `sub`, not email (lines 1-18)`
- Public/reference URL: `repo:///docs/account-linking-sub-vs-email.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `1.4977`
### `L4a3b756b3d` google idp brokering — Two verification profiles
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/google-idp-brokering.md — Two verification profiles (lines 6-28)`
- Public/reference URL: `repo:///docs/google-idp-brokering.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `1.0205`
### `Le9a41ffd86` public domain tunneling — Public HTTPS domain for broker callbacks
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/public-domain-tunneling.md — Public HTTPS domain for broker callbacks (lines 1-21)`
- Public/reference URL: `repo:///docs/public-domain-tunneling.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `0.7299`
### `L55212df816` first broker login security — First Broker Login security
- Type: `local-document`
- Status: `unspecified`
- Location: `docs/first-broker-login-security.md — First Broker Login security (lines 1-27)`
- Public/reference URL: `repo:///docs/first-broker-login-security.md`
- Claim IDs: —
- Decision IDs: —
- Retrieval priority: `0.0881`