배경지식
프로토콜: 통신 규약. 일종의 소통 규칙
데이터를 인터넷을 통해 전달하기 위해 네트워크에서 최적의 경로를 찾고, 주소를 정하고, 올바른 곳으로 보내는 것에 대한 규칙.
편지를 올바르게 전달하기 위해서 주소를 미리 약속해 두고 편지 양식에 대한 내용을 미리 약속해 두는 것과 유사하다.
만약 편지를 보내는데, 주소가 정해져있지 않거나 편지의 규칙이 정해져 있지 않다면 올바르게 편지를 보낼 수 없을 것이다. 이처럼 인터넷도 데이터를 올바르게 전달하기 위해서는 주소나 방식 등과 같은 부분을 미리 약속해야 한다.
Host: 주인, 진행자
인터넷 주소를 가지고 있으며 쌍방향 소통이 가능한 컴퓨터를 의미한다.
사용자가 제공받길 원하는 리소스나 서비스 등을 제공해 줄 수 있는 주인이자 정보 제공의 진행자이다.
호스트 중에서도 호스트의 요청에 응답이 가능한 호스트는 ‘서버’이다.
(그러나 서버와 호스트가 영어 단어의 의미적으로 비슷한 느낌이 있기 때문에 종종 동의어로 사용되기도 한다.)
Server: (서비스를) 제공하는 사람
클라이언트의 요청을 받으면 서비스, 데이터를 제공하는 컴퓨터 혹은 프로그램.
즉, 데이터(혹은 서비스) 제공해 달라는 요청이 들어오면 요청에 맞는 데이터(혹은 서비스)를 제공해주는 ‘역할’을 하는 것.
(종류: 웹, 메일, DB, 파일, 통신 등)
클라이언트: 고객, 의뢰인
고객(클라이언트)이 정보를 요청하면 서비스를 제공하는 사람(서버)이 주인으로써 정보를 제공.
SSH 키를 이용하여 인증
1. SSH 개념
SSH(Secure Shell): 원격 호스트 컴퓨터와 통신을 하기 위한 인터넷 프로토콜.
SSH 이전에 있던 텔넷은 암호화가 이루어지지 않아 보안상의 문제가 있었지만 이후 1995년에 나온 SSH는 암호화 기능이 추가되어 나왔다. (즉, SSH는 암호화된 데이터를 주고받기 위해 만들어진 통신 규칙이라고 볼 수 있다.)
따라서 통신이 노출되어도 암호화된 문자로 보이게 된다.
SSH는 권한을 세분화하지 못하기 때문에 SSH키가 있으면 모든 저장소에 접근할 수 있다.
2-1. SSH 키 생성
원격 호스트 컴퓨터에 연결하기 위해 SSH는 패스워드방식과 키 인증 방식 두 가지 중 하나를 사용한다.
(보안성: 키 인증 방식 > 패스워드 방식)
ssh-keygen을 이용해 SSH 키를 생성하면 개인 키와 공개 키(.pub) 두 가지가 생성된다. (기본 생성 위치: /root/.ssh)
ssh-keygen을 사용할 때 쓰는 옵션으로는 대표적으로 -t와 -b가 있다. -t는 키 생성에 사용되는 알고리즘 종류(rsa, dsa, ed25519 등)를 지정할 때 사용하고 -b는 키의 크기(단위는 bit)를 지정할 때 사용한다.
※ 만약 -t, -b 옵션을 지정하지 않는다면?
디폴트 값으로 지정되게 된다. -t의 디폴트값은 ed25519이고, -b의 디폴트값은 2048이다.
이렇게 개인 키와 공개 키 쌍을 생성하여 두 키를 복호화에 사용하는 방식을 비대칭 키 방식이라고 한다.(이와 반대인 대칭 키 방식은 한 개의 키를 복호화에 사용한다. 따라서 이 키를 안전하게 전달하는 과정을 요한다.)
공개 키를 접속하고자 하는 서버에게 전달한 후 인증을 시도하면 서버는 공개 키를 이용해 개인 키로만 풀 수 있는 형태로 메시지를 암호화한다. 사용자 측이 개인 키를 이용해서 암호를 풀고 이를 다시 서버에게 보내서 확인 절차를 거치면 인증이 완료되는 방식이다.
공개 키와 개인 키 중 공개 키는 서버에게 전달할 것이기 때문에 공개되어도 상관없지만 개인 키는 그렇지 않기 때문에 유출되면 안 된다..
2-2. .ssh/config
생성한 개인 키와 공개 키의 이름을 변경한다거나, 계정이 여러 개라 관리해야 할 ssh키가 여러 개라거나,, 키의 위치를 옮기는 경우 어떤 키를 언제 사용해야 할지 모르기 때문에 Access 거부가 발생한다. 이를 위해서 .ssh에 config파일을 생성해서 이에 대해 미리 ‘구성’을 할 수 있다.
Host github.com-me
HostName github.com
User git
IdentityFile ~/.ssh/sshKey1
(예시)
config파일의 형식은 다음과 같다
Host hostname1
SSH_OPTION value
SSH_OPTION value
Host hostname2
SSH_OPTION value
Host: 구성한 호스트명(ssh.com에서는 pattern이라고 표현)으로 구성들(사용할 키, 유저 이름 등)을 구분할 수 있다. 일종의 별명과도 같은 느낌이기에 git clone 시 호스트명에 미리 정해둔 별명을 적어도 HostName에 적은 실질적인 주소로 매치된다.
HostName: 실질적인 주소. 사용자가 GitHub Private 저장소에 접근을 할 때 호스트명으로 적은 것과 같은 pattern을 찾아서 HostName에 적은 주소와 매치를 시킨다.
따라서 아래 이미지와 같이 Host를 다른 이름으로 바꾸고 HostName은 github.com으로 해놓으면 git clone시 기재한 호스트명에 바꾼 이름을 기재해도 github.com으로 접근이 된다.
※ 만약 HostName을 구성하지 않으면?
Host에 적은 주소를 HostName으로 사용한다. 당연히 Host를 정확한 주소로 작성하지 않은 상태로 HostName을 지정 안 하면 ‘ssh: Could not resolve hostname hosttest: Name or service not known’라는 에러 문구 나온다.
IdentityFile: identity(신원)File 옵션에는 사용자의 신원에 대한 부분인 키의 경로를 적는다.
해당 옵션을 통해 사용할 개인 키의 위치를 알려주었기 때문에 키의 이름이나 위치를 바꾸더라도 옵션만 수정한다면 문제가 발생하지 않는다.
※ 만약 IdentityFile옵션을 작성하지 않으면?
IdentityFile 옵션의 디폴트값은 ~/.ssh/id_rsa와 ~/.ssh/id_dsa이다.
따라서 IdentityFile을 작성하지 않은 후 .ssh의 개인 키 파일 이름을 id_rsa 혹은 id_dsa로 설정하면 Private 저장소에 정상적으로 접근이 가능하다.
SSH의 실제 사용
GitHub에서는 프로필 -> Settings -> SSH and GPG keys에서 SSH 키를 등록할 수 있다.
ssh-keygen -t ed25519 -C "주석(예를들면 이메일)"
위의 명령어를 통해 키를 생성할 수 있다.
생성을 완료하면 .ssh 디렉터리에 id_25519와 id_25519.pub 두 개의 파일이 생성된다.
id_ed25519는 개인 키가 있는 파일, 뒤에 .pub가 붙은 파일은 공개 키가 있는 파일이다.
GitHub -> Settings -> SSH and GPG Keys -> New SSH Key를 통해 SSH키를 등록할 수 있다.
이후 프로젝트에서 git clone 시
git clone git@<config에서 지정한 HostName>:사용자이름/프로젝트이름.git
위와 같이 사용하면 된다.
마무리
깃허브 비공개 저장소를 접근하는 방식을 이번에 처음 알게 되었다.
그전까지는 사실 깃허브를 많이 이용하지 않았고, 사용법도 잘 몰라서 로컬 환경에서만 프로젝트를 저장하고 이용해 왔었다.
하지만 깃허브 접근에 대한 조사를 진행하면서 깃허브에 대한 이해를 높일 수 있었고, 이제는 전보다 훨씬 편하게 깃허브를 이용할 수 있게 되었다.
게다가 SSH라는 것을 조사하면서 비공개 저장소에 접근하는 방법이 ssh키를 이용하는 방법, 토큰을 이용하는 방법 이 두 가지라는 것을 알게 되었다.
'GIT' 카테고리의 다른 글
[GIT] 깃(git)의 내부 데이터 구조: 블롭(blob), 트리(tree), 커밋(commit), 태그(tag) (0) | 2025.06.23 |
---|---|
[Git] 깃허브(GitHub) Private Repository 접근 방법2: Token (0) | 2025.03.26 |
[Git] 깃(Git)과 깃허브(GitHub)란? (0) | 2025.03.26 |