콘텐츠로 이동

접근 권한 목록

인수 시점에 양도해야 할 모든 외부 시스템 자격증명과 그 위치 포인터의 통합 목록. 실제 시크릿 값(password, API key, private key 본체)은 본 페이지에 적지 않으며 — 어디에서 값을 얻을 수 있는지만 명시한다. 값 자체는 시크릿 관리 페이지 또는 외부 dashboard에서 직접 확인할 것.

⚠️ 인수 완료 = 시크릿 회전 완료. 본 페이지에 등록된 시크릿은 인수 직후 회전을 권장한다. Bootalk 측이 git history, 이전 작업 환경 등을 통해 노출되어 있을 수 있다.

1. AWS

semugpt 인프라(dev + prod 양쪽)는 단일 AWS 계정 023888247019(alias onbiztax)에 산다. profile alias는 ob 하나로 통일.

1.1 계정 / 프로파일

프로파일 (~/.aws/config) 계정 용도 인수 대상
ob 023888247019 semugpt 모든 인프라 (dev + prod) ✅ 표준 진입점
semugpt-frontend 023888247019 프론트엔드 배포 한정 IAM (S3 + CloudFront 권한만) ⚠️ 신규 plan에서 미사용 (legacy 배포용)
023888247019_AdministratorAccess 023888247019 SSO 수동 세션 토큰 — ob 만료 시 fallback 보조
bootalk-prod 296797354236 Bootalk(btalk) 회사의 prod — semugpt와 무관 ❌ 혼동 주의, 인수 대상 아님
btalk-rds 296797354236 같은 Bootalk 계정 RDS 전용 ❌ semugpt 아님
default / cdo.bootalk 개인 IAM 일반 작업 ❌ semugpt 인프라 접근 없음

핵심: 인수받을 팀은 ob 프로파일(SSO 기반, 1-12시간 토큰 만료 → aws sso login --profile ob)만 기억하면 된다. bootalk-prod는 이름이 헷갈리지만 다른 회사 계정이므로 작업 시 잘못 들어가지 않도록 주의.

1.2 Lightsail (백엔드 호스팅)

항목 값 / 위치
Dev instance semugpt-backend (ap-northeast-2a, medium_3_0 4GB, $24/mo)
Dev static IP 3.39.17.132
Prod instance semugpt-prod ⏳ (Issue #151 Phase 3 진행 중, large_3_0 8GB, $44/mo)
SSH alias ssh semugpt-aws (dev) / ssh semugpt-prod (prod, Phase 3 후)
SSH key 파일 ~/.ssh/aws-semugpt (개발자 Mac에만 존재 — git 미커밋)
Lightsail key pair name semugpt-aws (dev/prod 공용 — --key-pair-name semugpt-aws)
허용 SSH IP (dev) 49.175.194.2/32 (사무실 only)
허용 SSH IP (prod, 예정) 동일 (49.175.194.2/32)

⚠️ SSH private key는 git에 커밋되어 있지 않다. 인수 시 별도 안전 채널(1Password vault 또는 직접 전달)로 양도해야 한다. 또는 인수받을 팀이 자체 key pair 생성 후 Lightsail에 등록하는 것이 더 안전 (aws lightsail create-key-pair).

1.3 RDS (MySQL)

항목
Instance identifier tax-gpt
Endpoint tax-gpt.cl2zydns6yrm.ap-northeast-2.rds.amazonaws.com:3306
Engine MySQL 8.0.44, db.t3.micro, 20GB → autoscale 1000GB
Master user admin
Master password selim3400!! (secrets §2.7)
접근 정책 ⚠️ PubliclyAccessible=true + SG sg-09b20a06663fcfa010.0.0.0/0:3306 개방 (보안 우려)
Databases tax_gpt (legacy live), tax_gpt_v2 (미사용), tax-gpt-v3 (미사용), semugpt_2026 (new, 부분 migration 적용)

⚠️ RDS는 현재 인터넷에 노출되어 있다. Hard cutover 시점에 SG를 잠글 예정이지만 그 전까지는 본인 IP에서 직접 접속 가능 (편리하지만 위험). 인수 직후 master password 회전 + SG 잠금을 권장.

1.4 Route 53 (DNS — prod 도메인)

항목
Hosted zone semugpt.co.kr.
Zone ID Z0917222THSORQW5ECCW
DNSSEC NOT_SIGNING
관리 레코드 apex (semugpt.co.kr), www, api, pro (legacy) / new, api-new (soft launch, Phase 10 예정)

⚠️ bootalk.co.kr zone은 Cloudflare가 관리 (별도 — 1.5절 참조). 두 zone이 다른 DNS provider에 살고 있으므로 인수 시 양쪽 계정 모두 양도해야 한다.

1.5 ALB / ACM / CloudFront / S3 (legacy 정적 자산)

리소스 식별자 비고
ALB semu-gpt-alb (Internet-facing, 443 HTTPS) legacy + new 양쪽 공유
Target group (legacy) semu-gpt-instance EC2 i-07aea223b0818ab0a 등록
EC2 (legacy) i-07aea223b0818ab0a "tax-gpt" t2.medium, Public IP 3.39.210.101, SSH key tax-gpt (⚠️ 본인 미보유 — cutover에서는 SSH 불필요)
ACM (ap-northeast-2) ff97682a-fcbf-... *.semugpt.co.kr (apex 미포함), 만료 2026-08-13
ACM (us-east-1) (CloudFront용) semugpt.co.kr + *.semugpt.co.kr, 만료 2026-08-07
CloudFront × 2 apex EQH9FKLG1LISZ / www EMX0TAZMBZFP1 S3 origin, hard cutover 후 disable 예정
S3 buckets semugpt.co.kr, semugpt-hosting, semuchat.co.kr 2026-04-22 생성, 작업자 미확인 ⚠️

⚠️ ACM cert 만료 2026-08-07/13. 인수 시점에 따라 갱신 필요 — ACM은 자동 갱신이지만 만료 알람 미설정. 인수 후 CloudWatch alarm 추가 권장 (known-issues I6).

1.6 ECR (Container Registry)

항목
Registry 023888247019.dkr.ecr.ap-northeast-2.amazonaws.com
Repository semugpt-backend
상태 ⚠️ 신규 plan에서 미사용 — Docker image push 없이 systemd로 직접 운영. 작업자 미확인.

2. GitHub

항목
Organization uitiorg
Repo uitiorg/semugpt-2026 (private)
Default branch develop
Main branch main (PR용)
Branch protection ⚠️ (인수 시점 확정 필요 — 현재 설정 미문서화)
GitHub Actions deploy-frontend-dev.yml (push to develop → Cloudflare Workers dev 배포)
Actions secrets CLOUDFLARE_API_TOKEN 등 ⚠️ (전체 목록은 Settings → Secrets → Actions에서 확인)
Cloudflare Pages 연동 wiki 빌드 (별도 — 3.1절)

인수 시 변경 항목

  • Bootalk org membership에서 uitiorg org 권한 회수 (인수받을 팀이 owner로 승급)
  • GitHub Actions secrets 모두 회전 (CLOUDFLARE_API_TOKEN 등 — 새 Cloudflare 계정으로 전환 시)
  • PR review approver 변경
  • CODEOWNERS 파일 갱신 (있다면)

3. Cloudflare

3.1 DNS (bootalk.co.kr zone — dev 도메인)

항목
Zone bootalk.co.kr (Cloudflare 관리)
관리 레코드 semu-gpt-dev, semu-chat-dev, wiki
양도 방식 Cloudflare 계정 자체를 양도 또는 zone transfer

⚠️ bootalk.co.krBootalk 회사 도메인이다. 세림세무법인이 인수 시 dev 도메인을 자체 도메인으로 이주하는 것이 권장됨 (예: semugpt-dev.taxemail.co.kr). 이주 절차:

  1. 새 zone에 동일 레코드 생성
  2. Cloudflare Tunnel cfargotunnel.com CNAME을 새 hostname으로 추가
  3. backend ENV NEXT_PUBLIC_API_URL 갱신
  4. frontend 재배포

3.2 Workers (frontend dev 배포)

항목
Worker name semugpt-frontend-dev (apps/frontend/wrangler.toml)
빌드 도구 @opennextjs/cloudflare
배포 방식 GH Action deploy-frontend-dev.yml (push to develop + paths apps/frontend/**)
Manual deploy cd apps/frontend && pnpm deploy:cf (requires CLOUDFLARE_API_TOKEN)
비용 $0 (free tier), 100k req/day 초과 시 $5/mo

3.3 Pages (wiki 빌드)

항목
프로젝트 이름 semugpt-2026 ⚠️ (검증 필요 — Cloudflare dashboard 확인)
빌드 명령 mkdocs build (Material theme)
게시 도메인 wiki.semugpt.co.kr ⚠️ (검증 필요)

3.4 Cloudflare Tunnel (dev backend)

항목
Tunnel name semugpt-backend
Tunnel ID 078d8083-eba8-4df2-8026-ebafcb53666b
Cert 위치 (Lightsail) /etc/cloudflared/cert.pem
Config 위치 (Lightsail) /etc/cloudflared/config.yml (ingress 정의)
Service cloudflared systemd (KeepAlive default)

⚠️ Tunnel cert는 Lightsail box에만 존재하며 git에 커밋되지 않는다. 인수 시 Cloudflare 계정 양도 또는 새 tunnel 생성 후 cert 교체 + systemctl reload cloudflared 필요.

⚠️ Cloudflare Tunnel은 zone-on-Cloudflare 필수 — prod 도메인 semugpt.co.kr은 Route 53이라 tunnel 사용 불가. prod는 ALB로 직접 받는다.

4. 외부 SaaS

4.1 OpenAI

항목
위치 (코드) application-prod.yml:47-48 (openai.token), application-local.yml:45-46 (secrets §2.3)
환경변수 override OPENAI_TOKEN
사용처 RAG 답변 생성 + HyDE + intent router + 임베딩 + keyword/category inference 등 LLM 호출 7-8곳
Dashboard https://platform.openai.com/

⚠️ local과 prod 동일 평문 키 커밋 — git history에 노출. 인수 직후 즉시 회전 필수.

4.2 Langfuse (프롬프트 관리 + LLM trace)

항목
위치 (local) application-local.yml:53-57 (평문 커밋)
위치 (prod) application-prod.yml:70-77 (env-var refs ${LANGFUSE_PUBLIC_KEY} / ${LANGFUSE_SECRET_KEY})
Dashboard https://cloud.langfuse.com
관리 대상 7개 LLM 프롬프트 (rag-final-answer, hyde-generator, intent-router, query-rewrite, keyword-extraction 등) — 프로젝트 루트 CLAUDE.md "Langfuse 프롬프트 모델 설정" 참조

4.3 Naver Cloud SENS (SMS 발송)

항목
위치 application-prod.yml:38-44, application-local.yml:36-42 (local/prod 동일 값, 평문 커밋)
키 이름 ncp.access-key, ncp.secret-key
Service ID ncp:sms:kr:315481964654:semu-gpt
Calling number 028302220
구현체 SensMessageSender (@Component 활성). SnsMessageSender//@Component 주석으로 비활성
Dashboard https://www.ncloud.com/ → IAM → access key

⚠️ AWS SNS 아님 — 이름이 비슷해 위키에서 과거 오인용된 사례 있음 (위키 기여자용 docs/wiki/CLAUDE.md Prior incidents 참조 — wiki 본문에는 비공개).

4.4 Toss Payments

환경 위치
Local (test) application-local.yml:78-83 test_gck_... / test_gsk_... / test_ck_... / test_sk_... (4종, 평문 커밋)
Production (live) application-prod.yml:61-66 ${TOSS_CLIENT_KEY} / ${TOSS_SECRET_KEY} / ${TOSS_BILLING_CLIENT_KEY} / ${TOSS_BILLING_SECRET_KEY} — env var refs만 정의
Live keys 자체 ⚠️ 미수령 클라이언트(세림세무법인 김창진/김진우)에게 제공 요청 중
Dashboard https://docs.tosspayments.com/ → 가맹점 > API 키
Webhook URL (prod, 예정) https://api-new.semugpt.co.kr/webhooks/tosspayments ⚠️ Toss console에서 등록 필요 (known-issues D6)

4.5 Sentry (frontend errors)

항목
패키지 @sentry/nextjs v10
Org bootalk
Project semugpt
설정 위치 apps/frontend/sentry.{server,edge,client}.config.ts (#162 4.5d)
Dashboard https://sentry.io/organizations/bootalk/

⚠️ Backend Sentry는 미설치 (known-issues I2). 인수 후 도입 권장.

4.6 (참고) OAuth providers

항목 위치
Naver application-oauth.yml:10 (client-secret 평문 커밋)
Kakao application-oauth.yml:13-19 (client-id만 존재, client-secret 없음 — Kakao OAuth는 client-secret 없이 동작 가능)
Google application-oauth.yml:23 (client-secret 평문 커밋)

⚠️ 현재 미사용 — 활성 라우트 없음 (auth 도메인 코드만 존재). 활성화 시 redirect URI를 prod URL로 갱신 + secret 회전 필요.

5. 운영 box 접속

5.1 Lightsail SSH

항목
SSH alias ssh semugpt-aws (dev) / ssh semugpt-prod (prod, Phase 3 후)
Key 파일 ~/.ssh/aws-semugpt (개발자 Mac에만)
허용 IP 49.175.194.2/32 (사무실 only)

5.2 사무실 외 IP에서 접속 (임시)

MY_IP=$(curl -s ifconfig.me)

# 사무실 룰 + 본인 임시 IP 동시 허용
aws --profile ob lightsail put-instance-public-ports --instance-name semugpt-backend \
  --port-infos "fromPort=22,toPort=22,protocol=tcp,cidrs=49.175.194.2/32,${MY_IP}/32"

# 작업 끝나면 사무실만 남기기
aws --profile ob lightsail put-instance-public-ports --instance-name semugpt-backend \
  --port-infos "fromPort=22,toPort=22,protocol=tcp,cidrs=49.175.194.2/32"

⚠️ 인수받을 팀의 사무실 IP로 교체 필요 — 49.175.194.2/32는 Bootalk 사무실 IP다.

5.3 Lightsail-on-box 자산

위치 내용 양도 방식
/etc/semugpt/slack-webhook.url Slack incoming webhook URL (mode 0600, root-only) Slack workspace 자체 양도 또는 새 webhook 발급
/etc/semugpt/slack-mention.txt 알림 prefix mention (현재 <!here> @주우철) 새 담당자 Slack user ID로 교체
/etc/cloudflared/cert.pem Cloudflare Tunnel cert Cloudflare 계정 양도 또는 새 tunnel 발급
/etc/semugpt/backend.env (예정, prod) systemd EnvironmentFile — 실제 시크릿 주입 (mode 0600) 인수 시 새 시크릿으로 갱신
/etc/semugpt/frontend.env (예정, prod) frontend systemd EnvironmentFile 동일

6. 양도 시 회전 권장 시크릿 (체크리스트)

Git history에 평문 노출된 항목 + Lightsail box에 보관된 시크릿은 인수 직후 회전 권장. 상세 절차는 시크릿 관리 페이지 §3 회전 우선순위 참조.

Priority P0 (즉시 회전)

  • JWT secret (application-prod.yml:52JWT_SECRET env var) — 도용 시 임의 사용자 위장. 회전 시 전 사용자 로그아웃됨.
  • OpenAI token (OPENAI_TOKEN) — 도용 시 비용 발생 + RAG 중단. 데이터 파이프라인(packages/data-pipeline)도 같이 갱신.
  • RDS master password (SPRING_DATASOURCE_PASSWORD) — 전 사용자 데이터 위험. legacy + new backend 동시 갱신 필요.

Priority P1 (1주 내 회전)

  • Naver Cloud SENS access/secret key (ncp.access-key, ncp.secret-key) — 도용 시 임의 SMS 발송.
  • AWS IAM access key (AKIAQLD6ZXDVRTY2FHERapplication-prod.ymlspring.cloud.aws.credentials) — 도용 시 AWS 리소스 접근.
  • Langfuse public/secret key (LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEY) — 도용 시 프롬프트 변조.
  • GitHub Actions secrets (CLOUDFLARE_API_TOKEN 등) — Cloudflare 계정 양도 시.

Priority P2 (인수 후 적정 시점)

  • Elasticsearch password (uiti0701! — dev/prod 동일) — 외부 노출은 없으나 분리 권장.
  • Toss live keys (TOSS_*_KEY 4종) — Toss console에서 발급 후 /etc/semugpt/backend.env 주입.
  • Slack incoming webhook URL (/etc/semugpt/slack-webhook.url) — Slack workspace 양도 시.
  • Cloudflare Tunnel cert (/etc/cloudflared/cert.pem) — Cloudflare 계정 양도 시.
  • OAuth client secrets (Naver / Kakao / Google) — 활성화 시점에.
  • Local Lightsail SSH key pair — 인수받을 팀의 새 key pair로 교체.

Priority P3 (조건부)

  • EC2 (legacy) tax-gpt SSH key — hard cutover 후 EC2 terminate 시 무관해짐. 그 전까지는 Bootalk 측이 본인 보유 안 함 ⚠️.

7. 인수 시 영향 매트릭스

각 시크릿을 회전할 때 영향받는 시스템 / 사용자.

시크릿 영향받는 시스템 영향받는 사용자 downtime
JWT secret Backend 전 사용자 (로그아웃) 없음 (재로그인 필요)
OpenAI token Backend + Data pipeline RAG 사용자 (LLM 응답 중단) restart ~90s
RDS password Legacy backend + New backend 전 사용자 restart ~90s (동시 갱신 시 무중단 가능)
SENS keys Backend 회원가입/로그인 중인 사용자 restart ~90s
Langfuse keys Backend (RAG) 영향 없음 (fallback prompt로 silently 동작) restart ~90s
Toss live keys Backend + Frontend 결제 진행 중인 사용자 restart ~90s + frontend rebuild
Slack webhook Lightsail cron 운영자 (알림 누락) 즉시 (cron 다음 실행 시)
Cloudflare Tunnel cert Dev URL dev 사용자 (502 ~5분) systemctl reload cloudflared 수초

알려진 한계 / 개선 예정

  • Secret manager 부재: AWS Secrets Manager / SSM Parameter Store 미사용 — 작은 팀에 과한 인프라라 도입 보류 (secrets §5)
  • 인증서 만료 알림 부재: ACM cert 만료(2026-08-07/13) 임박 시 알림 없음 — CloudWatch alarm 도입 검토 (known-issues I6)
  • GitHub Actions secrets 전체 목록 미문서화: Settings → Secrets → Actions에서 인수 시점에 직접 확인 필요 ⚠️
  • Cloudflare Pages 프로젝트 이름 / wiki 도메인 검증 필요: dashboard에서 인수 시점에 확정 ⚠️
  • Bootalk 사무실 IP 하드코딩: 49.175.194.2/32가 firewall rule에 박혀 있음 — 인수 시 인수받을 팀 사무실 IP로 교체 필요

관련 문서

  • 시크릿 관리 — 시크릿 위치 / 회전 절차 상세
  • 인수 체크리스트 — 본 페이지의 항목을 Day-1 ✅로 따라가는 가이드
  • 연락처 — 인수 시 owner 변경 절차의 vendor별 연락처
  • 운영 배포 — pre-cutover 시점에 secret rotation이 어디 끼는지
  • 1차 출처: 레포 루트 CLAUDE.md의 "AWS Profiles" 섹션 + "Production Infrastructure" 섹션