SSH 키 관리와 ssh-add 이해하기
SSH 에이전트와 ssh-add를 통한 SSH 키 관리 방법
SSH 키 관리와 ssh-add 이해하기
문제 상황
ssh -T git@github.com을 실행하면 예상과 다른 계정이 표시된다.
1
2
$ ssh -T git@github.com
Hi work-account! You've successfully authenticated...
분명 SSH Config에는 두 개의 설정이 있는데, 왜 항상 work-account가 선택될까?
1
2
3
4
5
6
7
8
# ~/.ssh/config
Host github.com-personal
HostName github.com
IdentityFile ~/.ssh/id_rsa_github_personal
Host github.com-work
HostName github.com
IdentityFile ~/.ssh/id_rsa_github_work
이 문제를 이해하려면 SSH 에이전트와 ssh-add의 동작 방식을 알아야 한다.
SSH 에이전트란?
SSH 에이전트(SSH Agent)는 SSH 개인키를 메모리에 보관하는 백그라운드 프로그램이다.
주요 기능
- 비밀번호 재입력 방지: 한 번 키를 등록하면 매번 비밀번호를 입력할 필요 없음
- 키 재사용: 여러 SSH 연결에서 같은 키를 자동으로 사용
- 보안: 개인키를 메모리에만 보관하여 디스크 접근 최소화
SSH 에이전트 확인
1
2
3
4
5
# 실행 중인지 확인
pgrep -x ssh-agent
# 시작
eval "$(ssh-agent -s)"
ssh-add: 키 관리 명령어
ssh-add는 SSH 에이전트에 키를 등록하고 관리한다.
기본 명령어
1
2
3
4
5
6
7
8
# 등록된 키 목록 보기
ssh-add -l
# 특정 키 추가
ssh-add ~/.ssh/id_rsa_github_personal
# 모든 키 삭제
ssh-add -D
현재 등록된 키 확인
1
2
3
$ ssh-add -l
4096 SHA256:abc1... user@company.com (RSA) ← work 키
4096 SHA256:def2... user@personal.com (RSA) ← personal 키
중요: 키의 순서가 중요하다. SSH는 위에서부터 순서대로 시도한다.
SSH Config: 연결 설정
SSH는 ~/.ssh/config 파일로 연결 설정을 관리한다.
기본 구조
1
2
3
4
5
Host <별칭>
HostName <실제 호스트>
User <사용자>
IdentityFile <키 경로>
IdentitiesOnly yes
실제 설정 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ~/.ssh/config
# 개인 계정
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github_personal
IdentitiesOnly yes
# 회사 계정
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github_work
IdentitiesOnly yes
Host 매칭 규칙
SSH는 정확한 매칭만 인식한다.
1
2
3
4
5
6
7
# ❌ 매칭 안 됨
ssh -T git@github.com
# "github.com"은 설정에 없음
# ✅ 매칭 됨
ssh -T git@github.com-personal
# Host 이름과 정확히 일치
원인 분석
왜 git@github.com이 항상 work-account로 인증될까?
3단계 과정
- Host 매칭 실패
1 2
git@github.com ≠ github.com-personal git@github.com ≠ github.com-work
- 에이전트 키 순서대로 시도
1 2 3
$ ssh-add -l 첫 번째: work 키 ← 이것부터 시도 두 번째: personal 키
- 첫 번째 키로 인증 성공
- work 키를 GitHub에 제공
- GitHub가 “Hi work-account!” 응답
해결 방법
방법 1: Host 이름 명시 (권장)
가장 명확하고 안전한 방법이다.
1
2
3
4
5
6
7
8
9
# SSH 테스트
ssh -T git@github.com-personal
ssh -T git@github.com-work
# Git clone
git clone git@github.com-personal:username/repo.git
# 기존 저장소 변경
git remote set-url origin git@github.com-personal:username/repo.git
방법 2: 키 순서 변경
특정 키를 기본으로 사용하고 싶을 때.
1
2
3
4
5
6
7
8
9
# 모든 키 제거
ssh-add -D
# 원하는 순서로 추가
ssh-add ~/.ssh/id_rsa_github_personal # 첫 번째
ssh-add ~/.ssh/id_rsa_github_work # 두 번째
# 확인
ssh-add -l
방법 3: IdentitiesOnly 설정
지정된 키만 사용하도록 강제.
1
2
3
4
5
6
7
# ~/.ssh/config
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github_personal
IdentitiesOnly yes # 이 키만 사용
SSH 키 생성 스크립트
새 SSH 키를 생성하고 자동으로 에이전트에 등록하는 스크립트:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
# 설정
EMAIL="user@personal.com"
KEY_PATH="$HOME/.ssh/id_rsa_github_personal"
# 1. SSH 키 생성
ssh-keygen -t rsa -b 4096 -C "$EMAIL" -f "$KEY_PATH" -N ""
# 2. SSH 에이전트 시작 (없으면)
if ! pgrep -x ssh-agent > /dev/null; then
eval "$(ssh-agent -s)"
fi
# 3. 에이전트에 키 추가
ssh-add "$KEY_PATH"
echo "✓ SSH 키 생성 완료: $KEY_PATH"
옵션 설명
| 옵션 | 의미 |
|---|---|
-t rsa | RSA 알고리즘 |
-b 4096 | 4096비트 (보안 강화) |
-C "email" | 주석 (키 식별용) |
-f path | 저장 경로 |
-N "" | 비밀번호 없음 |
macOS Keychain 설정
재부팅 후에도 키를 자동으로 로드하려면:
1
2
3
# Keychain에 키 추가
ssh-add --apple-use-keychain ~/.ssh/id_rsa_github_personal
ssh-add --apple-use-keychain ~/.ssh/id_rsa_github_work
SSH Config 전체 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# ~/.ssh/config
# Global 설정
Host *
AddKeysToAgent yes
UseKeychain yes
ServerAliveInterval 60
# 개인 계정
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github_personal
IdentitiesOnly yes
# 회사 계정
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github_work
IdentitiesOnly yes
트러블슈팅
Permission denied (publickey)
1
2
3
4
5
6
7
8
# 1. 키가 등록되어 있는지 확인
ssh-add -l
# 2. 없으면 추가
ssh-add ~/.ssh/id_rsa_github_personal
# 3. 상세 로그로 테스트
ssh -vT git@github.com-personal
의도하지 않은 키로 인증됨
1
2
3
4
5
6
# 어떤 키가 제공되는지 확인
ssh -vT git@github.com 2>&1 | grep "Offering public key"
# IdentitiesOnly 추가
Host github.com-personal
IdentitiesOnly yes
SSH 에이전트에 키가 너무 많음
SSH는 최대 5개까지만 시도한다. 초과하면 인증 실패 가능.
1
2
3
4
# 초기화하고 필요한 키만 추가
ssh-add -D
ssh-add ~/.ssh/id_rsa_github_personal
ssh-add ~/.ssh/id_rsa_github_work
또는 각 Host에 IdentitiesOnly yes 추가.
핵심 정리
SSH 동작 순서
1
2
3
1. SSH Config에서 Host 매칭 찾기
├─ 매칭 성공 → IdentityFile의 키 사용
└─ 매칭 실패 → ssh-add -l의 키를 순서대로 시도
문제 해결 체크리스트
git remote -v로 현재 URL 확인- URL을
git@github.com-personal:user/repo.git형식으로 변경 - SSH Config에
IdentitiesOnly yes추가 ssh -T git@github.com-personal로 테스트
권장 설정
1
2
3
4
5
6
7
8
9
10
11
12
# 1. SSH Config에서 Host 명시
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_github_personal
IdentitiesOnly yes # 필수!
# 2. Git remote에 Host 이름 사용
git@github.com-personal:username/repo.git
# 3. macOS Keychain 활용
ssh-add --apple-use-keychain ~/.ssh/id_rsa_github_personal
이렇게 설정하면 SSH가 정확히 의도한 키를 사용하여 예측 가능하게 동작한다.
This post is licensed under CC BY 4.0 by the author.