Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c22b217fbd | ||
|
|
c07593c471 | ||
|
|
d01a60964a | ||
|
|
5d7544256a | ||
|
|
eacc0e86c9 | ||
|
|
ac912cb354 |
@@ -9,3 +9,6 @@ e2e/node_modules/
|
|||||||
google-e2e/node_modules/
|
google-e2e/node_modules/
|
||||||
frontend/node_modules/
|
frontend/node_modules/
|
||||||
frontend/dist/
|
frontend/dist/
|
||||||
|
|
||||||
|
bff/target
|
||||||
|
token-mediator/target
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
tunnel: 00000000-0000-0000-0000-000000000000
|
||||||
|
credentials-file: /etc/cloudflared/00000000-0000-0000-0000-000000000000.json
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
- hostname: auth.example.test
|
||||||
|
service: http://reverse-proxy:8080
|
||||||
|
- service: http_status:404
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# Four Keycloak integration patterns
|
||||||
|
|
||||||
|
| 축 | AP1 SPA direct | AP2 token mediator | AP3 BFF | AP4 edge auth |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| OAuth client | public | confidential | confidential | confidential proxy |
|
||||||
|
| browser 보유물 | access/refresh token | 짧은 handoff code 또는 app token | HttpOnly session cookie | proxy session cookie |
|
||||||
|
| OAuth code 교환 | browser + PKCE | mediator backend | BFF | oauth2-proxy |
|
||||||
|
| API bearer 검증 | Spring resource server | mediator/downstream API | BFF 내부 또는 downstream | edge가 인증 후 trusted header |
|
||||||
|
| server session | 없음 | handoff 상태만 짧게 | 필수 | proxy cookie/session |
|
||||||
|
| XSS token 탈취면 | 가장 큼 | 축소 | browser token 제거 | browser token 제거 |
|
||||||
|
| CSRF 주의 | token endpoint/refresh 설계 | app cookie 사용 시 | 필수 방어 | proxy cookie 사용 시 |
|
||||||
|
| 수평 확장 상태 | 단순 | handoff store 공유 가능 | session store 필요 | proxy 설정에 따름 |
|
||||||
|
| 주 학습 포인트 | PKCE/JWT/RS | token 경계·one-time handoff | oauth2Login/session/CSRF | auth_request/header trust |
|
||||||
|
|
||||||
|
## 선택 기준
|
||||||
|
|
||||||
|
- 브라우저에서 OAuth와 token 수명주기를 직접 학습하려면 AP1.
|
||||||
|
- 브라우저에 upstream token을 주지 않되 API 호출은 bearer 중심으로 유지하려면
|
||||||
|
AP2.
|
||||||
|
- token을 browser에서 완전히 제거하고 애플리케이션 단위 인가·세션을
|
||||||
|
중앙화하려면 AP3.
|
||||||
|
- 기존 upstream을 수정하기 어렵고 경계에서 일괄 인증하려면 AP4.
|
||||||
|
|
||||||
|
Google federation은 다섯 번째 인증 패턴이 아니다. 네 패턴 모두 최종적으로
|
||||||
|
Keycloak token/session을 소비하며, Google은 Keycloak 앞의 upstream IdP
|
||||||
|
hop으로 추가된다.
|
||||||
|
|
||||||
|
## 이 repository의 실행 증거
|
||||||
|
|
||||||
|
- AP1: PKCE SPA, issuer/audience, token storage, refresh/logout 검증
|
||||||
|
- AP2: confidential client와 one-time access handoff 검증
|
||||||
|
- AP3: `oauth2Login` session과 CSRF/SameSite 검증
|
||||||
|
- AP4: oauth2-proxy, nginx `auth_request`, spoofed header 제거 검증
|
||||||
|
- 공통: local mock Google brokering, First Broker Login, claim/role mapping 검증
|
||||||
|
|
||||||
|
각 근거 브랜치와 병합 여부는 `keycloak-branch-manifest.tsv` 및
|
||||||
|
`audit-keycloak-branches.sh`로 추적한다.
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# Public HTTPS domain for broker callbacks
|
||||||
|
|
||||||
|
Google brokering을 반복 테스트할 때는 Cloudflare **named tunnel + 관리
|
||||||
|
도메인**을 기본 profile로 사용한다. `trycloudflare.com` quick tunnel과
|
||||||
|
임의 ngrok URL은 일회성 데모용이며 고정 callback으로 간주하지 않는다.
|
||||||
|
|
||||||
|
설정 순서:
|
||||||
|
|
||||||
|
1. `cloudflared tunnel login`
|
||||||
|
2. `cloudflared tunnel create keycloak-patterns`
|
||||||
|
3. 예제 config의 tunnel UUID와 credentials path를 실제 값으로 교체
|
||||||
|
4. `cloudflared tunnel route dns keycloak-patterns auth.example.test`
|
||||||
|
5. `cloudflared tunnel run keycloak-patterns`
|
||||||
|
6. Keycloak `KC_HOSTNAME`과 Google redirect URI를 같은 public host로 설정
|
||||||
|
|
||||||
|
컨테이너 안의 `127.0.0.1`은 cloudflared 컨테이너 자신이므로 origin에는
|
||||||
|
`reverse-proxy:8080` 같은 Compose service DNS를 사용한다. 마지막 catch-all
|
||||||
|
ingress는 알 수 없는 hostname을 404로 끝낸다.
|
||||||
|
|
||||||
|
실 tunnel 생성과 DNS 변경에는 사용자 소유 계정·도메인이 필요하므로 자동
|
||||||
|
검증은 ingress 파일의 구조까지만 수행한다.
|
||||||
Executable
+15
@@ -0,0 +1,15 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
config=deploy/tunnel/cloudflared-config.yml
|
||||||
|
grep -q '^tunnel: [0-9a-f-]*$' "$config"
|
||||||
|
grep -q '^ - hostname: auth.example.test$' "$config"
|
||||||
|
grep -q '^ service: http://reverse-proxy:8080$' "$config"
|
||||||
|
grep -q '^ - service: http_status:404$' "$config"
|
||||||
|
|
||||||
|
docker run --rm \
|
||||||
|
-v "$PWD/$config:/etc/cloudflared/config.yml:ro" \
|
||||||
|
cloudflare/cloudflared:2025.6.1 \
|
||||||
|
tunnel --config /etc/cloudflared/config.yml ingress validate
|
||||||
|
|
||||||
|
echo "Cloudflare named-tunnel ingress configuration verified"
|
||||||
Reference in New Issue
Block a user