From 00081ba14fdf0faa3ab0b5e74911717b92c62697 Mon Sep 17 00:00:00 2001 From: donghyeon-ka Date: Sat, 25 Jul 2026 16:41:54 +0900 Subject: [PATCH] docs: compare BFF and SPA-direct boundaries --- docs/bff-vs-spa-direct.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 docs/bff-vs-spa-direct.md diff --git a/docs/bff-vs-spa-direct.md b/docs/bff-vs-spa-direct.md new file mode 100644 index 0000000..733aabc --- /dev/null +++ b/docs/bff-vs-spa-direct.md @@ -0,0 +1,22 @@ +# BFF vs SPA direct + +| 항목 | SPA direct (AP1) | BFF (AP3) | +|---|---|---| +| OAuth client | public + PKCE | confidential + server secret | +| token holder | browser JavaScript memory | BFF server | +| browser credential | access/refresh token | HttpOnly session cookie | +| XSS 영향 | 실행 중 token/API 권한 탈취 가능 | cookie 읽기는 막지만 same-origin 요청 악용 가능 | +| CSRF | bearer header 중심이라 상대적으로 작음 | session cookie이므로 명시적 방어 필요 | +| backend 상태 | stateless 가능 | session store 필요 | +| logout/revocation | browser와 Keycloak 조정 | BFF session과 Keycloak logout 조정 | +| scale-out | JWT 검증 위주 | sticky session 또는 shared store | + +이 repository의 AP3는 Spring `oauth2Login`, confidential `bff-confidential` +client, server-side authorized-client/token 보관, HttpOnly/SameSite session, +CSRF token을 실제 구현한다. AP1은 token을 메모리에만 두지만 XSS가 실행되면 +현재 token을 사용할 수 있다는 경계를 E2E로 보여 준다. + +선택은 “BFF가 항상 더 안전하다”가 아니라 threat model과 운영비의 교환이다. +브라우저에 OAuth token을 노출하지 않는 것이 우선이고 stateful 운영을 감당할 +수 있으면 BFF, protocol과 stateless Resource Server를 직접 학습하려면 AP1이 +더 투명하다.