Files
document-haness/docs/keycloak/final/.techviz/four-pattern-request-boundaries/spec.json
T

137 lines
4.5 KiB
JSON

{
"version": "1.1",
"id": "four-pattern-request-boundaries",
"title": "로그인 후 요청에서 달라지는 네 인증 경계",
"question": "AP1부터 AP4까지 브라우저 입력, credential 변환, 보호 자원 입력과 최종 출력은 어떻게 다른가?",
"type": "concept",
"direction": "LR",
"audience": [
"Keycloak 통합 패턴을 선택하는 애플리케이션 아키텍트"
],
"summary": "네 패턴은 같은 사용자 JSON을 만들지만 브라우저 입력과 보호 자원이 신뢰하는 credential이 서로 다르다.",
"alt": "AP1, AP2, AP3, AP4의 브라우저 입력, 중간 변환, 보호 자원 credential과 브라우저 출력을 같은 네 축으로 비교한 다이어그램.",
"long_description": "왼쪽부터 AP1 SPA direct, AP2 token mediator, AP3 BFF, AP4 edge forward-auth를 읽는다. 각 항목은 브라우저가 보내는 입력, 중간 계층의 변환, 보호 자원이 실제로 받는 credential, 브라우저가 받는 출력을 같은 순서로 보여 준다. AP1과 AP2는 브라우저가 Bearer JWT로 API를 직접 호출하고, AP3는 BFF가 Bearer JWT를 조립하며, AP4는 Nginx가 인증 결과를 identity header와 internal token으로 바꾼다.",
"source_context": {
"document": "document.md",
"document_sha256": "df4d1a604c74e756672b5b40510abfedb8c67b39af280a5f51985ea9972f5371",
"anchor": {
"kind": "marker",
"value": "four-pattern-request-boundaries",
"line": 114
}
},
"composition": {
"profile": "comparison",
"diagram_only": true,
"reference_ids": [
"contract-comparison"
],
"rationale": "본문이 네 독립 패턴을 동일한 네 비교 축으로 명시하므로 정렬된 comparison 문법이 credential 계약의 차이를 가장 직접적으로 보여 준다."
},
"groups": [],
"nodes": [
{
"id": "ap1",
"label": "AP1 · SPA direct",
"kind": "concept",
"role": "option",
"details": [
"입력 · Bearer access token",
"변환 · 없음",
"자원 · 동일 Bearer JWT",
"출력 · /api/me JSON"
],
"emphasis": "primary",
"description": "브라우저가 보유한 access token으로 Resource Server를 직접 호출하는 패턴.",
"evidence": [
{
"start_line": 90,
"end_line": 101
},
{
"start_line": 107,
"end_line": 109
}
],
"assumption": false
},
{
"id": "ap2",
"label": "AP2 · token mediator",
"kind": "concept",
"role": "option",
"details": [
"입력 · session 뒤 Bearer",
"변환 · access JSON 반환",
"자원 · browser-created JWT",
"출력 · token JSON + /api/me"
],
"description": "Mediator가 refresh token을 보관하지만 access token을 브라우저에 전달해 직접 API 호출을 유지하는 패턴.",
"evidence": [
{
"start_line": 90,
"end_line": 101
},
{
"start_line": 107,
"end_line": 110
}
],
"assumption": false
},
{
"id": "ap3",
"label": "AP3 · BFF",
"kind": "concept",
"role": "option",
"details": [
"입력 · AP3_SESSION",
"변환 · BFF Bearer 생성",
"자원 · BFF Bearer JWT",
"출력 · 중계된 JSON"
],
"description": "브라우저 session을 BFF가 server-held access token 기반의 downstream Bearer 요청으로 바꾸는 패턴.",
"evidence": [
{
"start_line": 90,
"end_line": 101
},
{
"start_line": 107,
"end_line": 111
}
],
"assumption": false
},
{
"id": "ap4",
"label": "AP4 · edge forward-auth",
"kind": "concept",
"role": "option",
"details": [
"입력 · AP4_SESSION",
"변환 · auth 결과 투영",
"자원 · identity + internal",
"출력 · /edge/me JSON"
],
"description": "Nginx와 oauth2-proxy가 proxy session을 검증하고 allowlisted identity header와 internal token을 upstream에 전달하는 패턴.",
"evidence": [
{
"start_line": 90,
"end_line": 101
},
{
"start_line": 107,
"end_line": 112
}
],
"assumption": false
}
],
"edges": [],
"legend": [],
"metadata": {
"rationale": "비교 자체가 이 절의 중심 주장이고 네 항목 모두 같은 세부 축을 사용한다."
}
}