얼마 전 GitHub 의 비밀번호 인증 방식이 중지되었다. 이제는 pull, push 등 GitHub 에 인증이 필요한 액션을 할 때 비밀번호가 아닌 다른 인증 방식을 설정해야 한다.

Instead, token-based authentication (for example, personal access, OAuth, SSH Key, or GitHub App installation token) will be required for all authenticated Git operations.

그나마 익숙한 것이 무엇인가 살펴보았더니 SSH인 것 같았다. 그래서 SSH로 인증을 설정하기로 했다.

(이 글은 Mac 기준으로 작성되었다.)

1. 하나의 계정에 대한 SSH 인증 설정

한 계정에 대한 설정 방법은 GitHub 공식 문서에 매우 잘 설명되어 있다. 영어가 불편하지 않다면 공식 문서를 보자.

일단 ssh-keygen을 사용해 인증서를 생성하자.

ssh-keygen -t ed25519 -C "your_email@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/default/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

경로를 지정하고 싶다면 -f 옵션을 주자

ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/myCompany/ed25519

생성된 인증서를 key agent 에 등록시켜야 한다. ssh-agent 를 백그라운드에서 실행하자.

eval "$(ssh-agent -s)"

설정에는 ~/.ssh/config 파일이 필요한데, 맥의 경우 자동 생성되지 않았을 수 있다. 그 경우 파일을 직접 생성해서 아래와 같은 내용을 넣어야 한다.

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519

~/.ssh/config 파일도 확인했으면 이제 아래 명령어를 통해 인증서를 ssh-agent 에 추가하자.

ssh-add -K ~/.ssh/id_ed25519

GitHub에 인증서를 등록하려면 아래 명령어를 통해 공개키를 클립보드로 복사해서 사용하면 된다.

pbcopy < ~/.ssh/id_ed25519.pub

복사한 공개키는 GitHub [Settings] - [SSH and GPG keys] - [New SSH key] 를 통해 등록하자.

여기까지 하면 이제 리파지토리의 SSH 주소를 remote 로 사용해 코드를 push/pull 할 수 있다.

git remote set-url origin git@github.com:ME/MY_REPOSITORY.git

2. 여러 계정의 SSH 설정을 한 기기에서 같이 하기

한 사람이 GitHub 계정을 여러 개 가지고 있을 수도 있다. 예를 들면 개인 계정과 회사 계정을 분리한 경우가 있을 수 있다. 그리고 사람 일이 늘 그렇듯, 한 기기에서 개인 일과 회사 일을 다 해야 하는 경우가 생길 수도 있다. 그럴 경우에는 어떻게 설정해주면 될까?

거의 모든 과정이 1번과 동일하다. 다른 것은 키가 저장될 위치, ~/.ssh/config, 그리고 로컬 리파지토리의 remote 주소이다.

2.1. 키가 저장될 위치

키가 저장될 위치가 다른 것은 당연하다. 다른 두 파일을 하나의 위치에 같이 저장할 수는 없으니까. 일단 처음에 저장된 것은 기본 위치에 두고, 추후 추가되는 것을 다른 위치에 저장해보자.

# 처음에 저장된 SSH 키의 위치. (기본값)
~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub
# 이후 추가한 SSH 키의 위치.
# 당연하지만 다른 디렉토리의 다른 파일명으로 저장해도 무방하다.
~/.ssh/myCompany/id_ed25519
~/.ssh/myCompany/id_ed25519.pub

자신이 원하는 아무 곳에나 저장하면 된다.

2.2. ~/.ssh/config

저장된 위치를 설정 파일에 반영하자.

Host github-private
  hostName github.com
  IdentityFile ~/.ssh/id_ed25519
  User git
  IdentitiesOnly yes

Host github-my-company
  hostName github.com
  IdentityFile ~/.ssh/myCompany/id_ed25519
  User git
  IdentitiesOnly yes
  • Host: 본래 호스트명 대신 사용할 호스트명. alias 라고 이해하면 쉽다. 원하는 이름으로 하면 된다. (사용 예는 2.3. 에서 확인할 수 있다.)
    • hostName: git 서비스의 호스트명
    • IdentityFile: 인증 파일 경로
    • IdentitiesOnly: 인증 파일 경로를 확인함에 있어 내가 지정한 값(IdentityFile)만을 사용할 건지 여부. 만약 값을 no로 하면, 키 파일을 가져오기 위해 IdentityFile의 위치를 확인하기에 앞서 시스템의 기본값(이 경우 ~/.ssh/id_ed25519일 것이다.)을 먼저 확인한다고 한다.

2.3. 로컬 리파지토리의 remote 주소 변경

자 이제 2.2. 항목에서 설정한 값을 가지고 리파지토리의 주소를 변경해주어야 한다.

변경하는 방법은 간단하다. 기존 호스트명(github.com) 대신 우리가 위 설정파일에서 지정한 호스트명(Host github-my-company)를 적용해주면 된다.

## 원래 주소
# git@github.com:ME/MY-REPOSITORY.git
## 변경할 주소
# git@github-private:ME/MY-REPOSITORY.git
git remote set-url origin git@github-private:ME/MY-REPOSITORY.git

다른 쪽 리파지토리도 마찬가지다.

## 원래 주소
# git@github.com:COMPANY/COMPANY-REPOSITORY.git
## 변경할 주소
# git@github-my-company:COMPANY/COMPANY-REPOSITORY.git
git remote set-url origin git@github-my-company:COMPANY/COMPANY-REPOSITORY.git

이제 양쪽 다 SSH 인증을 사용할 수 있다.

References