SSH를 이용한 GitHub 인증 과정 정리

GitHub에서 레포지토리를 클론(clone)하는 방법에는 세 가지가 있다:

  • HTTPS
  • SSH
  • GitHub CLI

오늘은 이 중에서 SSH를 활용한 인증 과정과 보안 개념을 정리해보겠다.

SSH란 무엇인가?

SSH(Secure Shell)는 원격 시스템과 안전하게 통신할 수 있도록 하는 네트워크 프로토콜이다. 기존의 Telnet, FTP 같은 프로토콜은 데이터를 암호화하지 않고 전송하기 때문에 보안에 취약했지만, SSH는 비대칭 암호화(Public-Key Cryptography) 방식을 사용하여 보안을 강화한다.

공개 키 & 개인 키 기반 인증 방식

SSH의 가장 큰 특징은 공개 키(Public Key)와 개인 키(Private Key) 기반의 인증 방식이다. 이 방식은 비대칭 암호화를 활용하여, 두 개의 키가 한 쌍을 이루어 보다 안전한 인증을 가능하게 한다.

비대칭 암호화란?

비대칭 암호화는 두 개의 키(공개 키, 개인 키)를 사용하여 데이터를 암호화하고 복호화하는 방식이다.

  • 공개 키 (Public Key): 누구나 접근 가능하며, 서버(GitHub 등)에 저장됨. 개인 키로 암호화된 데이터를 복호화할 수 있음.
  • 개인 키 (Private Key): 로컬(클라이언트)에서만 보관해야 하는 키로, 절대 외부에 유출되면 안 됨. 공개 키로 암호화된 데이터를 복호화할 수 있음.

SSH 인증 과정의 흐름

SSH를 이용해 GitHub과 같은 원격 서버에 접속할 때, 다음과 같은 과정이 수행된다.

  1. 클라이언트가 SSH 연결 요청 (git clone 또는 ssh -T git@github.com)
  2. GitHub이 “너의 신원을 확인하려면 개인 키로 서명해서 돌려줘” 요청
  3. 클라이언트가 개인 키(Private Key)로 요청을 암호화(서명)하여 전송
  4. GitHub은 미리 등록한 공개 키(Public Key)로 검증하여 인증 성공 여부 판단

개인 키를 직접 전송하는 것이 아니라, 서명(Signature)된 데이터만 전송하기 때문에 보안이 유지됨.

Fingerprint의 역할

SSH 연결 시 서버의 공개 키(Public Key)를 검증하는 과정이 필요하다. 이때 사용하는 것이 Fingerprint이다.

Fingerprint란?

Fingerprint은 서버의 공개 키(Public Key)의 해시값(요약된 형태)
• 클라이언트는 서버의 공개 키를 받아 이를 known_hosts 파일에 저장해둠
• 이후 동일한 서버에 접속할 때, 이 Fingerprint와 비교하여 신뢰할 수 있는 서버인지 확인

Fingerprint가 저장되면?

  1. 처음 SSH 연결 시 Fingerprint를 ~/.ssh/known_hosts에 저장
  2. 이후 같은 서버에 접속할 때 Fingerprint를 자동으로 비교
  3. Fingerprint이 일치하면 과거 유저가 신뢰했던 서버로 판단하고 서버 검증 단계를 생략한 채 SSH 인증을 진행한다.

실습 예제

SSH 키 생성하기

ssh-keygen -t ed25519 -C "your_email@example.com"
  • ~/.ssh/id_ed25519 → 개인 키
  • ~/.ssh/id_ed25519.pub → 공개 키

GitHub에 공개 키 등록하기

  1. GitHub → Settings → SSH and GPG keys → New SSH key
  2. id_ed25519.pub 내용을 복사하여 붙여넣기
  3. 저장 후 테스트
ssh -T git@github.com

SSH 인증 과정 실습

서버가 랜덤 데이터를 생성하여 클라이언트에 보냄

  • 서버가 클라이언트에게 Random 데이터(Nonce, 1회용 난수)를 보냄

    서버 → 클라이언트: 이걸 개인 키로 암호화해서 나에게 돌려줘!

클라이언트가 개인 키로 서명하여 응답

  • 클라이언트는 Random 데이터를 개인 키(Private Key)를 이용해 암호화(서명)함
  • 서명한 데이터를 다시 서버로 전송

    클라이언트 → 서버: 자 너가 준 Random 데이터를 암호화했어!

서버가 공개 키로 검증

  • 서버는 클라이언트가 보낸 서명된 데이터를 공개 키(Public Key)로 복호화
  • 복호화된 결과가 서버가 처음 보냈던 Random 데이터와 일치하면 인증 성공

    서버: 암호화되어 돌아온 데이터를 다시 복호화 해보니 내가 처음 보냈던 Random 데이터군! 인증 성공!

보안적 고려사항

SSH를 사용할 때 가장 중요한 보안 요소는 개인 키(Private Key)의 보안 유지이다.

공개 키는 노출되어도 안전한 이유

  • 공개 키(Public Key)는 원래 누구나 볼 수 있도록 설계됨
  • 개인 키(Private Key) 없이 공개 키만으로는 인증 불가능

개인 키(Private Key)가 유출되면?

  • 유출되면 공격자가 내 SSH 계정으로 로그인할 수 있음
  • 이를 방지하기 위해 Passphrase(비밀번호) 설정이 권장됨

결론

  • SSH는 비대칭 암호화 기반 인증을 사용하여 보안성을 높이며, Fingerprint를 활용해 인증 과정을 간소화한다.
  • 클라이언트의 개인 키로 서명하고 서버의 공개 키로 검증하는 과정이 SSH 인증의 핵심이다.

추가 정보

  • Fingerprint는 서버의 공개키를 해시화한 값이고 이는 단방향 작업이기에 Fingerprint를 통해 공개 키를 알 수는 없다.
  • Fingerprint가 일치하더라도 이는 과거 유저가 신뢰하는 서버라고 했다는 걸 의미할 뿐, SSH 인증 과정은 여전히 진행된다.