SSH 키는 비대칭 암호화를 사용하여 비밀번호 없는 로그인과 신원 인증을 구현합니다. 비밀번호보다 안전하고 편리합니다. 이 글에서는 일상 개발에서 자주 등장하는 다양한 상황을 다룹니다.
알고리즘 선택
키를 생성하기 전에 알고리즘을 결정합니다.
| 알고리즘 | 권장도 | 설명 |
|---|---|---|
| Ed25519 | ✅ 최우선 | 현대적 타원 곡선 알고리즘. 짧은 키, 빠른 속도, 강한 보안성 |
| RSA 4096 | ✅ 호환용 | 호환성 최고. 레거시 시스템에 필수. 키가 길다 |
| ECDSA | ⚠️ 사용 가능 | RSA보다 짧지만 일부 구현에 취약점 있음 |
| RSA 2048 | ❌ 비권장 | 현재 강도 부족으로 간주됨 |
| DSA | ❌ 비권장 | 폐기됨 |
결론: 새 환경에는 Ed25519를 우선 사용하고, 레거시 시스템 호환이 필요한 경우에만 RSA 4096을 사용하세요.
기본: 첫 번째 SSH 키 생성
Ed25519 (권장)
ssh-keygen -t ed25519 -C "your_email@example.com"
RSA 4096 (호환용)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
실행하면 다음 프롬프트가 나타납니다:
Enter file in which to save the key (/Users/you/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
- 파일 경로: Enter를 눌러 기본 경로 사용
- 패스프레이즈: 설정 권장. 개인 키에 추가적인 암호 보호를 추가합니다
생성 후:
~/.ssh/id_ed25519— 개인 키. 절대 공개하거나 업로드하지 마세요~/.ssh/id_ed25519.pub— 공개 키. 각 플랫폼에 붙여넣어 사용합니다
공개 키 내용 확인
cat ~/.ssh/id_ed25519.pub
출력 예시:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... your_email@example.com
이 한 줄을 복사해서 GitHub / GitLab / 서버의 authorized_keys에 붙여넣으면 됩니다.
상황 1: 여러 플랫폼, 여러 계정 (가장 일반적)
개인 GitHub 계정, 회사 GitHub 계정, GitLab, 내부 서버를 동시에 사용하는 것은 매우 흔합니다. 각각 독립적인 키가 필요합니다.
1단계: 여러 키를 생성하고 각각 이름 지정
# 개인 GitHub
ssh-keygen -t ed25519 -C "me@personal.com" -f ~/.ssh/id_ed25519_github_personal
# 회사 GitHub
ssh-keygen -t ed25519 -C "me@work.com" -f ~/.ssh/id_ed25519_github_work
# GitLab
ssh-keygen -t ed25519 -C "me@work.com" -f ~/.ssh/id_ed25519_gitlab
# 내부 서버
ssh-keygen -t ed25519 -C "server" -f ~/.ssh/id_ed25519_server
2단계: ~/.ssh/config 설정
# 개인 GitHub
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_personal
# 회사 GitHub
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_work
# GitLab
Host gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_ed25519_gitlab
# 내부 서버
Host dev-server
HostName 192.168.1.100
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519_server
3단계: 별칭을 사용해 작업
# 개인 저장소 클론 (github.com 대신 Host 별칭 사용)
git clone git@github-personal:username/repo.git
# 회사 저장소 클론
git clone git@github-work:company/repo.git
# 서버에 직접 SSH 로그인
ssh dev-server
상황 2: ssh-agent에 키 등록
개인 키에 패스프레이즈가 설정되어 있으면 매번 입력해야 합니다. ssh-agent는 세션 동안 패스프레이즈를 기억해 줍니다.
# agent 시작 (보통 자동 시작됨)
eval "$(ssh-agent -s)"
# 개인 키를 agent에 추가
ssh-add ~/.ssh/id_ed25519
# 등록된 키 목록 확인
ssh-add -l
macOS 영구 저장 (Keychain에 저장하여 재시작 후에도 재등록 불필요):
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
~/.ssh/config에 다음 줄을 추가하여 macOS가 자동으로 Keychain을 사용하게 합니다:
Host *
AddKeysToAgent yes
UseKeychain yes
상황 3: 서버에 공개 키 배포
방법 1: ssh-copy-id (가장 간단)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
방법 2: 파이프로 전송
cat ~/.ssh/id_ed25519.pub | ssh user@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
방법 3: 서버에서 직접 편집
서버에 로그인 후:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "공개 키 내용 붙여넣기" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
권한이 잘못되면 SSH가 거부합니다:
| 경로 | 권한 |
|---|---|
~/.ssh/ | 700 |
~/.ssh/authorized_keys | 600 |
| 개인 키 파일 | 600 |
| 공개 키 파일 | 644 |
상황 4: Windows 환경
Windows는 몇 가지 다른 설정이 필요합니다.
Git Bash / WSL
macOS/Linux와 절차가 거의 같습니다. ~/.ssh/ 경로도 동일하게 작동합니다.
PowerShell (내장 OpenSSH)
Windows 10 1809 이상은 OpenSSH가 기본 탑재됩니다:
# 키 생성
ssh-keygen -t ed25519 -C "your_email@example.com"
# 키 저장 위치:
# C:\Users\사용자명\.ssh\id_ed25519
ssh-agent 서비스 활성화
# 관리자 권한으로 실행
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent
# 키 추가
ssh-add $env:USERPROFILE\.ssh\id_ed25519
상황 5: 연결 테스트
설정 후 정상 동작 여부를 확인합니다:
# GitHub 테스트
ssh -T git@github.com
# 출력: Hi username! You've successfully authenticated...
# 별칭으로 테스트
ssh -T git@github-personal
# 서버 테스트 (-v는 상세 로그 출력, 문제 해결에 사용)
ssh -v user@server_ip
상황 6: 키 교체 및 폐기
새 키를 생성한 후 해야 할 작업:
- 모든 플랫폼 / 서버에 새 공개 키 추가
- 각 플랫폼 / 서버에서 기존 공개 키 제거
- 로컬의 기존 개인 키 파일 삭제 (선택 사항)
# agent에서 기존 키 제거
ssh-add -d ~/.ssh/old_key
# 기존 키 파일 삭제
rm ~/.ssh/old_key ~/.ssh/old_key.pub
서버에서 기존 공개 키 제거:
# authorized_keys를 편집하여 해당 줄 삭제
nano ~/.ssh/authorized_keys
자주 발생하는 문제
Permission denied (publickey)
- 공개 키가 대상 플랫폼에 추가되어 있는지 확인
~/.ssh/authorized_keys권한이 600인지 확인ssh -v로 핸드셰이크 상세 내용 확인
매번 패스프레이즈를 요구함
- ssh-agent에 키 등록:
ssh-add ~/.ssh/id_ed25519 - macOS는
--apple-use-keychain으로 영구 저장
git이 어떤 키를 사용하는지 확인하고 싶을 때
# 현재 어떤 신원이 활성화되어 있는지 확인
ssh -T git@github.com
# 특정 키를 지정해서 테스트
ssh -i ~/.ssh/id_ed25519_github_personal -T git@github.com
Fonnpo