게이트웨이 회원인증·엔타이틀먼트·코드보호 (그림자 검증 완료)
개요
crowny-gateway에 crowny-auth(9401) 위임 기반 opt-in 회원인증 게이트를 추가했다. gateway.yaml 서비스별auth: member / auth: level:N 필드가 있는 서비스만 게이트를 타고,
없으면(기존 293개 전부) 종전과 완전히 동일하게 공개 통과한다. 전 과정을 그림자 포트(8098)에서만
검증했고 라이브 게이트웨이(8080/8443/9100/9152) 프로세스·gateway.yaml은 무변경.핵심 발견 (중요 — 다음 세션 주의)
한선게이트웨이/게이트웨이통합.한선은 파일 상단 주석에 "그림자 포트"라고 적혀 있지만,
실제로는 start.sh가 재시작 때마다 이 파일을 재컴파일해 /tmp/gwlive.toau로 배포하는
라이브 소스다 (KeepAlive로 크래시/재부팅 시 자동 재기동). 이 파일을 Edit하면 다음 재기동 때
검증 안 된 코드가 라이브 8080에 그대로 올라간다. 절대 직접 수정 금지 — 작업은 별도 파일명으로
같은 디렉토리(로컬 import 해석 때문에 한선게이트웨이/ 안이어야 함)에 사본을 만들어야 한다.무엇을 했는지
1. 인증게이트.한선 (코어 라이브러리)
경로:/Users/ef/crowny-gateway/게이트웨이Q/인증게이트.한선정책맵로드(경로)/정책조회(정책맵,도메인,경로)— gateway.yamlauth:필드 awk 추출(GW_WID 격리, 라이브 파일 읽기 전용)쿠키토큰추출(요청)— Authorization: Bearer 또는 Cookie: crowny_token=토큰검증(토큰)—curl -m 2→GET :9401/api/verify, 결과를/tmp/_gwauth_*리다이렉트 후 읽기, TTL 60초 파일 캐시(append-only, GW_WID 격리)사용기록공유(사용자명,서비스)—POST :9401/api/touch베스트에포트유료게이트검사(정책,크라우니달러,현재epoch)— 2026-09-30(epoch 1790768770) 이전엔 항상 통과인증결정(요청,정책맵,도메인,경로)— 0=allow/401/402/403인증응답생성(코드,도메인,경로)— 401→auth.crowny.org 리다이렉트, 402→pay.crowny.org, X-Crowny-Usage-Shared:1스푸핑헤더제거(요청텍스트)— 인바운드 X-Crowny-*/Authorization 헤더 드롭(백엔드 전달 전)
${...}는 문자열 보간으로 파싱된다
("${c:-0}" → 변수 c를 문자열변환해 삽입 시도 → 미정의 변수 컴파일 에러). 쉘 파라미터 확장을
리터럴로 넣으려면 \${c:-0}로 이스케이프해야 한다. (기존 가드레일에 미기재 — 추가 필요)2. 게이트웨이통합_인증테스트.한선 (배선 검증본)
경로:/Users/ef/crowny-gateway/한선게이트웨이/게이트웨이통합_인증테스트.한선
(라이브 게이트웨이통합.한선의 사본 + 배선. start.sh는 정확히 그 파일명만 재컴파일하므로 이 사본은 안전)_요청처리에정책맵파라미터 추가, ACME/Shield/리다이렉트 다음 (1.5) 단계로 인증 게이트 삽입정책조회결과가 ""(공개)면 즉시 통과 — 기존 293서비스 무영향- 보호 서비스는
인증결정()→ 0이 아니면인증응답생성()응답 후 반환, 백엔드 미도달 - 통과 시
스푸핑헤더제거()로 요청 정화 후 WS/프록시로 전달 _YAML(라우팅)과_인증YAML경로()(정책)에 각각GW_YAML/GW_AUTH_YAML환경변수 오버라이드 추가
3. 그림자 데모 (검증 후 정리 완료 — 잔존물 없음)
/tmp/gwauth-demo-full.yaml = 라이브 gateway.yaml 사본 + gwauth-demo-protected(auth: member)
+ gwauth-demo-public(공개) 2개 추가. 포트 8098에서 crownyc run 구동, 검증 후 kill + 전체 tmp 정리.검증 결과 (실측)
| 케이스 | 기대 | 결과 |
|---|---|---|
| (a) 보호 서비스, 토큰 없음 | 401 + auth.crowny.org 리다이렉트 | ✅ 401 Unauthorized + Location: https://auth.crowny.org/?RET=... |
| (b) 보호 서비스, 무효 토큰(쿠키) | 401 | ✅ 401 Unauthorized (실제 :9401/api/verify 호출→"유효하지 않은 토큰" 401 확인) |
| (c) 공개 서비스, 토큰 없음 | 200 | ✅ 200 OK (upstream 9401 프록시 통과) |
| (d) /api/verify 실호출 경로 | 확인 | ✅ /tmp/_gwauth_*.code=401, .json={"error":"유효하지 않은 토큰"} — 실 호출 확증 |
| 라이브 293서비스 그림자에서 정상 | 200 | ✅ crowny.org/docs.crowny.org/bank.crowny.org = 200, church.crowny.org = 503(사전부터 백엔드다운, 무관) |
관련 파일
/Users/ef/crowny-gateway/게이트웨이Q/인증게이트.한선(신규, 코어)/Users/ef/crowny-gateway/한선게이트웨이/게이트웨이통합_인증테스트.한선(신규, 배선 검증본)/Users/ef/crowny-gateway/게이트웨이Q/인증설계.md(정본 설계서, 기존)- 라이브
/Users/ef/crowny-gateway/한선게이트웨이/게이트웨이통합.한선— 무변경 확인(mtime 19:47 그대로, gwlive.toau보다 오래됨) - 라이브
/Users/ef/crowny-gateway/gateway.yaml— 무변경 확인(md5 64787db7..., auth: 필드 0건)
잔여 이슈 / 다음 단계
- 라이브 배선은 아직 안 함 — 이번 작업은 그림자 검증까지만(지시 범위). 실제 293서비스에 영향
게이트웨이통합_인증테스트.한선을 게이트웨이통합.한선으로 승격,
(b) 보호할 실제 서비스에 auth: 필드 추가(원하는 서비스만), (c) gw restart로 배포 — 사용자 승인 후 진행.
authLevelMin(서비스별 유료 임계값) 오버라이드는 현재 미구현 —유료게이트검사가 고정 임계값
${...}문자열 보간 함정을~/.claude/templates/한선씨-가드레일.md에 추가 반영 권장.- 유효 토큰을 이용한 "인증통과→200→사용기록공유" happy-path 실측은 crowny-auth에 테스트 계정이
크라우니코드: lookup MISS 2건(신규 로직) / learn 추가 2건(토큰검증, 인증결정).