147 lines
5.4 KiB
JSON
147 lines
5.4 KiB
JSON
{
|
|
"version": "1.1",
|
|
"id": "credential-custody-map",
|
|
"title": "Credential은 사라지지 않고 owner와 형태가 바뀐다",
|
|
"question": "네 패턴은 애플리케이션 credential을 어느 경계에 보관하며 브라우저 상태와 운영 근거에는 무엇이 남는가?",
|
|
"type": "concept",
|
|
"direction": "LR",
|
|
"audience": [
|
|
"인증 패턴을 선택하는 개발자",
|
|
"보안 설계 검토자"
|
|
],
|
|
"summary": "AP1은 token을 JavaScript memory에 두고, AP2·AP3는 server-side owner를 추가하며, AP4는 minimal proxy session과 edge 운영 계약을 남긴다.",
|
|
"alt": "AP1부터 AP4까지 OAuth credential 소유자, 브라우저 credential, 보관 모델과 현재 입증된 운영 범위를 같은 네 축으로 정렬한 비교 다이어그램.",
|
|
"long_description": "왼쪽부터 AP1, AP2, AP3, AP4를 읽는다. 각 항목은 OAuth credential 소유자, 브라우저에 남는 애플리케이션 credential, 보관 모델, shared durability나 replica 운영에 관한 현재 근거를 같은 순서로 제시한다. AP1의 access·refresh·ID token은 실행 중 JavaScript memory에 있고 persistent Web Storage 복사본만 줄인다. AP2는 refresh token을 mediator가 소유하고 server session 식별 cookie를 사용하지만 shared durable store는 입증되지 않았다. AP3는 refresh token을 BFF가 소유하며 브라우저에는 HttpOnly session과 readable XSRF token이 남는다. AP4는 minimal client-side proxy session을 사용하고 replica cookie secret 공유와 rotation은 검증되지 않았다.",
|
|
"source_context": {
|
|
"document": "document.md",
|
|
"document_sha256": "df4d1a604c74e756672b5b40510abfedb8c67b39af280a5f51985ea9972f5371",
|
|
"anchor": {
|
|
"kind": "marker",
|
|
"value": "credential-custody-map",
|
|
"line": 68
|
|
}
|
|
},
|
|
"composition": {
|
|
"profile": "comparison",
|
|
"diagram_only": true,
|
|
"reference_ids": [
|
|
"contract-comparison"
|
|
],
|
|
"rationale": "원문이 네 패턴의 credential owner, 브라우저 상태와 운영 증거를 독립 계약으로 비교하므로 transfer edge를 만들지 않고 동일한 detail 축을 정렬하는 comparison 구성이 적합하다."
|
|
},
|
|
"groups": [],
|
|
"nodes": [
|
|
{
|
|
"id": "ap1-browser-memory",
|
|
"label": "AP1 · browser memory",
|
|
"kind": "concept",
|
|
"role": "option",
|
|
"details": [
|
|
"OAuth: token 3종 → JS",
|
|
"브라우저: 실행 중 JS가 읽음",
|
|
"보관: runtime memory",
|
|
"운영: 영속 Web Storage 없음"
|
|
],
|
|
"emphasis": "warning",
|
|
"description": "AP1은 OAuth token을 실행 중 JavaScript memory에 두며 memory-only 선택은 persistent script-readable 복사본을 줄인다.",
|
|
"evidence": [
|
|
{
|
|
"start_line": 53,
|
|
"end_line": 53
|
|
},
|
|
{
|
|
"start_line": 66,
|
|
"end_line": 66
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "ap2-mediator-custody",
|
|
"label": "AP2 · mediator custody",
|
|
"kind": "concept",
|
|
"role": "option",
|
|
"details": [
|
|
"OAuth: refresh → mediator",
|
|
"브라우저: session cookie",
|
|
"보관: server-side state",
|
|
"운영: shared store 미입증"
|
|
],
|
|
"description": "AP2는 refresh token owner를 mediator로 옮기고 server-side login state를 식별하는 cookie를 사용하지만 shared durable persistence는 입증되지 않았다.",
|
|
"evidence": [
|
|
{
|
|
"start_line": 53,
|
|
"end_line": 54
|
|
},
|
|
{
|
|
"start_line": 72,
|
|
"end_line": 72
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "ap3-bff-custody",
|
|
"label": "AP3 · BFF/session",
|
|
"kind": "concept",
|
|
"role": "option",
|
|
"details": [
|
|
"OAuth: refresh → BFF",
|
|
"브라우저: HttpOnly session",
|
|
"보관: session + readable XSRF",
|
|
"운영: shared store 미입증"
|
|
],
|
|
"emphasis": "primary",
|
|
"description": "AP3는 OAuth token을 JavaScript에 주지 않고 BFF가 refresh token을 소유하지만 브라우저에는 session과 CSRF용 readable token이 남는다.",
|
|
"evidence": [
|
|
{
|
|
"start_line": 53,
|
|
"end_line": 54
|
|
},
|
|
{
|
|
"start_line": 64,
|
|
"end_line": 64
|
|
},
|
|
{
|
|
"start_line": 72,
|
|
"end_line": 72
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "ap4-proxy-session",
|
|
"label": "AP4 · proxy session",
|
|
"kind": "concept",
|
|
"role": "option",
|
|
"details": [
|
|
"OAuth: JS 미수신",
|
|
"브라우저: proxy session",
|
|
"보관: minimal client-side",
|
|
"운영: secret 공유·회전 미검증"
|
|
],
|
|
"description": "AP4는 minimal client-side proxy session을 사용하며 JavaScript는 OAuth token을 받지 않지만 replica 간 cookie secret 운영은 검증되지 않았다.",
|
|
"evidence": [
|
|
{
|
|
"start_line": 55,
|
|
"end_line": 55
|
|
},
|
|
{
|
|
"start_line": 64,
|
|
"end_line": 64
|
|
},
|
|
{
|
|
"start_line": 72,
|
|
"end_line": 72
|
|
}
|
|
],
|
|
"assumption": false
|
|
}
|
|
],
|
|
"edges": [],
|
|
"legend": [],
|
|
"metadata": {
|
|
"rationale": "보안 등급이나 이동 순서를 만들지 않고 각 패턴에서 확인된 credential custody와 현재 입증되지 않은 운영 속성을 같은 필드 순서로 비교했다."
|
|
}
|
|
}
|