git과 ssh/https의 관계

git은 사실상 표준이 되었고, 요즘 git 없이 개발을 하는 건 사실상 불가능합니다. 그런데 git에서 왜 ssh나 https가 나오는지 모르는 사람이 많더라고요. 그래서 이번 글에서는 git과 ssh, https의 관계에 대해서 알아보겠습니다.

git은 소스 코드 관리 도구입니다. 형상은 여기서 중요하지 않기 때문에 제외했습니다. 소스 코드를 한 컴퓨터에서 관리한다면 ssh나 https가 필요 없었을 겁니다. 그런데 소스 코드를 깃허브 같은 데에다가 올리잖아요? 서버에 접속하는 과정에서 안전하게 데이터를 전송할 방법이 필요합니다. 그 과정에서 ssh나 https가 사용됩니다. ssh와 https 모두 보안적으로 좋고, 사용자 인증 메커니즘이 있거든요. https에 무슨 인증이 있냐고 물으실 수도 있는데 BASIC 인증이라는 게 있습니다. 요즘은 OAuth 등에 밀려서 일반적인 웹사이트에서는 잘 안 쓰이지만요.


git 레포지토리는 url일 필요가 없습니다. 흔하게 쓰이진 않지만, 일반적인 폴더를 remote로 사용하는 것도 가능합니다. 두 폴더간에 git 데이터를 주고받을 방법만 있다면 그게 같은 컴퓨터에 있든 다른 컴퓨터에 있든 remote로 사용할 수 있다는 소리입니다. 그리고 다른 컴퓨터에 있을 때 사용되는 방법이 바로 ssh와 https입니다.

https로 데이터를 주고받는 건 간단하니 설명하지 않겠습니다. ssh 같은 경우 url이 git@github.com:github/fetch.git처럼 생겼는데요, 원래는 <username>@<host>:<path/in/server>입니다. ssh로 <host><username> 계정으로 접속하고 <path/in/server>에 있는 깃 레포지토리 폴더를 사용하는 것이죠. 물론 성능과 보안을 위해 두 컴퓨터의 git이 각각 서버와 클라이언트로 작동하지만요.


git이 ssh와 https를 어떻게 사용하는지 설명했으니 이제 깃허브를 예로 들어 둘의 차이를 알아보겠습니다.

깃허브 https

위의 사진은 깃허브의 프로젝트인 fetch에서 Code 버튼을 눌렀을 떄 나온 화면입니다. 그런데 보시면 https와 ssh중에서 선택하실 수 있습니다. ssh를 선택하면 아래와 같은 화면이 나옵니다.

깃허브 ssh

이미 구성이 잘 되어있다면 ssh를 쓰냐 https를 쓰냐는 차이가 없을 수도 있는데요, 처음엔 동작이 약간 다릅니다. 위에서 언급한 사용자 인증 때문인데요, 실제로 해보면서 어떤 차이가 있는지 보여드리겠습니다.

체크아웃 할 때 로그인이 필요한 private 레포지토리를 만드신 뒤, https url으로 클론하시면

깃허브 로그인 창

이러한 창이 뜹니다. https의 BASIC 인증이 뭔지 알고 계시는 분들한테는 신기한 화면일 겁니다. BASIC 인증은 원래 아이디/비밀번호 인증이니까요. 보안상의 이유로 깃허브는 아이디/비밀번호 인증으로 git을 사용하는 걸 허용하지 않고, 그 대신 git의 credential helper 기능을 이용해서 토큰 기반 인증방식을 사용합니다. 옛날엔 https url로 클론하면 터미널에서 매번 아이디와 비밀번호를 물어봤는데, 그러면 보안상 문제가 되니까 개선한겁니다.

화면에 나온 Sign in with your browser을 클릭하면 git을 위한 https 인증 설정이 끝납니다. git 명령어를 실행시킨 사람을 인증하기 위한 정보를 브라우저를 통해 얻고, 그걸 저장해두는 것입니다. 저장해두는이 중요한데요, 한번만 해놓으시면 다음부터는 자동으로 인증이 됩니다.

ssh의 경우 ssh-keygen으로 키를 생성하고, 깃허브에 공개 키를 등록하는 게 필수입니다. 키를 등록하지 않고 ssh url로 클론하면 실패합니다. https와는 달리, 안내를 위한 창을 띄워주거나 그러지 않고 에러 메시지로 설명해줍니다.