계정마다 SSH 키를 따로 만들고, 저장소 주소에 계정별 별칭을 붙이면 된다.(SSH 인증과 커밋 작성자 정보도 별개라 둘 다 설정해야 함)
아래와 같이 설정할 예정.
| 개인 | 회사 | |
| SSH 키 | id_ed25519_personal | id_ed25519_company |
| 호스트 별칭 | github-personal | github-work |
| 저장소 주소 | git@github-personal:개인계정/저장소.git | git@github-work:회사계정/저장소.git |
| 커밋 이메일 | 개인 이메일 | 회사 이메일 |
Git 설정 파일 위치
git 설정 파일은 적용 범위에 따라 시스템, 사용자, 저장소 설정으로 나뉜다. 저장소 안에서 설정한 값이 사용자 설정보다 우선하므로 회사 저장소에만 회사 이메일을 적용할 수도 있다.
| 범위 | 위치 | 적용 대상 |
| 시스템 | /etc/gitconfig | 맥의 모든 사용자 |
| 사용자 | ~/.gitconfig ~/.config/git/config |
현재 사용자 |
| 저장소 | <저장소>/.git/config | 해당 저장소만 |
현재 어떤 설정이 적용되고 있는지 확인할 수 있는 명령어
git config --list --show-origin
계정마다 SSH 키 만들기
먼저 계정별 키를 만든다. -f로 파일 이름을 지정해 기존 키와 겹치지 않게 함.
ssh-keygen -t ed25519 -C "개인 이메일" -f ~/.ssh/id_ed25519_personal
ssh-keygen -t ed25519 -C "회사 이메일" -f ~/.ssh/id_ed25519_company
키를 만들 때 passphrase를 입력하라고 하는데 이는 키를 잠그는 암호문을 설정하는 것이다. 아무 것도 입력하지 않고, enter 누를 수도 있고, 값 설정하는 경우에는 나중에 SSH 키를 쓸 때도 동일하게 입력해야 한다. (passphrase값 나중에 입력 시 까먹으면 찾을 방법이 없고, 키 자체를 새로 생성해야 하므로 passphrase 설정 시에는 해당 값을 잘 기록해두어야 함.)
공개 키를 GitHub 계정에 등록하기
각 키의 공개 부분을 해당 GitHub 계정에 등록한다.
아래 명령어를 통해 공개 키 파일 내용 복사
pbcopy < ~/.ssh/id_ed25519_personal.pub
pbcopy < ~/.ssh/id_ed25519_company.pub
복사한 키는 각 계정의 GitHub에서 Settings → SSH and GPG keys → New SSH key에 등록. 파일 이름 끝에 .pub이 붙은 공개 키를 사용해야 한다. 확장자가 없는 파일은 개인 키이므로 공유하거나 GitHub에 등록하면 안 된다.
SSH 설정에 계정 별칭 추가하기
~/.ssh/config에 계정별 별칭을 추가해서 해당 별칭을 통해 계정을 각각 구분해서 사용이 가능하다. 각 별칭 사용 시 SSH가 어떤 키를 써야 할 지 알려주는 것이라 할 수 있다.
# ~/.ssh/config
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_company
IdentitiesOnly yes
여기서 HostName은 둘 다 실제 GitHub 주소인 github.com이다. 저장소 주소에 별칭을 쓰면 실제 접속은 GitHub으로 하면서 지정한 키를 사용한다. IdentitiesOnly yes는 SSH가 다른 키를 골라 쓰는 일을 막아준다.
설정 파일이 없었던 경우에는 만들고 권한만 추가로 설정해주면 된다.
mkdir -p ~/.ssh && touch ~/.ssh/config
chmod 700 ~/.ssh
chmod 600 ~/.ssh/config
저장소에서 계정 선택하기
이제 각 프로젝트 clone 할 때에 기존에 github.com 대신 별칭을 사용해주면 된다.
git@[별칭]:[계정]/[저장소].git
클론할 때 아래처럼
git clone git@github-work:company/a_project.git
이미 클론한 저장소의 경우는 저장소 폴더에서 원격 주소만 바꾸면 된다.
git remote set-url origin git@github-work:company/a_project.git
커밋에 표시되는 이름과 이메일도 저장소에서 따로 설정할 수 있다. 저장소 폴더에서 --global 없이 입력하면 이 저장소에만 적용된다.
SAML SSO 안내
위 과정까지 다 수행했는데, 실제 회사 프로젝트 클론 시 아래와 같이 에러 메시지가 나왔다.
ERROR: The '...' organization has enabled or enforced SAML SSO.
To access this repository, you must use the HTTPS remote with a personal access token or SSH with an SSH key and passphrase that has been authorized for this organization.
Visit https://docs.github.com/articles/authenticating-to-a-github-organization-with-saml-single-sign-on/ for more information.
알아보니까 SAML SSO가 설정된 경우 SSH 키 등록뿐 아니라 조직에서 해당 키를 사용할 수 있도록 승인해주는 과정이 별도로 필요하다.
- 회사 계정으로 GitHub에 로그인.
- Settings → SSH and GPG keys로 이동.
- 회사 키 옆의 Configure SSO를 누른다.
- 회사 조직 옆 Authorize를 선택. 필요 시 조직 SSO 로그인도 진행한다.
승인 뒤에는 아래 명령으로 SSH 인증과 저장소 접근을 각각 확인할 수 있다.
ssh -T git@github-work
git ls-remote git@github-work:[회사계정]/board.git
두 번째 명령은 저장소의 원격 참조를 읽을 수 있는지 확인하는 명령어. (그래도 접근이 안 되거나 Configure SSO가 보이지 않으면, 회사 SSO 로그인 상태를 확인하고 조직 관리자에게 키 승인을 문의해봐야 함...).