GitHub에서 소스를 업로드 하거나 private repository에 접근하려면 인증이 필요합니다. GitHub에서 패스워드 기반 인증은 지원하고 있지 않기에 대부분 SSH 인증을 사용합니다. 이 포스팅에서는 SSH 키 생성 및 GitHub에 SSH Key를 등록하여 SSH 인증하는 방법에 대해서 알아보도록 하겠습니다.
왜 SSH 인증을 사용하나요?
GitHub에서 소스를 업로드 하거나 private repository에 접근하려면 인증이 필요합니다. GitHub에서 보안상의 이유로 패스워드 인증 방식을 . 더이상 지원하지 않으며, 대신 personal access token 또는 SSH 방식을 사용해 인증을 수행해야 합니다.
SSH는 Secure Shell의 약자로, 네트워크 상의 다른 컴퓨터에 안전하게 접속하고 명령을 실행할 수 있게 해주는 보안 프로토콜입니다. SSH 프로토콜은 대칭키 암호화 방식 또는 비대칭키 암호화 방식을 사용하여 보안 채널을 제공하는데, GitHub의 경우 비대칭키 암호화 방식(=공개 키 인증 방식)을 지원하고 있습니다.
공개키 인증 방식을 사용하려면 한 쌍의 공개키와 개인키를 만들어야 합니다. 공개키는 누구나 사용할 수 있으며 보통 서버에 등록하는 용도로 사용합니다. 개인키는 공개키와 반대로 반드시 나만 사용할 수 있도록 안전하게 보관해야 하는 파일입니다.
SSH 공개키와 개인키 만들기
SSH 키를 만들기 전에 기존에 생성한 키가 있는지 확인합니다. ~/.ssh 폴더에 id_xxxx
와 id_xxxx.pub
파일이 있다면, 이미 키를 생성한 적이 있는 것입니다. 이 경우 기존 키에 덮어쓰기 하거나 다른 경로에 새 키를 생성할 수 있습니다. ( 윈도우는 command 말고 Git Bash를 사용해야 합니다. )
cd ~/.ssh
이제 키를 생성해보겠습니다. 터미널을 열고 아래 명령어를 입력합니다.
ssh-keygen -t ed25519 -C "your_email@domain.com"
ed25519 방식으로 키 생성이 안되면 RSA 방식으로 키를 생성합니다.
ssh-keygen -t RSA -b 4096 -C "your_email@domain.com"
실제 키를 생성해보겠습니다.
ssh-keygen -t ed25519 -C "whalec-io@daum.net"
첫 번째로 키의 저장 경로를 물어보는데, 기본 경로를 사용하려면 그냥 Enter를 누르면 됩니다.
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/eden/.ssh/id_ed25519):
두 번째로 패스워드를 설정할지 묻는데, 보안을 위해 패스워드를 설정하는 것을 권장합니다.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
이 과정을 마치면 SSH 키가 생성됩니다. id_ed25519
는 개인키로 id_ed25519.pub
는 공개키로 생서됩니다.
Your identification has been saved in /Users/eden/.ssh/id_ed25519
Your public key has been saved in /Users/eden/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:+6K1pSxlGyqKX3fipMgolhCfm/+i1DN2ew/LkGj2RV4 whalec-io@daum.net
The key's randomart image is:
+--[ED25519 256]--+
| |
| |
| |
|. |
| o . S E |
|. o. . ++o |
|. ooX B+Bo. |
|.Bo*oXoX+B |
|=.*+o+*+*oo |
+----[SHA256]-----+
GitHub 공개키 등록
생성된 공개키를 GitHub에 등록하려면 먼저 공개키를 클립보드에 복사해야 합니다. 아래 명령어를 사용하여 복사할 수 있습니다.
# macOS
pbcopy < ~/.ssh/id_ed25519.pub
# Windows
clip < ~/.ssh/id_ed25519.pub
그 후 GitHub에 로그인하여, 우측 상단의 프로필 아이콘을 클릭하고 Settings > SSH and GPG keys로 이동합니다. New SSH key 버튼을 눌러 새 키를 추가합니다. Title에는 키를 구분할 수 있는 이름을, Key에는 복사한 공개키를 붙여넣기 하면 됩니다.
GitHub에 공개키를 등록을 완료했습니다.
SSH 접속 설정
이제 명시적으로 SSH 접속 설정을 해보겠습니다. ~./ssh/config 파일에 아래 내용을 추가해주세요. 만약 파일이 없으면 파일을 생성합니다.
Host github.com
IdentityFile ~/.ssh/id_ed25519
User git
SSH 인증
이제 GitHub 저장소에 SSH로 접근할 수 있습니다. 소스 코드를 업로드 하거나 private repository에 접근할 수 있습니다.
private repository를 복제해보겠습니다. 저장소 SSH 주소를 복사한 후 아래 명령어로 클론합니다.
git clone git@github.com:bigsprout/bts-api-server.git
Cloning into 'bts-api-server'...
Enter passphrase for key '/Users/eden/.ssh/id_ed25519':
remote: Enumerating objects: 993, done.
remote: Counting objects: 100% (397/397), done.
remote: Compressing objects: 100% (295/295), done.
remote: Total 993 (delta 190), reused 253 (delta 94), pack-reused 596
Receiving objects: 100% (993/993), 316.11 KiB | 614.00 KiB/s, done.
Resolving deltas: 100% (530/530), done.
저장소 복제 과정에서 개인키의 패스워드를 입력해야 하는데, 이는 키를 생성할 때 설정한 패스워드를 입력하면 됩니다. 인증이 완료되면 정상적으로 저장소가 복제됩니다.
이제 SSH 인증으로 GitHub을 사용할 수 있습니다.
SSH Agent에 키 등록(개인키 패스워드 입력 생략)
매번 git clone이나 git push를 할 때 개인키 패스워드를 입력하는 과정이 번거로울 수 있습니다. 이를 생략하려면 SSH Agent에 키를 등록하면 됩니다.
먼저 SSH Agent가 실행 중인지 확인합니다.
ssh-add -l
위와 같이 명령어 입력했는데 Error connecting to agent: Connection refused
오류가 발생할 경우 ssh-agent가 실행되어 있지 않은 상태입니다. 이 경우 ssh-agent를 실행합니다.
# ssh-agent 실행
eval "$(ssh-agent -s)"
만약 The agent has no identities.
와 오류가 발생한다면 ssh 키가 등록되지 않아서 발생하는 문제로 키를 등록하면됩니다.
# ssh 키 등록
ssh-add ~/.ssh/id_ed25519
Enter passphrase for /Users/eden/.ssh/id_ed25519:
Identity added: /Users/eden/.ssh/id_ed25519 (whalec-io@daum.net)
개인키 생성할 때 입력한 패스워드를 입력하면 ssh-agent에 SSH 키를 정상적으로 등록할 수 있습니다.
이제 패스워드 입력 없이 git을 사용할 수 있습니다.
# 관련 포스트
# 참고 자료