SSH (Secure Shell), 쉘 프로토콜
앞의 설명에서 우린 Github에서 만든 레포지터리에서 제공해주는 주소가 두 종류라는 것을 알았다
https주소, ssh주소
이 주소를 사용하는 각자의 프로토콜들은(https 프로토콜, ssh 프로토콜) 인터넷 인프라 위에서 저마다의 역할을 가지고 운영되고 있는 통신방식이다(다른 말로 프로토콜).
보통 인터넷이라는 이 거대한 망에 무언가 새로운 목적이나 역할이 추가로 생기면, 그에 맞춰서 만들어지고 활성화되는 게 그 새로운 역할에 부합하는 프로토콜들이다. (사실 프로토콜은 매우 많이 정의되지만 그 중 일부만 많은 쓰임을 받는다)
이런 시각에서 ssh는 https 와는 다른 목적의 프로토콜이다. 이는 보안 기능이 강화된 쉘 프로토콜이라고 말할 수 있다.
쉘이란 윈도우의 cmd 창에서처럼 각종 커맨드를 이용해 OS와 대화를 할 수 있게 해주는 텍스트 인터페이스라고 보면 된다.(터미널이라는 단어도 이와 비슷하다, 쉘을 구동하는 프로그램 정도로 쓰인다.)

그런데 ssh는 일반 쉘이 아니라 쉘 프로토콜이다.
이것은 사용자가 OS와 대화하는 것이 아니라, ssh 프로토콜을 사용하는 Client가 ssh 프로토콜을 사용하는 server와 대화하는데 쓰이는 것이다.
대화를 통한 대상의 제어의 목적이 강하지만 이 프로토콜을 이용해서 데이터를 주고받는 규약도 포함되어 있다. 우리가 Github에 파일을 보낼때 이를 활용하는 것이다.
HTTP와 SSH의 차이
https는 ssh처럼 대화와 제어를 목적으로 하는 프로토콜은 아닐 것이다.
굳이 http의 대표 기능을 꼽으라면 그건 웹페이지를 배포하는 역할을 하는 프로토콜이라고 보면 된다.
http 서버에는 .html과 .css 등의 웹문서가 있거나, 이런 웹 페이지들을 그때그때 상황에 맞게 만들어 줄 수있는 환경이 마련되어 있다. 사실 이 웹 페이지가 사람이 당장 볼수 있을 만큼 완성되어있는 것은 아니다.
서버측의 이 문서들은 <html>, <head>, <body> 등의 태그등 다양한 방법을 통해, 문서의 어디에 어떤 문자열이 와야 하고 어디엔 어떤 그림이 와야하는지 설명해주는 일종의 청사진이다.
실제 웹페이지가 사람이 볼만큼 이쁘게 구현되는 장소는 클라이언트측 PC의 웹브라우저이다. (크롬, 파이어폭스, 엣지 등) 브라우저는 서버로부터 이 청사진을 받아 문서를 시각화 해준다
이렇게 문서의 청사진들을 읽고 쓰는 문법들(HTTP, CSS 등), 그리고 그 문서들을 주고 받는 서버와 클라이언트의 행동들에 대한 일부 약속들이 바로 http 프로토콜이다.
그래서 우리의 브라우저는 http와 매우 깊은 관련이 있다.
하지만 두 프로토콜은 결국 똑같은 라우터와 스위치로 구성된 인터넷 망을 사용한다는 점에서 완전히 다른 무엇은 아니다. (걷보기엔 매우 달라 보이지만)

암호화 통신과 키
ssh를 사용하기 위해 ssh클라이언트와 ssh서버간의 통신에는 보안을 위해 종종 수학적 암호화 과정이 추가될 수 있다
우리 로컬PC의 git 프로그램과 github이 서로 상호작용 할 때도 소스코드라는 의미 있는 정보가 왔다갔다 하기 때문에 당연히 암호화 절차를 요구하고 있다.
특히 우리 로컬 PC의 Git bash가 Github서버와 ssh링크를 확립하려면 이 암호화 과정에 쓰이게 될 두 개의 암호화 키를 생성해서 등록할 필요가 있다.
암호화 키라고 해서 뭔가 대단한 게 아니라 그냥 좀 긴 문자열이다 (실은 긴 숫자다)
git bash상에서 어떤 명령어 하나만 툭 치면은 뭔가 “쀏뀋쒻뚧..” 해 보이는 두 개의 문자열이 각자 두 개의 파일로 저장되는데 그게 생성된 키다.

생긴 모양이 약간 이런 느낌이다. 진짜 키값은 아니다. 두 개의 키 중 하나는 public key라고 불리고 하나는 private key라고 불리는데 사실 ssh통신에서의 public key는 키라기 보단, 그 역할이 자물쇠에 가깝다.
키는 자기 손에 꼭 쥐고서 어디 누구한테 안 뺏겨야 하고 숨겨놔야 하지만, 그 키와 짝을 이루는 자물쇠는 솔직히 해당하는 키가 없으면 아무 쓸모가 없기 때문에 많이 만들어서 여기저기 뿌리고 다녀도 별 상관은 없기 때문이다.
- private key 만들어지는 시점부터 어디 다른데 노출되면 안 되는 크리티컬 한 정보다. 자신의 git 프로그램에 등록한다.
- public key 비교적 노출돼도 문제가 되지 않기 때문에 인터넷망을 이용해 ssh server에 전달하고 그곳에 등록해 둔다.
아래 그림에서 열쇠는 private key를 의미하고 자물쇠는 public key를 의미한다. ssh통신은 대충 이렇게 이루어진다.

이처럼 ssh암호화 통신에 있어 public key와 private key가 필요하다.
이제 ssh 설정을 해보자.
Github에서의 ssh 설정

저번 설명에서 만든 github 레포지터리에는 이미 우리 게 할당된 주소가 보일 것이다. 그중 SSH의 주소를 확인해서 복사한다. (주소 칸 오른쪽에 복사 버튼 있다.)
내 로컬 PC의 MyBlog 폴더에선 git init 명령을 사용해서 .git폴더가 만들어지는 걸 확인했다.

이 로컬 폴더 Myblog의 repository가 해당 주소에 있음을 정의해준다.
- 로컬 작업 환경에서 레포지터리 정보 등록 하기 : git remote add ( 레포지터리 이름 ) ( ssh 주소 또는 https 주소 )
- 예제 : git remote add origin git@github.com:gadeokexp/Myblog_Acknowledge.git

참고로 레포지터리 이름 origin은 그냥 아무거나 작명하면 된다. 내 PC 환경에서만 쓰이는 레포지터리의 이름이다.
add가 ‘추가하다’ ‘origin’이 그 기원이니까 의미가 명료해 보이긴 한다.
앞으로 이 레포지터리에 내 작업을 올릴 때(push) 작업을 업로드하는 사람이 나뿐만이 아닐 수 있다.
그래서 각자의 작업에는 내가 했다는 꼬리표를 붙여야 한다. 이때 사용하기 위해서 내 email 정보를 설정해 두자.
요즘 버전 git은 이거 설정 안 하면 뭐가 안되더라.
- 협업을 위한 사용자 정보 등록 : git config –global user.email “이메일 주소”
- 예제 : git config –global user.email “xxxxx@xxxxxx.com”

이제 키를 생성하기에 앞서 우선 생성된 키가 있는지 확인해보겠다. 이런 작업이 처음이라면 당연히 없겠지만..
- 예제 : ls -al ~/.ssh

화면상에 known_host라는 파일만 보이는데 만들어진 키가 있다면 아래와 같은 파일들이 보일지 모른다.
- id_rsa.pub
- id_ecdsa.pub
- id_ed25519.pub
이런 파일이 없는 걸 확인했으니 키를 만들자
- ssh 통신용 키 생성 : ssh-keygen -t ( 암호화 방식 ) -C “이 키가 만들어질 때 들어갈 내 메일 주소”
- 예제 : ssh-keygen -t ed25519 -C “xxxx@xxxxxx.com”
여기에 들어가는 이메일 주소는 내가 github 계정 만들 때 사용했던 이메일 주소를 써야 한다. ed25519는 사용하는 암호 알고리즘의 이름이다.

명령을 치고 나면 만들어진 키를 담을 파일명을 무엇으로 할 거냐는 등의 질문을 받게 되는데 그냥 엔터를 치면 기본값으로 설정된다. 모두 엔터를 쳐서 명령이 실행되는 걸 마무리 하자. 그리고 나면 메시지에는 두 개의 파일이 만들어졌다는 말이 나온다. (id_ed25519, id_ed25519.pub) 메시지상에 보이는 경로를 따라가서 파일을 열어보면 그 “뿗쀏쓓..”들이 보인다.
이제 내 로컬 환경에 내 ssh private key를 등록하자. 등록하기 전에 이 키를 받아서 관리하게 될 프로세서가 잘 돌고 있는지 확인하자.
- 예제 : ssh-agent -s

pid라는 게 보이면 잘 돌고 있는 것이다. 이는 리눅스 방식의 쉘 명령어들인데 지금 우리가 쓰는 프로그램인 Bash-shell에서 그 형식을 그대로 차용한 채로 윈도우 상에서 돌아가고 있을 뿐이다. 따라서 명령어 자체는 그냥 그런가 보다 하고 넘어가면 된다.
방금 만든 두 개의 파일 중 확장자 pub가 붙은 게 public key고 안 붙은 게 private key이다. private key를 등록하자
참고로 파일 경로에 ~라는 표시는 사용자에게 할당된, 사용자 폴더를 의미한다 여기선 (C:\user\gadeo\) 이 파일 경로에 우리가 만든 키 파일이 있다.
- 로컬 환경에 ssh private key 등록 : ssh-add ( private key 파일 경로 )
- 예제 : ssh-add ~/.ssh/id_ed25519

이제 Github에 public key를 등록해보자. 퍼블릭 키가 있는 경로에 가서 해당하는 문자열을 Ctrl + A -> Ctrl + C로 복사한다.

Github 사이트에 들어가 로그인한 뒤 우측 상단 클릭 -> Settings

화면 왼쪽 메뉴에 SSH and GPG keys 클릭


키 항목에 Ctrl + v를 이용해서 저장해둔 public key값을 등록, Title로는 “my first ssh key” 정도 기입하면 된다.

이제 Add SSH key버튼을 누르고 확인을 위해 내 Github 패스워드를 한번 넣어주면 모든 설정이 완료된다.
- ssh 링크 설정 되었는지 테스트 : ssh -T ( 대상 서버 주소 )
- 예제 : ssh -T git@github.com

로컬 PC에서 해당 명령어를 쳤을 때 “성공적으로 인증받았습니다”라고 나오면 연결이 완료된 것이다.