SSH 키 인증이란?
SSH(Secure Shell) 키는 비밀번호 대신 공개키-개인키 쌍으로 인증하는 방식입니다. 은행 금고에 비유하면, 비밀번호는 숫자 조합(누구나 시도 가능)이고, SSH 키는 물리적 열쇠(소지한 사람만 열 수 있음)입니다.
| 인증 방식 | 보안 수준 | 편의성 | 자동화 |
|---|---|---|---|
| 비밀번호 | 낮음 (유추/탈취 가능) | 매번 입력 | 어려움 |
| SSH 키 | 높음 (개인키 필요) | 한 번 설정 | 용이 |
| SSH 키 + 패스프레이즈 | 매우 높음 | ssh-agent로 관리 | 용이 |
SSH 키 생성
# Ed25519 키 생성 (현재 권장 알고리즘)
ssh-keygen -t ed25519 -C "your.email@example.com"
# 출력:
# Generating public/private ed25519 key pair.
# Enter file in which to save the key (/home/user/.ssh/id_ed25519):
# Enter passphrase (empty for no passphrase): ← 패스프레이즈 설정 권장
# Enter same passphrase again:
# Your identification has been saved in /home/user/.ssh/id_ed25519
# Your public key has been saved in /home/user/.ssh/id_ed25519.pub
# Ed25519를 지원하지 않는 레거시 시스템인 경우 RSA 사용
ssh-keygen -t rsa -b 4096 -C "your.email@example.com"
# 특정 이름으로 키 생성 (멀티 계정용)
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_ed25519_work
ssh-keygen -t ed25519 -C "personal@gmail.com" -f ~/.ssh/id_ed25519_personal
키 파일 확인
# 생성된 키 파일 확인
ls -la ~/.ssh/
# -rw------- id_ed25519 ← 개인키 (절대 공유 금지!)
# -rw-r--r-- id_ed25519.pub ← 공개키 (서버에 등록)
# 공개키 내용 확인 (이 값을 GitHub/서버에 등록)
cat ~/.ssh/id_ed25519.pub
# 출력: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGx... your.email@example.com
# 키 지문(fingerprint) 확인
ssh-keygen -l -f ~/.ssh/id_ed25519.pub
# 출력: 256 SHA256:abc123def456... your.email@example.com (ED25519)
ssh-agent: 패스프레이즈 관리
패스프레이즈를 설정하면 매번 입력해야 하지만, ssh-agent를 사용하면 세션 동안 한 번만 입력하면 됩니다.
# ssh-agent 시작
eval "$(ssh-agent -s)"
# 출력: Agent pid 12345
# 키를 agent에 등록 (패스프레이즈 한 번 입력)
ssh-add ~/.ssh/id_ed25519
# 출력: Identity added: /home/user/.ssh/id_ed25519 (your.email@example.com)
# 등록된 키 목록 확인
ssh-add -l
# 출력: 256 SHA256:abc123... your.email@example.com (ED25519)
# macOS에서는 키체인에 패스프레이즈 저장 가능
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
# 모든 키 제거
ssh-add -D
자동 시작 설정 (bashrc/zshrc)
# ~/.bashrc 또는 ~/.zshrc에 추가
# ssh-agent가 실행 중이 아니면 시작
if [ -z "$SSH_AUTH_SOCK" ]; then
eval "$(ssh-agent -s)" > /dev/null 2>&1
ssh-add ~/.ssh/id_ed25519 2>/dev/null
fi
GitHub에 SSH 키 등록
# 1. 공개키 복사
# Linux
cat ~/.ssh/id_ed25519.pub | xclip -selection clipboard
# macOS
pbcopy < ~/.ssh/id_ed25519.pub
# Windows (Git Bash)
cat ~/.ssh/id_ed25519.pub | clip
# 2. GitHub에 등록
# GitHub → Settings → SSH and GPG keys → New SSH key
# Title: "내 노트북" 등 식별 가능한 이름
# Key: 복사한 공개키 붙여넣기
# 3. 연결 테스트
ssh -T git@github.com
# 출력: Hi username! You've been authenticated, but GitHub does not provide shell access.
# 4. 기존 HTTPS 리포지토리를 SSH로 변경
git remote set-url origin git@github.com:username/repo.git
git remote -v
# 출력: origin git@github.com:username/repo.git (fetch)
# origin git@github.com:username/repo.git (push)
SSH Config 파일: 연결 설정 관리
~/.ssh/config 파일로 호스트별 설정을 관리하면, 긴 명령어를 짧은 별칭으로 대체할 수 있습니다.
# ~/.ssh/config
# 기본 설정 (모든 호스트에 적용)
Host *
AddKeysToAgent yes # 키를 자동으로 agent에 추가
IdentitiesOnly yes # 지정된 키만 시도
ServerAliveInterval 60 # 60초마다 keepalive 전송 (연결 끊김 방지)
ServerAliveCountMax 3 # keepalive 3회 실패 시 연결 종료
# GitHub 개인 계정
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
# GitHub 회사 계정 (별칭 사용)
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
# GitLab
Host gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_ed25519
PreferredAuthentications publickey
# 개발 서버 (별칭으로 간편 접속)
Host dev-server
HostName 192.168.1.100
User deploy
Port 2222 # 기본 22 대신 커스텀 포트
IdentityFile ~/.ssh/id_ed25519_server
# 프로덕션 서버 (점프 호스트 경유)
Host prod-server
HostName 10.0.0.50
User deploy
ProxyJump bastion-server # bastion을 경유하여 접속
Host bastion-server
HostName bastion.example.com
User admin
IdentityFile ~/.ssh/id_ed25519_bastion
# config 적용 후 사용 예시
# 별칭으로 간편 접속 (원래: ssh -i ~/.ssh/id_ed25519_server -p 2222 deploy@192.168.1.100)
ssh dev-server
# 프로덕션 서버 접속 (bastion 경유 자동)
ssh prod-server
# SCP 파일 전송도 별칭 사용
scp ./deploy.tar.gz dev-server:/tmp/
# 포트 포워딩 (로컬 3000 → 서버 3000)
ssh -L 3000:localhost:3000 dev-server
GitHub/GitLab 멀티 계정 설정
개인 GitHub 계정과 회사 GitHub 계정을 동시에 사용하는 경우입니다.
# 1. 계정별 키 생성
ssh-keygen -t ed25519 -C "personal@gmail.com" -f ~/.ssh/id_ed25519_personal
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_ed25519_work
# 2. 각 계정의 GitHub에 해당 공개키 등록
# personal 공개키 → 개인 GitHub
# work 공개키 → 회사 GitHub
# 3. ~/.ssh/config 설정 (위 예시 참조)
# Host github.com → 개인 키
# Host github-work → 회사 키
# 4. 리포지토리별 Git 설정
# 개인 리포지토리
cd ~/personal/my-project
git remote set-url origin git@github.com:personal-user/my-project.git
git config user.name "개인 이름"
git config user.email "personal@gmail.com"
# 회사 리포지토리 (별칭 사용!)
cd ~/work/company-project
git remote set-url origin git@github-work:company-org/company-project.git
# ↑ github-work 별칭 사용 (github.com이 아님)
git config user.name "회사 이름"
git config user.email "work@company.com"
# 5. 테스트
ssh -T git@github.com # 개인 계정 확인
ssh -T git@github-work # 회사 계정 확인
gitconfig conditional includes로 자동화
# ~/.gitconfig (전역 설정)
[user]
name = 개인 이름
email = personal@gmail.com
# 회사 디렉토리에서는 자동으로 회사 설정 적용
[includeIf "gitdir:~/work/"]
path = ~/.gitconfig-work
# ~/.gitconfig-work (회사 전용 설정)
[user]
name = 회사 이름
email = work@company.com
보안 권장 사항
| 항목 | 권장 설정 | 위험 |
|---|---|---|
| 알고리즘 | Ed25519 | RSA 2048 미만은 취약 |
| 패스프레이즈 | 필수 설정 | 없으면 키 파일 탈취 시 즉시 사용 가능 |
| 개인키 권한 | chmod 600 (소유자만 읽기) | 다른 사용자가 읽을 수 있으면 ssh 거부 |
| config 권한 | chmod 644 | 너무 열린 권한은 보안 위험 |
| 키 분리 | 용도별/서버별 개별 키 | 하나의 키가 탈취되면 전체 노출 |
| 키 교체 | 1년 주기 권장 | 오래된 키는 발견되지 않은 탈취 위험 |
# 파일 권한 올바르게 설정
chmod 700 ~/.ssh # .ssh 디렉토리
chmod 600 ~/.ssh/id_ed25519 # 개인키 (소유자만 읽기/쓰기)
chmod 644 ~/.ssh/id_ed25519.pub # 공개키 (읽기 허용)
chmod 644 ~/.ssh/config # config 파일
chmod 644 ~/.ssh/known_hosts # known_hosts
실전 팁
- Ed25519를 기본으로 사용하세요: RSA보다 짧은 키로 더 강한 보안을 제공하고, 성능도 더 좋습니다.
- 패스프레이즈를 반드시 설정하세요: 노트북을 분실하거나 키 파일이 유출되더라도 패스프레이즈가 있으면 즉시 악용할 수 없습니다.
- 용도별로 키를 분리하세요: GitHub 키, 서버 접속 키, 회사/개인 키를 각각 생성하면, 하나가 노출되더라도 피해 범위를 제한할 수 있습니다.
~/.ssh/config를 적극 활용하세요: 복잡한 ssh 명령을 짧은 별칭으로 대체하면 생산성이 크게 향상됩니다.known_hosts를 관리하세요: 처음 접속하는 서버의 fingerprint를 항상 확인하고, 서버 변경 시ssh-keygen -R hostname으로 이전 항목을 제거하세요.- GitHub은 Deploy Key도 활용하세요: CI/CD에서는 계정 전체 키 대신, 특정 리포지토리만 접근하는 Deploy Key를 사용하면 보안 범위를 줄일 수 있습니다.