← 목록
기타 2026-07-07 7KB 읽기 7분

게이트웨이 회원인증·엔타이틀먼트·코드보호 (그림자 검증 완료)

개요

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.yaml auth: 필드 awk 추출(GW_WID 격리, 라이브 파일 읽기 전용)
  • 쿠키토큰추출(요청) — Authorization: Bearer 또는 Cookie: crowny_token=
  • 토큰검증(토큰)curl -m 2GET :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 헤더 드롭(백엔드 전달 전)
VM 함정 신규 발견: hanseonc_high 문자열 리터럴 안의 ${...}문자열 보간으로 파싱된다 ("${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 환경변수 오버라이드 추가
(그림자 검증은 라이브 gateway.yaml + 데모서비스 2건 병합본을 가리키게 함, 라이브 무변경)

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) 보호 서비스, 무효 토큰(쿠키)401401 Unauthorized (실제 :9401/api/verify 호출→"유효하지 않은 토큰" 401 확인)
(c) 공개 서비스, 토큰 없음200200 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(사전부터 백엔드다운, 무관)
crowny-auth 데이터 무변경: 전 과정 GET(/api/verify)·POST(/api/touch)만 사용, 회원가입/로그인 등 쓰기 API 미호출 — 유효 토큰을 만들 수 없어 "인증 통과 후 200" happy-path는 이번 검증 범위 밖(설계상 제약).

관련 파일

  • /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건)

잔여 이슈 / 다음 단계

  1. 라이브 배선은 아직 안 함 — 이번 작업은 그림자 검증까지만(지시 범위). 실제 293서비스에 영향
없이 라이브 배포하려면 (a) 게이트웨이통합_인증테스트.한선게이트웨이통합.한선으로 승격, (b) 보호할 실제 서비스에 auth: 필드 추가(원하는 서비스만), (c) gw restart로 배포 — 사용자 승인 후 진행.
  1. authLevelMin(서비스별 유료 임계값) 오버라이드는 현재 미구현 — 유료게이트검사가 고정 임계값
100 사용(2026-09-30 이전이라 이번 검증에서는 도달 안 함). 실 배포 전 정책맵에 authLevelMin 컬럼 추가 필요.
  1. ${...} 문자열 보간 함정을 ~/.claude/templates/한선씨-가드레일.md에 추가 반영 권장.
  2. 유효 토큰을 이용한 "인증통과→200→사용기록공유" happy-path 실측은 crowny-auth에 테스트 계정이
생기면(다른 세션이 회원가입 플로우 검증할 때) 곁다리로 확인 가능.

크라우니코드: lookup MISS 2건(신규 로직) / learn 추가 2건(토큰검증, 인증결정).