SSH 키 관리와 설정 — 키 생성부터 멀티 계정까지

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

보안 권장 사항

항목권장 설정위험
알고리즘Ed25519RSA 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를 사용하면 보안 범위를 줄일 수 있습니다.

이 글이 도움이 되었나요?