Permission denied publickey 오류가 여러 계정에서 나는 이유
GitHub에서 개인 계정과 회사 계정을 함께 쓰다 보면 SSH 키를 등록했는데도 아래 오류가 뜨는 경우가 있습니다.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
이 오류는 단순히 SSH 키가 없어서만 발생하지 않습니다. 여러 GitHub 계정을 한 컴퓨터에서 사용할 때는 SSH가 어떤 키를 GitHub에 제시하는지, 로컬 저장소의 remote URL이 어떤 Host를 가리키는지, 해당 키가 어느 GitHub 계정에 등록되어 있는지가 모두 맞아야 합니다.
특히 ssh -T git@github.com은 성공하는데 git push만 실패한다면, 키 자체보다 ~/.ssh/config와 git remote -v 설정이 어긋났을 가능성이 큽니다.
개인 계정과 회사 계정은 SSH 키, Host alias, remote URL을 함께 분리해야 합니다.
먼저 확인할 증상별 원인
| 증상 | 가능성이 높은 원인 | 확인 명령어 |
|---|---|---|
| 개인 저장소는 되는데 회사 저장소만 실패 | 회사 계정 키가 아닌 개인 계정 키로 접속 중 | ssh -T git@github.com-work |
ssh -T는 성공하지만 git push 실패 |
remote URL이 Host alias를 쓰지 않음 | git remote -v |
| GitHub에 키 추가 시 Key already in use 표시 | 같은 공개키가 다른 계정이나 deploy key에 이미 등록됨 | ssh -T -i ~/.ssh/id_ed25519_work git@github.com |
| VSCode Source Control에서만 push 실패 | VSCode 문제가 아니라 저장소 remote URL 문제 | git remote -v |
해결 순서 요약
여러 계정을 한 컴퓨터에서 쓸 때는 아래 순서로 맞추면 됩니다. 핵심은 개인 계정과 회사 계정에 서로 다른 SSH 키를 만들고, ~/.ssh/config에서 Host alias를 나눈 뒤, 저장소 remote URL도 그 alias를 사용하게 바꾸는 것입니다.
- 개인용 SSH 키와 회사용 SSH 키를 각각 만든다.
- 각 공개키를 맞는 GitHub 계정에 등록한다.
~/.ssh/config에github.com-personal,github.com-work같은 Host alias를 만든다.ssh -T로 각각 어떤 계정으로 인증되는지 확인한다.- 로컬 저장소의
originURL을 Host alias 형식으로 바꾼다.
1단계: 계정별 SSH 키 만들기
이미 기본 SSH 키가 있더라도 개인·회사 계정을 분리하려면 파일명을 다르게 만드는 것이 좋습니다. 예시는 개인 계정용 id_ed25519_personal, 회사 계정용 id_ed25519_work로 나눕니다.
Mac·Linux·WSL
mkdir -p ~/.ssh
ssh-keygen -t ed25519 -C "personal-email@example.com" -f ~/.ssh/id_ed25519_personal
ssh-keygen -t ed25519 -C "work-email@example.com" -f ~/.ssh/id_ed25519_work
Windows PowerShell
New-Item -ItemType Directory -Force $env:USERPROFILE\.ssh
ssh-keygen -t ed25519 -C "personal-email@example.com" -f $env:USERPROFILE\.ssh\id_ed25519_personal
ssh-keygen -t ed25519 -C "work-email@example.com" -f $env:USERPROFILE\.ssh\id_ed25519_work
중간에 passphrase를 물어보면 입력해도 되고 비워도 됩니다. 업무용 키라면 passphrase를 설정하고 ssh-agent에 등록해 반복 입력을 줄이는 방식이 더 안전합니다.
2단계: ssh-agent에 키 등록하기
SSH 키 파일을 만들었더라도 ssh-agent가 해당 키를 기억하지 못하면 인증 과정에서 원하는 키가 선택되지 않을 수 있습니다. 계정별 키를 모두 등록합니다.
Mac·Linux·WSL
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519_personal
ssh-add ~/.ssh/id_ed25519_work
ssh-add -l
Windows PowerShell
아래 명령은 관리자 권한 PowerShell에서 실행하는 편이 안전합니다. 이후 ssh-add는 일반 PowerShell이나 Git Bash에서 실행해도 됩니다.
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519_personal
ssh-add $env:USERPROFILE\.ssh\id_ed25519_work
ssh-add -l
3단계: GitHub 계정에 공개키 등록하기
GitHub에는 개인키가 아니라 .pub로 끝나는 공개키를 등록해야 합니다. 개인 계정에는 개인용 공개키를, 회사 계정에는 회사용 공개키를 각각 등록합니다.
공개키 복사 명령어
# Mac
pbcopy < ~/.ssh/id_ed25519_personal.pub
# Linux 또는 WSL
cat ~/.ssh/id_ed25519_personal.pub
# Windows PowerShell
Get-Content $env:USERPROFILE\.ssh\id_ed25519_personal.pub | Set-Clipboard
회사 계정용 키를 복사할 때는 파일명만 바꿉니다.
# Mac
pbcopy < ~/.ssh/id_ed25519_work.pub
# Linux 또는 WSL
cat ~/.ssh/id_ed25519_work.pub
# Windows PowerShell
Get-Content $env:USERPROFILE\.ssh\id_ed25519_work.pub | Set-Clipboard
GitHub 화면에서는 프로필 아이콘을 누른 뒤 Settings → SSH and GPG keys → New SSH key로 이동해 공개키를 붙여 넣습니다. 같은 공개키를 두 계정에 중복 등록하려고 하면 Key already in use 오류가 날 수 있으므로 계정별로 반드시 다른 키를 사용합니다.
4단계: ~/.ssh/config에서 Host alias 나누기
여러 계정 오류 해결의 핵심은 이 단계입니다. GitHub 서버는 둘 다 github.com이지만, 로컬 SSH 설정에서는 개인 계정용 Host와 회사 계정용 Host를 다르게 부릅니다.
Host github.com-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
Host는 로컬에서만 쓰는 별명이고, HostName은 실제 접속할 서버입니다. 따라서 github.com-personal과 github.com-work는 둘 다 실제로는 github.com에 접속하지만 서로 다른 키를 사용합니다.
IdentitiesOnly yes는 ssh-agent에 여러 키가 올라가 있을 때도 해당 Host에 지정된 키만 사용하도록 제한합니다. 이 줄이 없으면 SSH가 여러 키를 순서대로 제시하다가 의도하지 않은 계정으로 인증될 수 있습니다.
5단계: SSH 연결 테스트하기
설정이 끝났다면 각 Host alias가 어떤 GitHub 계정으로 인증되는지 확인합니다.
ssh -T git@github.com-personal
ssh -T git@github.com-work
정상이라면 아래처럼 계정명이 표시됩니다. GitHub는 SSH 접속으로 셸을 제공하지 않기 때문에 “shell access” 문구가 나와도 인증 자체는 성공입니다.
Hi PERSONAL_USERNAME! You've successfully authenticated, but GitHub does not provide shell access.
Hi WORK_USERNAME! You've successfully authenticated, but GitHub does not provide shell access.
여전히 실패한다면 -vT 옵션으로 어떤 키를 사용하려는지 확인합니다.
ssh -vT git@github.com-work
출력 중 Offering public key 또는 identity file 근처에 id_ed25519_work가 보이지 않는다면 ~/.ssh/config 경로나 들여쓰기, 파일명이 틀렸을 가능성이 있습니다.
6단계: 저장소 remote URL을 Host alias로 바꾸기
ssh -T가 성공해도 로컬 저장소 remote URL이 여전히 git@github.com:OWNER/REPO.git이면 Git은 기본 github.com 설정을 사용합니다. 여러 계정 분리에서는 remote URL도 Host alias로 바꿔야 합니다.
현재 remote 확인
git remote -v
예를 들어 회사 저장소인데 아래처럼 되어 있다면 Host alias를 쓰지 않는 상태입니다.
origin git@github.com:WORK_ORG/PROJECT.git (fetch)
origin git@github.com:WORK_ORG/PROJECT.git (push)
개인 저장소 remote URL
git remote set-url origin git@github.com-personal:PERSONAL_USERNAME/REPOSITORY.git
회사 저장소 remote URL
git remote set-url origin git@github.com-work:WORK_ORG/REPOSITORY.git
변경 확인
git remote -v
회사 저장소라면 아래처럼 github.com-work가 보여야 합니다.
origin git@github.com-work:WORK_ORG/REPOSITORY.git (fetch)
origin git@github.com-work:WORK_ORG/REPOSITORY.git (push)
이제 다시 push를 시도합니다.
git push origin main
Windows·Mac·Linux에서 다른 점
| 환경 | SSH 설정 파일 위치 | 주의할 점 |
|---|---|---|
| Mac | ~/.ssh/config |
키체인에 passphrase를 저장하는 설정과 ssh-agent 설정이 함께 작동할 수 있습니다. |
| Windows PowerShell | C:\Users\사용자명\.ssh\config |
OpenSSH agent 서비스가 꺼져 있으면 ssh-add가 실패할 수 있습니다. |
| Git Bash | ~/.ssh/config |
PowerShell과 같은 Windows 사용자 폴더를 보지만, 경로 표기 방식이 다를 수 있습니다. |
| WSL | /home/사용자명/.ssh/config |
Windows의 C:\Users\... 아래 SSH 키와 별개로 관리되는 경우가 많습니다. |
| Linux | ~/.ssh/config |
파일 권한이 너무 열려 있으면 SSH가 설정 파일이나 키 파일을 무시할 수 있습니다. |
파일 권한도 함께 확인하기
Mac, Linux, WSL에서는 SSH 파일 권한이 너무 넓게 열려 있으면 키를 사용하지 못할 수 있습니다. 권한 문제가 의심되면 아래처럼 정리합니다.
chmod 700 ~/.ssh
chmod 600 ~/.ssh/config
chmod 600 ~/.ssh/id_ed25519_personal
chmod 600 ~/.ssh/id_ed25519_work
chmod 644 ~/.ssh/id_ed25519_personal.pub
chmod 644 ~/.ssh/id_ed25519_work.pub
Windows에서는 일반적으로 chmod보다 사용자 폴더 권한과 OpenSSH agent 실행 상태를 먼저 확인하는 편이 좋습니다.
재발 방지 설정
저장소를 clone할 때부터 alias를 사용하기
처음 clone할 때부터 계정별 Host alias를 쓰면 나중에 remote URL을 다시 바꿀 일이 줄어듭니다.
# 개인 계정 저장소
git clone git@github.com-personal:PERSONAL_USERNAME/REPOSITORY.git
# 회사 계정 저장소
git clone git@github.com-work:WORK_ORG/REPOSITORY.git
저장소별 Git 사용자 정보도 분리하기
SSH 인증은 “어떤 계정으로 GitHub에 접속할지”를 정하는 설정이고, Git 사용자 정보는 “커밋에 어떤 이름과 이메일을 남길지”를 정하는 설정입니다. 둘은 다르므로 저장소별로 함께 확인하는 것이 좋습니다.
# 개인 저장소에서
git config user.name "Personal Name"
git config user.email "personal-email@example.com"
# 회사 저장소에서
git config user.name "Work Name"
git config user.email "work-email@example.com"
# 현재 저장소 설정 확인
git config user.name
git config user.email
자주 쓰는 점검 명령어
| 목적 | 명령어 |
|---|---|
| 등록된 키 목록 확인 | ssh-add -l |
| 개인 계정 SSH 테스트 | ssh -T git@github.com-personal |
| 회사 계정 SSH 테스트 | ssh -T git@github.com-work |
| 사용되는 키 상세 확인 | ssh -vT git@github.com-work |
| 저장소 remote 확인 | git remote -v |
| remote URL 변경 | git remote set-url origin git@github.com-work:ORG/REPO.git |
공식 자료로 더 확인하기
GitHub SSH 키 생성, 공개키 등록, 여러 계정 사용 방식은 GitHub 정책과 클라이언트 환경에 따라 달라질 수 있습니다. 키를 새로 만들거나 회사 계정에 등록하기 전에는 공식 문서에서 현재 권장 절차를 함께 확인하는 것이 좋습니다.
새 SSH 키를 만드는 방법, passphrase 사용 기준, ssh-agent에 키를 등록하는 기본 절차를 확인할 수 있습니다.
GitHub 계정에 새 SSH 키 추가 방법 확인하기로컬에서 만든 공개키를 GitHub 계정에 등록하는 절차와 인증용 SSH 키 등록 시 주의할 점을 확인할 수 있습니다.
GitHub 계정에 새 SSH 키 추가 방법 확인하기한 컴퓨터에서 여러 GitHub 계정에 기여할 때 올바른 SSH 키를 선택하는 방식과 저장소별 인증 기준을 확인할 수 있습니다.
GitHub 여러 계정 관리와 SSH 키 사용 기준 확인하기함께 보면 좋은 글
자주 묻는 질문
GitHub SSH 여러 계정 오류는 키를 새로 만드는 것보다, 계정별 Host alias와 remote URL이 같은 방향을 가리키는지 확인하는 것이 핵심입니다.
댓글