183 lines
5.7 KiB
JSON
183 lines
5.7 KiB
JSON
{
|
|
"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로 분리한다."
|
|
}
|
|
}
|