{ "version": "1.1", "id": "idp-broker-upstream-downstream-boundary", "title": "외부 IdP 인증은 Keycloak broker에서 application credential로 다시 경계가 나뉜다", "question": "외부 IdP의 인증 결과는 Keycloak broker에서 어떻게 local identity와 Keycloak-issued authorization code로 바뀌고 기존 AP1~AP4 경계로 이어지는가?", "type": "data-flow", "direction": "LR", "audience": [ "외부 IdP brokering과 application OAuth 경계를 구분하려는 개발자" ], "summary": "Google은 upstream identity provider이고 Keycloak이 그 결과를 검증해 local identity와 Keycloak-issued authorization code로 바꾼 뒤 기존 AP1~AP4 downstream 경계로 넘긴다.", "alt": "Upstream IdP zone의 Google identity assertion이 Keycloak broker zone의 validation과 account linking을 거쳐 Keycloak authorization code가 되고 기존 AP1~AP4 application 경계로 이어지는 다이어그램.", "long_description": "왼쪽 upstream IdP zone의 Google이 identity assertion을 Keycloak broker에 넘긴다. Keycloak은 assertion을 검증하고 provider alias와 upstream sub로 local identity를 연결한 뒤 자기 authorization code를 발급한다. 이 code가 기존 AP1·AP2·AP3·AP4 application 경계 중 하나로 이어지므로 application이 신뢰하는 issuer는 계속 Keycloak이다.", "source_context": { "document": "document.md", "document_sha256": "ea10df24b892e2c57123a37a4b4f0d821e4f394353e6746f50df6a48342353e9", "anchor": { "kind": "heading", "value": "Google login이 들어와도 네 애플리케이션 경계는 바뀌지 않는다", "line": 1150 } }, "composition": { "profile": "two-zone-pipeline", "diagram_only": true, "reference_ids": [ "localization-pipeline" ], "rationale": "핵심이 upstream IdP와 Keycloak/application 사이의 protocol boundary를 분리하면서 변환 순서를 함께 보여 주는 것이므로 two-zone-pipeline을 사용한다.", "focus_node": "broker" }, "groups": [ { "id": "upstream-zone", "label": "Upstream IdP", "kind": "system", "role": "zone", "description": "Keycloak 앞에서 사용자 인증을 수행하는 외부 identity provider 경계.", "evidence": [ { "start_line": 1152, "end_line": 1157 } ], "assumption": false }, { "id": "broker-app-zone", "label": "Keycloak → Application", "kind": "system", "role": "zone", "description": "Keycloak이 upstream 결과를 local identity와 자기 authorization code로 바꿔 application OAuth 경계로 넘기는 구간.", "evidence": [ { "start_line": 1152, "end_line": 1165 } ], "assumption": false } ], "nodes": [ { "id": "google", "label": "Google IdP", "kind": "service", "role": "source", "group": "upstream-zone", "description": "Upstream authorization을 수행하고 identity assertion을 Keycloak에 돌려주는 IdP.", "details": [ "identity assertion" ], "evidence": [ { "start_line": 1152, "end_line": 1157 } ], "assumption": false }, { "id": "broker", "label": "Keycloak broker", "kind": "service", "role": "service", "group": "broker-app-zone", "emphasis": "primary", "description": "Upstream response를 검증하고 provider alias와 upstream sub로 local user와 session을 연결하는 broker.", "details": [ "broker validation", "provider alias + sub", "local user · session" ], "evidence": [ { "start_line": 1152, "end_line": 1160 } ], "assumption": false }, { "id": "keycloak-code", "label": "Keycloak authorization code", "kind": "data", "role": "service", "group": "broker-app-zone", "description": "Upstream token이 아니라 Keycloak이 downstream application에 발급하는 authorization code.", "evidence": [ { "start_line": 1161, "end_line": 1165 } ], "assumption": false }, { "id": "downstream", "label": "AP1 · AP2 · AP3 · AP4", "kind": "service", "role": "sink", "group": "broker-app-zone", "description": "외부 IdP와 무관하게 기존 application credential boundary 중 하나가 이어지는 downstream 경계.", "evidence": [ { "start_line": 1162, "end_line": 1165 } ], "assumption": false } ], "edges": [ { "id": "b1", "from": "google", "to": "broker", "label": "identity assertion", "kind": "data", "evidence": [ { "start_line": 1157, "end_line": 1158 } ], "assumption": false }, { "id": "b2", "from": "broker", "to": "keycloak-code", "label": "issue code", "kind": "data", "emphasis": "primary", "evidence": [ { "start_line": 1158, "end_line": 1161 } ], "assumption": false }, { "id": "b3", "from": "keycloak-code", "to": "downstream", "label": "Keycloak issuer", "kind": "data", "evidence": [ { "start_line": 1161, "end_line": 1165 } ], "assumption": false } ], "legend": [], "metadata": { "rationale": "Google federation을 다섯 번째 application pattern으로 그리지 않고 upstream IdP → Keycloak broker → 기존 application boundary로 분리한다." } }