~11 min · secrets, credentials, blast-radius, security
Level 0불 꺼진 작업장
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
인증을 할 수 없는 도구
작업장은 실행할 때마다 돈 내는 외부 공급자를 불러. 내레이션용 음성 합성, 가끔 아트 카드용 이미지 생성. 둘 다 자격증명이 필요해. 작업장은 둘 다 안 들고 있어. 어떤 외부 서비스한테도 인증할 수 없고, 인증할 수 있게 만드는 설정 자체가 없어.
대신 공급자 호출은 전부 그 공급자랑의 관계를 소유한 형제를 거쳐 가. 작업장은 형제한테 로컬 호출을 하고, 형제가 키를 들고 진짜 호출을 해. 작업장 쪽에서 보면 음성 합성은 옆집 함수를 부르는 거랑 똑같이 생겼고, 비밀은 이 프로세스에 아예 안 들어와.
0 이 사주는 것
뻔한 이득은 폭발 반경이야. 비밀이 없는 저장소는 흘릴 게 없어. 커밋 이력을 험하게 다뤄도 안전하고, 이걸 돌리는 머신이 자격증명 창고가 되지 않고, 실수로 뜬 로그 덤프가 사고가 아니라 그냥 지루한 텍스트야.
덜 뻔한 이득은 교체야. 공급자 키가 바뀌면 — 만료됐든, 다른 데서 샜든, 계정이 옮겨갔든 — 정확히 한 군데만 고치면 돼. 도구 네 개가 각각 사본을 들고 있는 버전이랑 비교해봐. 교체가 저장소 네 개를 동시에 손대는 일이 되고, 그러니 미뤄지고, 그러니 키가 있어야 할 기간보다 오래 살고, 그러니 교체 정책이 슬그머니 소설이 돼. 자격증명을 한군데 모으는 게, 교체를 실제로 할 만큼 싸게 만드는 장치야.
세 번째 이득은 사고가 터졌을 때만 드러나. 누가 "이 부품이 키를 흘렸을 가능성이 있나?"라고 물으면, 키를 한 번도 안 들어본 저장소는 한마디로 답해. 나머지는 전부 조사가 필요하고. 설정을 읽고, 프로세스 환경을 뒤지고, 실수로 찍힌 게 없나 로그를 훑어야 해. 부품 하나를 조사 대상에서 즉시 지울 수 있다는 건 필요한 그 순간에 값어치가 놀랄 만큼 커. 그리고 그건 미리 설계해둬야만 가질 수 있는 성질이야.
비용, 정직하게
공짜가 아냐. 이제 작업장은 형제가 닿지 않으면 못 돌아. 로컬 개발 환경에도 그 형제가 떠 있어야 하고, 형제 쪽 장애가 작업장 장애처럼 보여. 흩어진 비밀 문제를 로컬 가용성 의존으로 바꿔치기한 거야.
여기선 이 교환이 맞아. 그 형제는 다른 이유로도 이미 강한 의존이고, 둘이 같은 머신에서 도니까. 홀로 돌아야 하는 도구라면, 남의 노트북에서 돌아야 한다면, 네 인프라에 접근 못 하는 빌드 에이전트 안이라면 틀린 선택이야. 가져갈 원칙은 "키를 들지 마라"가 아냐. 자격증명은 정확히 한 계층에 살아야 하고, 그게 어느 계층인지 찾아보지 않고 말할 수 있어야 한다는 거야.
Code
키 없는 도구에서 공급자 호출이 생긴 모양·python
def synthesize(text: str, voice: str, out: Path) -> Path:
"""No key, no provider SDK, no auth header - a local call.
The sibling owns: the credential, the voice registry, text
normalization, and the cache. This function owns: asking.
"""
resp = httpx.post(
f"{SIBLING_BASE}/api/tts", # localhost, not a provider
json={"text": text, "voice": voice},
timeout=180,
)
resp.raise_for_status()
out.write_bytes(resp.content)
return out
# There is deliberately no os.environ["..."] anywhere in this repo
# for a provider credential. Not "loaded carefully" - absent.
키가 어디 사느냐로 정해지는 교체 비용·text
keys copied into every tool key held by one owner
-------------------------- ---------------------
rotate = N coordinated changes rotate = 1 change
leak surface = N repos leak surface = 1 repo
N histories to audit 1 history to audit
"who has this key?" = a survey "who has this key?" = a name
# The failure is not that N is insecure in principle.
# It is that rotation gets expensive, so it stops happening,
# and a policy nobody executes is not a policy.
네가 만지는 시스템에서 외부 공급자 자격증명 하나를 골라, 그 사본이 존재하는 자리를 전부 추적해봐. 저장소, 환경 파일, 배포 설정, 개발자 머신, 빌드 에이전트까지. 개수를 적어. 그다음 오늘 교체하면 동시 변경이 몇 건일지 어림해보고, 정확히 한 부품만 들고 나머지는 그 부품을 부르는 버전을 설계해봐.
Hint
개발자 노트북이랑 CI 설정을 세어봐. 사본이 숨는 자리가 거기야. 교체하려고 누구한테 '로컬 파일 좀 고쳐줘'라고 연락해야 하면, 배포 문서가 뭐라고 하든 그 자격증명은 한군데 모여 있는 게 아냐.
Progress
Progress is local-only — sign in to sync across devices.