# 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](https://images.alliknow.info/images/a5f6a235-5ed0-46d2-86e9-bd430cf89c5c)

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

![깃허브 ssh](https://images.alliknow.info/images/dacc4156-3b52-4280-ab55-40f5ed850bf1)

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

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

![깃허브 로그인 창](https://images.alliknow.info/images/a7353e97-6e01-452c-b836-abfe30ddde19)

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

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

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

