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과 같은 원격 서버에 접속할 때, 다음과 같은 과정이 수행된다.
- 클라이언트가 SSH 연결 요청 (
git clone
또는ssh -T git@github.com
) - GitHub이 “너의 신원을 확인하려면 개인 키로 서명해서 돌려줘” 요청
- 클라이언트가 개인 키(Private Key)로 요청을 암호화(서명)하여 전송
- GitHub은 미리 등록한 공개 키(Public Key)로 검증하여 인증 성공 여부 판단
개인 키를 직접 전송하는 것이 아니라, 서명(Signature)된 데이터만 전송하기 때문에 보안이 유지됨.
Fingerprint의 역할
SSH 연결 시 서버의 공개 키(Public Key)를 검증하는 과정이 필요하다. 이때 사용하는 것이 Fingerprint이다.
Fingerprint란?
• Fingerprint은 서버의 공개 키(Public Key)의 해시값(요약된 형태)
• 클라이언트는 서버의 공개 키를 받아 이를 known_hosts
파일에 저장해둠
• 이후 동일한 서버에 접속할 때, 이 Fingerprint와 비교하여 신뢰할 수 있는 서버인지 확인
Fingerprint가 저장되면?
- 처음 SSH 연결 시 Fingerprint를
~/.ssh/known_hosts
에 저장 - 이후 같은 서버에 접속할 때 Fingerprint를 자동으로 비교
- Fingerprint이 일치하면 과거 유저가 신뢰했던 서버로 판단하고 서버 검증 단계를 생략한 채 SSH 인증을 진행한다.
실습 예제
SSH 키 생성하기
ssh-keygen -t ed25519 -C "your_email@example.com"
~/.ssh/id_ed25519
→ 개인 키~/.ssh/id_ed25519.pub
→ 공개 키
GitHub에 공개 키 등록하기
- GitHub → Settings → SSH and GPG keys → New SSH key
id_ed25519.pub
내용을 복사하여 붙여넣기- 저장 후 테스트
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 인증 과정은 여전히 진행된다.