본문 바로가기
C.W.K.
Stream
Lesson 02 of 04 · published

Keychain 이야기

~9 min · keychain, wrong-fix, war-story, identity-not-credential

Level 0Lone Machine
0 XP0/37 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"push 는 성공. CLI 는 실패. 같은 기계, 같은 user, 같은 초. 다른 건 문 하나뿐이었어."

상황

control-plane Mac 의 headless SSH session 이 repository 를 bootstrap 하고 있었어. git over SSH 는 완벽했어. remote 에 인증하고 불평 없이 push 했지. 눈에 보이는 척도로만 보면 이 session 은 GitHub 접근이 됐어.

벽

그다음 gh, GitHub CLI 가 같은 기계, 같은 session, 같은 user 로 실패했어. 왜? gh 는 자기 auth 토큰을 login Keychain 에 두는데, headless SSH session 은 SecuritySessionID 가 없어. 그 Keychain 을 열 login session 이 없는 거지. git 의 SSH key 는 SSH envelope 이 닿는 데 살았고, gh 의 토큰은 못 닿는 데 살았어. 기계 하나, user 하나, 다른 방 두 개에 든 credential 둘. 근데 이 문은 그중 하나만 열었어.

틀린 fix

반사는 gh auth login 이었어. 재인증하면 auth 실패는 당연히 고쳐지겠지. 안 고쳐져. 구조적으로 credential 을 못 쥐는 envelope 안에서 재인증하면 새로운 실패만 나와. gh auth login 을 백 번 돌려도, headless 문은 새 토큰이 내려앉을 Keychain 을 열 session 이 여전히 없어. 이 반복은 진전처럼 느껴지고 순전히 헛수고야.

맞는 fix

실제로 가진 capability 를 써. SSH transport 는 이미 인증하고 push 했으니 그걸 기대. 아니면 작업이 진짜 Keychain 토큰이 필요하면, login session 이 있는 interactive executor 로 돌려. operation 은 새 credential 이 필요했던 게 아니라, 이미 가진 credential 을 위한 맞는 envelope 이 필요했어. 기계가 누구인지는 그 credential 을 쥘 수 있는지까지 말해주지 않았고, 그 틈이 교훈 전부야.

기계에 닿는 건 걔 열쇠를 쥐는 게 아냐. credential 이 한 envelope 에서 실패하면, fix 는 다른 envelope 이지, 더 세게 두드린 같은 닫힌 문이 아냐.

Code

같은 session, credential 둘, 결과 둘·bash
# control-plane Mac 의 headless SSH session. 같은 user, 같은 초.

git push origin main       # OK   -- SSH key auth. 이 envelope 에서 닿음
gh pr create ...           # FAIL -- 토큰이 login Keychain 에 있는데, headless
                           #         SSH session 은 그걸 열 login session
                           #         (SecuritySessionID)이 없음

# 틀린 fix -- key 를 못 쥐는 문에서 재인증:
gh auth login              # '성공' 하고, 같은 방식으로 또 실패. 영원히.

# 맞는 fix -- 되는 envelope 이나 Keychain 접근 있는 걸 써:
#   * 이미 인증한 SSH transport 를 기대거나, OR
#   * login session 있는 INTERACTIVE executor 로 gh 돌리기.
# credential 은 없던 게 아니라, envelope 이 못 닿았을 뿐이야.

External links

Exercise

'인증' 에러랑 싸웠는데 알고 보니 credential 이 아니라 context 문제였던 때를 떠올려봐. env 를 못 본 cron job, secret 빠진 CI runner, keychain/agent 에 못 닿은 SSH session 같은 거. 처음 시도한 틀린 fix 랑, 실제로 통한 envelope 레벨 fix 를 적어.
Hint
틀린 fix 는 거의 항상 'credential 을 다시 하기' 야. 진짜 fix 는 거의 항상 '이미 credential 을 가진 문에서 돌리거나, 문에 credential 을 명시적으로 건네기' 고. 문을 먼저 짚었으면 그 먼 길을 안 돌았을 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.