GitHub를 사용할 때 내 저장소에 파일을 업로드 해야하는 경우가 많습니다. 이 때 git push
명령을 사용하여 소스코드 & 파일을 업로드할 수 있지만, 이 과정에서 해당 저장소를 수정할 수 있는 권한을 가진 사용자 인증 과정이 필요합니다.
그러나 지속적으로 사용자 계정 정보를 입력하지 않고 싶거나, GitHub 계정이 2FA(Two-Factor Authentication)에 의해 이중 인증이 필요한 상황이 생길 때가 있습니다. (물론 이는 토큰 생성으로 해결할 수 있습니다. 여기를 클릭하여 참고해보세요.) 이럴 때는 HTTPS가 아닌 SSH를 사용하여 접속/업로드할 수 있습니다.
여기서는 GitHub & Linux를 기준으로 설명드리겠습니다. (GitLab 등의 대부분의 버전 관리 툴이 아래 방법과 비슷할 것입니다.)
GitHub에 접속하기 위한 SSH 인증은 기존의 리눅스 서버에 접속하기 위해 사용하는 공개 키 인증(Public Key Authentication)과 유사합니다.
SSH 인증을 위해서는 서버 내에서 사용자 키의 역할을 하는 공개 키(Public Key)와 개인 키(Private Key)를 생성해야 합니다.
이미 자신의 서버에 SSH 키를 가지고 있는 경우 이 과정을 건너뛰어도 됩니다. 일반적으로 사용자 키 파일은 ~/.ssh
경로에 존재합니다.
사용자 키를 새롭게 생성하기 위해 서버에 SSH로 접속하여 터미널을 열어줍니다. 사용자 키는 현재 로그인한 사용자가 직접 해야하므로 가능한 root 권한으로 진행하지 않도록 합니다.
현재 사용자의 홈 디렉토리로 이동해줍니다.
$ cd ~
$ cd ~
이제 .ssh
디렉토리로 이동합니다. 없다면 다음과 같이 생성 후 (생성 시 권한은 rwx------
) 이동합니다.
$ mkdir ~/.ssh $ chmod 700 ~/.ssh $ cd .ssh
$ mkdir ~/.ssh $ chmod 700 ~/.ssh $ cd .ssh
이후 다음과 같이 사용자 키 생성 명령어를 입력해줍니다. (my-email@example.com
대신 자신의 이메일 주소를 입력합니다.)
$ ssh-keygen -t rsa -b 4096 -C "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):
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:
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]-----+
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
$ 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
$ 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
$ eval $(ssh-agent -s) agent pid 22654
이제 ssh-add
명령어를 사용하여 개인 키 파일을 사용하여 ssh-agent에 등록합니다. (등록 과정 중 사용자 키 암호를 입력해야 합니다.)
$ ssh-add ~/.ssh/id_rsa
$ ssh-add ~/.ssh/id_rsa
이제 GitHub 홈페이지로 이동해보겠습니다. 아래 URL에서 로그인을 진행합니다.
로그인이 완료되었다면 우측 상단 메뉴의 자신의 프로필을 클릭한 후 ‘Settings’ 메뉴를 클릭합니다.
이어서 좌측 메뉴에서 ‘SSH and GPG keys’ 메뉴를 클릭합니다.
다음으로 우측 상단(SSH Keys 항목)의 ‘New SSH Key’ 버튼을 클릭하여 새로운 SSH 키를 등록합니다.
아래와 같이 각 입력란에 키 정보를 입력합니다.
입력이 완료되면 ‘Add SSH Key’ 버튼을 클릭하여 등록을 완료합니다.
SSH 키가 문제 없이 등록된 것을 확인합니다.
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
$ cd /home/www/html
다음 명령어를 사용하여 remote 정보를 갱신합니다. 여기에 사용되는 git 주소는 방금 전에 복사했던 SSH 경로를 붙여넣습니다.
$ git remote add origin git@github.com:user/repository.git
$ git remote add origin git@github.com:user/repository.git
git remote show
명령어로 추가한 연결된 저장소를 확인할 수 있습니다.
$ git remote show origin
$ git remote show origin
임의의 파일을 commit
하기 위해 test.txt
파일을 변동사항에 추가한 후, master 브랜치로 push
하여 서버에 업로드해보겠습니다.
$ git add test.txt $ git commit -m "test" $ git push origin master
$ 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)?
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
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
이제 별도의 사용자 이름과 암호를 묻지 않고 저장소