개발팁 & 유틸

[Git] SSH 키 생성 및 GitHub 저장소에 SSH로 접속하기

GitHub를 사용할 때 내 저장소에 파일을 업로드 해야하는 경우가 많습니다. 이 때 git push 명령을 사용하여 소스코드 & 파일을 업로드할 수 있지만, 이 과정에서 해당 저장소를 수정할 수 있는 권한을 가진 사용자 인증 과정이 필요합니다.

그러나 지속적으로 사용자 계정 정보를 입력하지 않고 싶거나, GitHub 계정이 2FA(Two-Factor Authentication)에 의해 이중 인증이 필요한 상황이 생길 때가 있습니다. (물론 이는 토큰 생성으로 해결할 수 있습니다. 여기를 클릭하여 참고해보세요.) 이럴 때는 HTTPS가 아닌 SSH를 사용하여 접속/업로드할 수 있습니다.

참고 : GitHub에서는 SSH 보다는 HTTPS 프로토콜을 사용하는 것을 권장하고 있습니다. 단, 보안상의 문제와는 관련이 없습니다.

여기서는 GitHub & Linux를 기준으로 설명드리겠습니다. (GitLab 등의 대부분의 버전 관리 툴이 아래 방법과 비슷할 것입니다.)

Git SSH 키 생성 및 GitHub 사용자 인증하기

GitHub에 접속하기 위한 SSH 인증은 기존의 리눅스 서버에 접속하기 위해 사용하는 공개 키 인증(Public Key Authentication)과 유사합니다.

SSH 인증을 위해서는 서버 내에서 사용자 키의 역할을 하는 공개 키(Public Key)개인 키(Private Key)생성해야 합니다.

이미 자신의 서버에 SSH 키를 가지고 있는 경우 이 과정을 건너뛰어도 됩니다. 일반적으로 사용자 키 파일은 ~/.ssh 경로에 존재합니다.

사용자 키를 새롭게 생성하기 위해 서버에 SSH로 접속하여 터미널을 열어줍니다. 사용자 키는 현재 로그인한 사용자가 직접 해야하므로 가능한 root 권한으로 진행하지 않도록 합니다.

현재 사용자의 홈 디렉토리로 이동해줍니다.

$ cd ~

이제 .ssh 디렉토리로 이동합니다. 없다면 다음과 같이 생성 후 (생성 시 권한은 rwx------) 이동합니다.

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cd .ssh

이후 다음과 같이 사용자 키 생성 명령어를 입력해줍니다. (my-email@example.com 대신 자신의 이메일 주소를 입력합니다.)

$ ssh-keygen -t rsa -b 4096 -C "my-email@example.com"

다음과 같이 나타나면 엔터를 눌러줍니다. (경로를 다른 위치로 특별히 지정해야 하는 경우에만 절대 경로를 입력해줍니다.)

Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):

이제 이 사용자 키의 암호(Passphrase)를 입력해줍니다. 동일 암호를 두 번 입력하여 확인 과정을 마칩니다.

Enter passphrase (empty for no passphrase): 
Enter same passphrase again:

다음과 같이 나타나면 키 생성이 완료 된 것입니다.

Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:qYWyFlIUh/DxwRyzRj961ymIFyhgKchwpAyl0YJcIIm my-email@example.com
The key's randomart image is:
+---[RSA 4096]----+
| Eo+X+.          |
|+O.B.O           |
|+.  @ =          |
|o. B *   o .     |
|. . B = S o      |
|   . = + .       |
|    o =          |
|   .         =   |
|                 |
+----[SHA256]-----+

ls -l 명령어를 사용하여 키 파일이 생성되었는지 확인해보겠습니다.

$ ls -l
total 12
-rw-------. 1 user user  393 Apr  6 22:27 authorized_keys
-rw-------. 1 user user 3326 May 12 18:01 id_rsa
-rw-r--r--. 1 user user  746 May 12 18:01 id_rsa.pub

생성 된 파일 중 id_rsa개인 키, id_rsa.pub공개 키입니다. 개인 키는 절대로 외부 서버나 위치 사용자에 알려주어서는 안되므로 보안에 유의하여 보관해주셔야 합니다. 우리가 GitHub에서 이 사용자 키를 사용하여 사용자 인증을 하기 위해서는 ‘공개 키’ 파일에 있는 정보GitHub에 알려주어야 합니다.

생성한 공개 키 등록 & 복사

공개 키 내용을 복사하기 위해 cat 명령어를 사용하여 파일을 출력해보겠습니다. 아래와 같이 공개 키 파일의 내용이 보여질 것입니다.

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDHWj+cNJF9qA3GnyxWyFqKXF+YRdIkoDBhQuGN6j3IZaJNtntIbZp4v8l2tPGeYbY+vyaCZHU2qZ62Zs4S/ov+4C7LONvINBF8BUCpveOsdMgfbMT3EnfZHsGUFh3iaRcHNwN/ZcdAasSnj1LFJ2wkOqUWgVGWwZL1uvr23IyTQrZwv7ShYyp4XgYbvILSWsID2E8WvckcnxYC936iTYkugFHlJQXybeTxKcccMprwWc/WtIwYWDTzZM4DQdShcm5/dTnHDkQwh27ziCkXMnaow9WfYxw+pyJ/BmFQVT0VxTIxkwJ6285QBGsgSqK+NRcYUVX/ubVk6gsAddPOg5E94kg+6bjs9xyuNTCrAyC9eipeyrSkbB85uLsBaZckkVdebllHMUKCBiCjLL61Lv8WS1PbOFouXzKE23HMf57XXXNtDzHkqyeP035M04Q5BTk7Rr18OgMkzOWsHVM5c5ai4MjaXuEHE0cCsrrDCxYCnzbU39aJgUFekQG3CGCv97bGjT3WN5qD9pUaXhrCTgIjYQtbWKeRfyI0+oxsMZiEEuOmCNuv89/6Dkz2v52bCQOW0k6oIiiQIqehyVObfk7Rffq+uwfowBZco9kxFWEaKKzddQy0STcjmuA7g3UjjZNUV+yA+CepVEwFF3MLNtD1GQhmhgQPiHQwWkEzCHhafLw== my-email@example.com

ssh-rsa부터 Comment 부분(my-email@example.com)까지 모두 복사해둡니다.

다음으로 SSH-Agent에 생성한 사용자 키 중 개인 키 파일을 등록해주어야 합니다.

먼저 eval $(ssh-agent -s) 명령어를 사용하여 확인해봅니다. (pid 번호는 아래와 다를 수 있습니다.)

$ eval $(ssh-agent -s)
agent pid 22654

이제 ssh-add 명령어를 사용하여 개인 키 파일을 사용하여 ssh-agent에 등록합니다. (등록 과정 중 사용자 키 암호를 입력해야 합니다.)

$ ssh-add ~/.ssh/id_rsa

GitHub에 공개 키 등록하기

이제 GitHub 홈페이지로 이동해보겠습니다. 아래 URL에서 로그인을 진행합니다.

https://github.com/login

로그인이 완료되었다면 우측 상단 메뉴의 자신의 프로필을 클릭한 후 ‘Settings’ 메뉴를 클릭합니다.

이어서 좌측 메뉴에서 ‘SSH and GPG keys’ 메뉴를 클릭합니다.

다음으로 우측 상단(SSH Keys 항목)의 ‘New SSH Key’ 버튼을 클릭하여 새로운 SSH 키를 등록합니다.

아래와 같이 각 입력란에 키 정보를 입력합니다.

  • Title : 키 이름
  • Key : 상단에서 복사한 공개 키 내용

입력이 완료되면 ‘Add SSH Key’ 버튼을 클릭하여 등록을 완료합니다.

SSH 키가 문제 없이 등록된 것을 확인합니다.

Git 설정 변경하기

GitHub에서 SSH를 사용하려면 먼저 사용을 원하는 저장소에 방문하여 다음과 같이 SSH 경로를 복사해야 합니다.

‘Clone or download’ – ‘Use SSH’ 를 클릭하여 git@github.com:[계정명]/[저장소명].git 을 복사합니다.

이제 HTTPS 접근 방식이 아닌 SSH 접속 방법을 사용하여 GitHub 저장소에 접근할 수 있도록 Git 설정을 변경해주어야 합니다.

리눅스 서버 내에 git 저장소가 초기화 된 경로가 /home/www/html이라고 가정해보겠습니다. 만약 아직 git 저장소 초기화가 안되었다면 원하는 경로에서 git init 명령어를 사용하면 됩니다. 다음 명령어를 입력하여 해당 경로로 이동합니다.

$ cd /home/www/html

다음 명령어를 사용하여 remote 정보를 갱신합니다. 여기에 사용되는 git 주소는 방금 전에 복사했던 SSH 경로를 붙여넣습니다.

$ git remote add origin git@github.com:user/repository.git

git remote show 명령어로 추가한 연결된 저장소를 확인할 수 있습니다.

$ git remote show
origin

임의의 파일을 commit하기 위해 test.txt 파일을 변동사항에 추가한 후, master 브랜치로 push하여 서버에 업로드해보겠습니다.

$ git add test.txt
$ git commit -m "test"
$ git push origin master

다음과 같이 호스트 키 저장 여부를 묻는다면 yes를 입력합니다.

The authenticity of host 'github.com (192.###.###.###)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXU##################################.
RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:##:##:##:##:##:##:##:##.
Are you sure you want to continue connecting (yes/no)?

파일이 문제 없이 업로드되는 것을 확인할 수 있습니다.

Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 258 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To git@github.com:user/repository.git
   481cdf6..e04da7d  master -> master

이제 별도의 사용자 이름과 암호를 묻지 않고 저장소에 파일을 업로드할 수 있습니다.

참고자료

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

View Comments

Recent Posts

[iOS] Xcode ‘You do not have required contracts to perform an operation’ 해결

Xcode에서 iOS 애플리케이션을 빌드(Archive)하고 App Store Connect에 앱을 업로드하는 도중, 아래와 같은 에러가 발생하면서 더…

3주 ago

[안드로이드] INSTALL_FAILED_INSUFFICIENT_STORAGE 해결

INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…

6개월 ago

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

8개월 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

8개월 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

8개월 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

8개월 ago