CPN 한국어 자습서 · Claude Certified Developer — Foundations Prep
3-6 · 엔터프라이즈 연동
Connecting Claude to enterprise systems and authenticating it securely
사내 서비스에 Claude를 연결하는 프로토타입은 한 가지만 확인하면 됩니다 — 연결이 되는가. 하지만 규제 환경의 실서비스(프로덕션)로 넘어가면, 프로토타입이 그냥 지나치던 질문들이 하나씩 요건으로 바뀝니다. 이 레슨에서는 서비스 유형별 인증 방식부터, 시크릿을 안전하게 관리하는 세 가지 방법, 규제 산업이 더 요구하는 것까지 차례로 살펴봅니다.
이 장에서 배우는 것What you'll learn
약 24분프로토타입과 실서비스 연동의 차이 — 무엇이 요건으로 바뀌는지
서비스 유형별 인증 방식 — OAuth · 환경 변수의 API 키 · 파일 시스템 권한
시크릿 관리 세 가지 — 분리 · 저장 위치 · 교체
규제 산업이 더 요구하는 것 — 관리 설정 · 감사 훅 · 데이터 레지던시
레거시 현대화에 모듈 전체를 적용하는 법
인증·연동 체크리스트와 비용·복잡성·위험
사내 서비스에 Claude를 연결하는 프로토타입은 한 가지만 답하면 됩니다 — 연결이 되는가. 실서비스로 올라가는 엔터프라이즈 연동은 여기에 몇 가지 질문을 더 답해 둘 필요가 있습니다.
모델이 누구의 신원으로 동작하고 있고, 그 신원을 나중에 확인(감사)할 수 있는가? 모델이 어떤 데이터에 접근할 수 있고, 그 데이터가 조직 밖으로 나가는 지점은 어디인가? 개별 개발자가 인증 설정을 바꾸지 못하도록 관리자가 설정을 잠글 수 있는가? 그리고 접근을 규제 감사에 쓸 수 있는 형태로 기록할 수 있는가?
이 질문들은 엔터프라이즈 소프트웨어에서 새로운 것이 아닙니다. 규제 데이터를 다루는 외부 시스템이라면 어디에나 적용되는 신원·접근·규정 준수 요건과 같습니다. 이것을 연동 설계의 일부로 처음부터 다루는 것이, 데모와 배포 가능한 결과물을 가르는 지점입니다.
프로토타입은 '연결이 되나?' 하나만 통과하면 됩니다. 실서비스는 여기에 누구로 동작하나 · 데이터가 어디로 가나 · 관리자가 잠글 수 있나 · 기록이 남나 네 가지를 더 통과해야 합니다.
어떤 인증 방식이 맞는지는 그 서비스가 어디서 실행되고 어떤 신원 모델을 쓰는지에 따라 달라집니다. 크게 세 가지 경우로 나눠 볼 수 있습니다.
401 Unauthorized를 돌려주어 인증이 필요하다고 알리면, 클라이언트가 브라우저 로그인 흐름을 시작합니다. 사용자가 접근을 승인하면 토큰이 발급되어 저장되고, 사람이 손으로 시크릿을 복사하는 과정이 없습니다. 클라우드 서비스·SaaS 도구처럼 사용자의 신원이 권한 판단의 일부인 연동에 맞습니다. 이 모듈 앞부분의 Linear MCP 서버가 이 방식이고, GitHub 서버는 개인 액세스 토큰을 헤더로 전달합니다.stdio(표준 입출력) 전송을 씁니다. 보안 경계는 파일 시스템 권한 모델이고, 설정 파일의 거부 규칙이 통제 계층 역할을 합니다.인증 방식을 고르면 연결은 만들어집니다. 그런데 그 연결을 안전하게 유지하는 것은 별개의 문제입니다. 앞에서 이야기한 MCP 키 유출은 인증 방식을 잘못 골라서가 아니라, 자격 증명이 있으면 안 되는 자리에 놓여 한 번 퍼진 뒤로는 되돌릴 수 없었기 때문에 생긴 일입니다. 이런 일을 막는 방법은 세 가지이고, 각각 자격 증명이 노출되는 서로 다른 경로에 대응합니다.
분리(separation) — 자격 증명은 그것을 참조하는 설정과 같은 곳에 두지 않습니다. 설정 파일에는 변수 이름표만 두고, 실제 값은 파일이 닿지 않는 곳에 둡니다. 유출 사고가 어긴 규칙이 바로 이것입니다. 이유는 기계적입니다. 설정 파일은 커밋되고, 공유되고, 복제됩니다. 값을 파일 안에 직접 적어 두면 그 복사본마다 값이 함께 따라가고, 한 번 커밋된 값은 나중에 덮어써도 저장소 기록에서 사라지지 않습니다. 값을 파일 밖에 두면, 그 파일은 공유해도 안전합니다.
설정 파일은 여러 곳으로 복사되고 커밋되는 물건입니다. 그 안에 값을 직접 적어 두면 복사본마다 값이 함께 따라갑니다. 그래서 파일에는 '이 변수를 봐라'라는 이름표만 두고, 실제 값은 파일 밖에 둡니다.
값을 어디에 두는가 — 값이 파일 밖으로 나온 다음의 문제입니다. 한 대의 컴퓨터나 한 번의 파이프라인 실행에서만 쓰는 값이라면, 실행 시점에 주입하는 환경 변수로 충분합니다. CI 러너가 값을 시크릿으로 설정하고, 설정 파일은 이름으로 그 값을 읽고, 디스크에는 아무것도 적히지 않습니다. 여러 서비스나 사람이 함께 쓰는 값이라면 시크릿 저장소가 낫습니다. 시크릿 저장소는 자격 증명을 모아 두고, 권한 있는 호출자에게 실행 시점에 돌려주며, 누가 무엇을 읽었는지 기록하는 관리형 서비스입니다. 값을 한곳에 모아 두므로 한 번의 교체로 모든 사용처가 함께 갱신되고, 서비스마다 자기 파일에 자격 증명을 따로 두면서 쌓이던 복사본도 사라집니다. 값이 로컬에 있고 수명이 짧으면 환경 변수를, 여러 곳이 함께 쓰거나 감사가 필요하면 시크릿 저장소를 고르면 됩니다.
교체(rotation) — 자격 증명을 주기적으로, 그리고 노출이 의심되면 즉시 새 값으로 바꾸는 일입니다. 유출된 키에 맞는 대응은 교체뿐입니다. 한 번 노출된 키는 다시 비밀로 되돌릴 수 없으니, 새로 발급하는 수밖에 없습니다. 자격 증명을 코드에 직접 적어 넣는 방식이 비싼 이유가 여기 있습니다. 커밋된 코드 안의 값은 깨끗하게 교체하기 어렵습니다. 옛 값이 기록에 남고, 그 값에 맞춰 적어 둔 사용처는 값이 바뀌는 순간 전부 깨집니다. 반면 시크릿 저장소나 환경 변수에서 읽는 자격 증명은 그것을 쓰는 코드를 건드리지 않고도 교체됩니다. 코드는 값을 이름으로 참조하고, 뒤에 있는 값이 바뀌어도 이름은 그대로이기 때문입니다.
교체를 더 수월하게 만드는 두 가지 습관이 있습니다.
정리하면, 앞선 유출 사고가 드러낸 실수는 커밋되는 파일에 자격 증명을 직접 적어 넣은 것이었습니다. 분리는 값을 파일 밖으로 빼내고, 시크릿 저장소나 환경 변수는 파일이 공유하지 않는 자리를 값에 내어 주며, 교체는 앞의 두 가지가 지켜질 때에만 복구 수단이 됩니다.
금융이나 의료처럼 규제를 받는 고객은 '인증이 되는가' 하나만 묻지 않습니다. 데이터가 어디서 처리되는지, 접근이 어떻게 기록되는지, 그리고 감사 기간에 개발자가 인증 설정을 바꾸지 못하도록 관리자가 설정을 잠글 수 있는지를 함께 묻습니다. 이 모듈이 앞에서 다룬 도구들이 세 물음에 각각 답을 줍니다.
PostToolUse 훅은 규제 검토가 요구하는 기록을 제공합니다. 이 훅은 모델의 판단과 무관하게 호출마다 실행되고, 모델이 건너뛸 수 있는 기록이 아닙니다.앞 섹션에서 다룬 인프라 요건과 플랫폼 선택이 빌드할 때만이 아니라 감사할 때 중요해지는 이유가 여기 있습니다.
레거시 코드 현대화는 이 모듈이 다룬 도구 전체를 시험해 보기에 좋은 사례입니다. 각 도구가 관리하도록 설계된 위험이 한곳에 모여 있기 때문입니다. 익숙하지 않은 레거시 코드베이스를 크게 바꾸는 일에는 넓은 파급 범위, 예측하기 어려운 의존 관계, 제한적인 되돌리기라는 위험이 따릅니다. 이 위험들은 작업을 시작하기 전에 모듈의 도구를 적용해 두면 하나씩 줄여 갈 수 있습니다.
핵심 작업 흐름은 탐색·계획·구현 루프(explore, plan, code)입니다. 플랜 모드는 에이전트를 읽기 전용 탐색 단계에 붙들어 두어, 변경 내용에 확신이 설 때까지 기다리게 합니다. 제안된 수정을 미리 검토하고, 예상하지 못한 경로를 건드리는 부분을 찾아내고, 파일이 하나라도 바뀌기 전에 되짚어 볼 수 있습니다. 훅은 가장 민감한 단계에서 특정 경로의 수정을 막는 가드레일을 강제합니다. CLAUDE.md에는 새로 적용할 목표 패턴의 규칙을 적어 두어, 에이전트가 주변 코드의 레거시 패턴으로 되돌아가지 않고 전체 범위에 일관되게 적용하게 합니다.
위험이 높은 작업이라면, 세션을 시작하기 전에 세 가지 물음을 미리 정리해 두는 것이 좋습니다.
PostToolUse 훅이 있는가, 그 기록이 검토자가 확인해야 할 것을 만족시키는가?이 물음들은 현대화 작업에만 해당하는 것이 아닙니다. 위험이 높은 에이전트 작업이라면 어디에나 적용됩니다. 다만 현대화는 범위가 넓고, 코드베이스가 낯설고, 틀렸을 때의 비용이 크기 때문에 이 물음들이 더 또렷하게 드러납니다.
아래 표는 서비스 유형별로 정해야 할 핵심 결정을 한눈에 모은 것입니다. 인증 방식·시크릿 위치·남기는 기록·설정 잠금 권한, 이 네 가지가 유형마다 어떻게 달라지는지 비교해 보세요.
SERVICE TYPE → KEY DECISIONS — 유형별 핵심 결정
| 서비스 유형 | 인증 방식 | 시크릿 위치 | 남기는 기록 | 설정 잠금 |
|---|---|---|---|---|
| 사용자 신원 기반 원격 SaaS·클라우드 | OAuth | OAuth 제공자가 발급한 토큰을 클라이언트가 저장 | PostToolUse 훅으로 감사 로그에 기록 | 엔터프라이즈 관리 설정의 관리자 |
| 서비스 계정 기반 원격 내부 API | 환경 변수의 API 키 | 환경에만. 커밋된 설정에는 두지 않음 | PostToolUse 훅으로 감사 로그에 기록 | 엔터프라이즈 관리 설정의 관리자 |
| 로컬 파일 시스템·로컬 데이터베이스 | 파일 시스템 권한 | 자격 증명 불필요. 거부 규칙이 경로 접근 통제 | PostToolUse 훅으로 감사 로그에 기록 | 엔터프라이즈 관리 설정의 거부 규칙 |
COST · COMPLEXITY · RISK — 세 가지 관점
PostToolUse 훅으로 감사 로그를 남기면 도구 호출마다 약간의 부담이 더해집니다.WHEN IT FITS — 이 체크리스트가 필요한 때
| 잘 맞는 경우 | 규제 고객이 신경 쓰는 데이터를 다루면서, 이미 엔터프라이즈 관리 설정과 감사 훅을 지원하는 도구를 쓰는 연동입니다. 보안 요건을 앞에서 미리 정리해 두면 부담이 크지 않고, 마지막 검토에서 연동이 멈추는 일을 막아 줍니다. |
|---|---|
| 비용·복잡성이 느는 경우 | OAuth 흐름이나 엔터프라이즈 시크릿 관리에 익숙하지 않은 팀입니다. 규제 조직 대부분에서 이 패턴들은 보안·IT 팀과의 협업이 필요하고, 일정에 그 시간을 넣어 두는 것이 좋습니다. |
| 다른 방식이 나은 경우 | 프로덕션 데이터를 절대 만나지 않는 프로토타입이나 개념 증명입니다. 데모용 연동에는 전체 체크리스트까지 필요하지 않지만, 시크릿을 환경 변수에 두는 습관만큼은 비용이 들지 않으니 그대로 지키는 편이 좋습니다. |
스테이징에서는 OAuth 연결이 처음부터 끝까지 잘 됐습니다. 그래서 프로덕션으로 옮기는 일도 늘 하던 이전 작업처럼 느껴졌습니다. 팀이 놓친 것은 OAuth 리다이렉트 URIOAuth 로그인을 마친 뒤 사용자를 되돌려 보낼 주소. OAuth 제공자는 미리 등록해 둔 것만 허용한다.가 호스트별로 등록되고 환경마다 따로 통제되는 경우가 많다는 점입니다. 스테이징에서 성공했다고 해서, 프로덕션 호스트가 로그인 흐름을 완료할 권한을 얻은 것은 아니었습니다.
아래는 프로덕션에서 MCP 연동이 실패한 뒤 열린 배포 후 점검 자리에서 오간 대화입니다. 이 연동은 스테이징 테스트를 모두 통과한 상태였습니다.
"MCP 연결로 들어오는 프로덕션 로그인 시도가 전부 실패하고 있어요. 오류는 리다이렉트 URI 불일치입니다. OAuth 앱은 어디에 등록했나요?"
"개발할 때 staging.mycompany.com으로 등록했어요. 지난주에 프로덕션으로 옮겼고요. 스테이징에서는 처음부터 끝까지 잘 됐습니다."
"그 부분이 문제예요. OAuth 제공자는 명시적으로 등록한 리다이렉트 URI만 받아들이는데, production.mycompany.com은 허용 목록에 없어요. 로그인 시도마다 이 검사에 걸려 URI 매칭에 실패하고, 다시 로그인 화면으로 돌아가는 겁니다."
"그럼 프로덕션 URI를 앱 등록에 추가하기만 하면 되나요?"
"네, 그 전에 스테이징 앱 등록을 프로덕션과 별도의 앱으로 나눠야 하는지도 확인해 보세요. 규제 고객 상당수는 보안 정책상 환경마다 OAuth 앱을 따로 등록하도록 요구합니다. 같은 앱 등록을 여러 환경에서 함께 쓰는 것은 제가 짚어 둘 두 번째 문제예요."
개발자는 스테이징에서 OAuth 흐름을 처음부터 끝까지 시험해 동작을 확인했으니, 프로덕션 실패는 코드 결함이 아니었습니다. 호스트마다·환경마다 따로 해 줘야 하는 설정 단계였는데, 프로덕션에서도 그 단계가 필요하다는 것을 몰랐던 것입니다.
아래 연결 로그를 읽고, 어떤 인증 실패가 일어났는지 짚어 본 다음, 세 가지 조치 중 알맞은 것을 골라 보세요. 정답을 먼저 떠올려 본 뒤 골라 보면 좋습니다. 맞히면 설명이 나옵니다.
CONNECTION TRACE — CI 러너의 MCP 연결 로그
[MCP Client] Connecting to https://data-api.internal/mcp … [MCP Client] GET /auth/token, 401 Unauthorized [MCP Client] Reading credential from: /home/jenkins/.config/mcp-credentials.json [MCP Client] Credential value: WAREHOUSE_TOKEN= sk-****[redacted] [MCP Client] Retrying with credential, 401 Unauthorized [MCP Client] Connection failed after 3 attempts
Q1이 로그가 보여 주는 인증 실패에 대한 가장 알맞은 조치는 무엇일까요?
로그에는 두 문제가 겹쳐 있습니다. 첫 시도와 재시도 모두 401이 나오는 것은 키 자체가 거부되고 있다는 것이라, 키를 바꾸기 전에는 연결이 인증되지 않습니다. 그리고 자격 증명이 정해진 경로의 파일에서 평문으로 읽히고 있는 것은 이 레슨이 경고한 시크릿 관리 결함입니다. 두 번째 조치는 둘 다 해결합니다 — 거부된 키를 교체해 연결이 인증되게 하고, 새 키를 파일 밖 실행 시점 환경 변수로 옮겨 다시는 평문으로 저장되지 않게 합니다. 키만 교체하면 401은 사라지지만, 같은 파일 같은 경로에 값을 다시 적어 두므로 다음 교체 때 같은 문제가 되돌아옵니다. OAuth는 사용자 신원 기반 원격 서비스에 맞는 방식이라, 서비스 계정으로 연결하는 이 경우와는 신원 모델이 다르고, 로그가 실제로 보여 주는 '거부된 키 + 안전하지 않은 저장'도 해결하지 못합니다.
이어서 본문 내용을 두 문항으로 더 점검합니다.
Q2사용자의 신원이 권한 판단의 일부인 클라우드·SaaS 서비스에 Claude를 연결할 때 맞는 인증 방식은?
OAuth는 사용자의 신원이 인가 모델의 일부일 때 쓰는 방식입니다. MCP 서버가 401로 인증이 필요함을 알리면 클라이언트가 브라우저 로그인을 시작하고, 승인 뒤 토큰이 발급·저장됩니다. 환경 변수의 API 키는 사람이 아니라 서비스 계정을 식별하는 원격 서비스에, 파일 시스템 권한은 네트워크 인증이 없는 로컬 서비스에 각각 맞습니다.
Q3규제 검토에서 "모든 도구 호출이 기록으로 남는가"라는 물음에 답해 주는, 모델이 건너뛸 수 없는 장치는?
PostToolUse 훅은 도구 호출이 일어날 때마다 정해진 대로 실행되어, 모델의 판단과 무관하게 호출과 인자를 감사 로그에 남깁니다. 모델이 건너뛸 수 있는 기록이 아니라는 점이 규제 검토에서 중요합니다. 데이터 레지던시는 "데이터가 어디서 처리되는가"라는 다른 물음에 답하고, 프롬프트에 적어 둔 지시는 모델이 지키지 않을 수 있어 감사 근거로는 약합니다.
모듈 3의 다음 레슨으로 이어집니다. 한국어판이 준비되는 대로 계속됩니다. → 다음 레슨으로
전 코스는 계속 무료입니다. 등록하면 이 코스의 남은 38개 레슨을 끝까지 읽을 수 있습니다.
이미 등록하셨다면 그때 쓰신 이메일을 넣어 주세요.