SSH 키를 이용한 Github 계정 분리

---
개발

하나의 개발 환경에서 개인 GitHub 계정과 회사 GitHub 계정을 동시에 사용해야 하는 경우가 많다. 하지만 Git은 기본적으로 같은 호스트명(github.com) 에 대해 하나의 인증 정보만 사용할 수 있기 때문 계정을 섞어 쓰면 인증 충돌이 발생한다.

이 글에서 Git · SSH의 원리 기반으로 계정 충돌이 왜 일어나는지 그리고 SSH config를 사용해 이를 어떻게 해결하는지 간단하게 기록해보자


1. Git은 인증을 직접 하지 않는다

Git은 원격 저장소와 통신할 때 인증을 스스로 처리하지 않는다. 대신 다음 두 가지 방식을 통해 원격 서버(GitHub) 가 인증을 결정한다.

인증 방식 1) HTTPS + Personal Access Token

  • git push/pull 시 GitHub가 사용자명/토큰을 요구한다.
  • Git은 사용자가 입력한 자격증명을 credential helper에 저장할 수 있다.
  • 문제는 이 방식은 하나의 호스트(github.com)당 하나의 credential만 저장한다는 점이다.

즉, 개인 계정으로 로그인된 상태에서 회사 레포를 clone하면 충돌이 발생한다.

인증 방식 2) SSH + Key Pair 인증

SSH는 두 개의 키로 동작한다.

  • 비공개키 (private key) : 로컬 컴퓨터에 저장, 절대 외부 공유 금지
  • 공개키 (public key) : GitHub 계정에 등록

GitHub는 다음 조건으로 인증을 결정한다.

로컬에서 제시한 비공개키가 GitHub 계정에 등록된 공개키와 한 쌍인지 확인

SSH 방식은 비밀번호 입력이 필요 없고, 여러 키를 생성해 여러 계정에 연결할 수 있다는 장점이 있다.


2. 계정 충돌이 발생하는 이유

SSH 자체는 여러 키를 문제없이 사용할 수 있지만 충돌이 일어나는 이유는 호스트명(github.com) 때문이다.

기본적인 Git 과 SSH 동작은 다음 순서로 이루어진다.

1) Git은 원격 주소의 호스트명을 SSH에게 전달

git@github.com:org/repo.git

Git은 SSH에게 "github.com에 접속해줘"라고 요청한다.

2) SSH는 해당 호스트(github.com)에 어떤 키를 써야 하는지 결정

SSH는 기본적으로 다음 우선순위를 따른다.

  1. SSH config 파일 (~/.ssh/config)
  2. 기본키 (~/.ssh/id_rsa, id_ed25519 등)

문제는 대부분의 사용자 환경에서는 개인용 키가 기본키(id_ed25519)로 존재한다는 점이다.

그렇기 때문에 회사 레포라도 Git은 다음과 같이 생각한다.

"github.com? 음… 여기엔 기본 키(id_ed25519)를 쓰면 되겠지."

하지만 이 기본키는 개인 계정용 → 회사 계정 인증 실패.

결국 문제는 github.com이라는 동일 호스트를 개인/회사 계정 모두 사용하기 때문이다.


3. 가짜 호스트(alias) 사용

SSH config는 특정 호스트에 대해 어떤 키를 사용할지 재정의할 수 있다. 이를 이용해 다음 구조를 만든다.

  • github.com → 개인 계정용 키 사용
  • github-work → 회사 계정용 키 사용 (가짜 호스트명)

즉, 실제 GitHub 서버는 동일하지만 SSH에게는 다른 호스트로 보이게 만드는 것이다.


4. SSH 키 생성 및 설정 과정

계정 분리를 위해 필요한 핵심 단계만 기술적으로 재정리한다.

1. 개인용 SSH 키 생성

// 개인용 SSH키 생성
ssh-keygen -t ed25519 -C "개인계정 이메일"

// 개인용 SSH키 확인
cat ~/.ssh/id_ed25519.pub

이렇게 생성된 public key를 GitHub 개인 계정에 등록한다.

2. 회사용 SSH 키 생성

// 회사용 SSH키 생성
ssh-keygen -t ed25519 -C "회사 이메일" -f ~/.ssh/id_work

// 회사용 SSH키 확인
cat ~/.ssh/id_work.pub

생성된 id_work.pub를 회사 GitHub 계정에 등록한다.

3. SSH config에 계정 분리 규칙 정의

# 개인 계정
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes

# 회사 계정
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_work
  IdentitiesOnly yes

여기서 github-work는 실제 존재하지 않는 가짜 호스트명이며 SSH가 이 이름을 기반으로 특정 키를 사용하도록 유도한다.

IdentitiesOnly yes 옵션은 SSH가 다른 키를 자동으로 시도하는 것을 방지하여, 지정된 키만 사용하도록 강제한다. 이를 통해 의도하지 않은 키가 사용되는 문제를 예방할 수 있다.


5. 계정 분리 후 사용 방식

설정 완료 후 Git은 다음 원리로 작동한다.

  • github.com 사용 → 개인용 SSH 키 적용 → 개인 계정 권한으로 접근
  • github-work 사용 → 회사용 SSH 키 적용 → 회사 계정 권한으로 접근

개인 레포 clone

git clone git@github.com:username/repo.git

회사 레포 clone

git clone git@github-work:companyOrg/repo.git

원격 주소에서 github.comgithub-work로 바꾸면 끝이다.

clone 이후 push, pull, fetch 등 모든 Git 작업은 자동으로 올바른 계정으로 처리된다. Git은 저장소의 remote URL을 그대로 사용하므로 별도의 계정 전환 작업이 필요 없다.


6. 정리

  • SSH 키는 계정 수만큼 생성 가능
  • SSH config는 호스트명 기반으로 키 선택 가능
  • Git은 인증을 직접 처리하지 않고 SSH에게 모든 걸 위임
  • 회사/개인 계정 충돌은 같은 호스트명 사용 때문에 발생
  • 가짜 호스트명(alias)을 만들어 계정을 완전히 분리하면 충돌이 사라진다

이 방식은 Git의 동작 원리와 SSH 인증 구조에 기반한 해결 방법 중 하나이며 한 번 설정하면 계정 충돌 없이 안정적으로 유지되기 때문에 편하게 사용하고있다.

목차