Security

SSH와 RSA 키 완벽 가이드: 키 쌍 생성, 활용, 보안 방법

SSH와 RSA 키 쌍에 대한 실용 가이드 — 작동 원리, 브라우저에서 생성하는 방법, 안전한 서버 접근 및 암호화에 활용하는 방법을 설명합니다.

7분 읽기

Security keys concept

공개 키 암호화는 안전한 인터넷 통신의 기반입니다. SSH 연결, HTTPS, JWT 서명, 암호화 이메일 모두 이 기술에 의존합니다. 키 쌍이 어떻게 작동하는지 이해하면 더 효율적인 개발자가 되고, 보안 의식도 한층 높아집니다.

핵심 개념: 공개 키와 개인 키

키 쌍은 수학적으로 연결된 두 개의 키로 구성됩니다:

  • 개인 키(Private key) — 내 컴퓨터에만 보관합니다. 절대 공유하지 마세요. 나의 신원 그 자체라고 생각하세요.
  • 공개 키(Public key) — 자유롭게 공유할 수 있습니다. 서버, GitHub, JWT 설정 등에 등록합니다.

수학적 원리는 단방향으로 작동합니다. 공개 키로 암호화된 데이터는 오직 해당 개인 키로만 복호화할 수 있습니다. 또한 개인 키로 서명된 데이터는 공개 키로 검증할 수 있으며, 이 과정에서 개인 키는 노출되지 않습니다.

SSH 키: 비밀번호 없는 서버 접근

SSH(Secure Shell)는 원격 서버 접근의 표준 방식입니다. 비밀번호 인증도 작동하지만 취약점이 있습니다. 비밀번호는 추측되거나, 피싱에 당하거나, 유출될 수 있습니다. SSH 키 인증은 근본적으로 더 강력합니다:

  1. 클라이언트가 개인 키를 이용해 암호화 증명을 제시합니다
  2. 서버는 등록된 공개 키를 바탕으로 해당 증명을 검증합니다
  3. 네트워크 상에서 비밀번호가 전송되지 않으므로 가로챌 것이 없습니다

SSH 키 인증 설정 방법:

# 키 쌍 생성 (Ed25519는 현재 권장되는 최신 표준)
ssh-keygen -t ed25519 -C "your-email@example.com"

# 서버에 공개 키 복사
ssh-copy-id user@yourserver.com

# 접속 — 비밀번호 필요 없음
ssh user@yourserver.com

공개 키는 서버의 ~/.ssh/authorized_keys에 저장됩니다. 개인 키는 절대 내 컴퓨터 밖으로 나가지 않습니다.

SSH용 Ed25519 vs RSA

Ed25519는 현재 권장되는 방식입니다:

  • 작은 키 크기(256비트)로 RSA-4096과 동등하거나 더 높은 보안 수준 제공
  • 빠른 서명 생성 및 검증 속도
  • 모든 최신 SSH 서버에서 지원

RSA는 특히 구형 시스템이 있는 기업 환경에서 여전히 널리 사용됩니다:

  • 현재 최소 허용 가능한 크기는 2048비트
  • 4096비트는 장기간 사용하는 키에 추가적인 안전 마진 제공
  • 키 크기가 클수록 인증 속도가 약간 느려짐

브라우저에서 SSH Key Generator를 사용해 SSH 키를 생성해보세요 — Ed25519와 ECDSA를 지원하며 Web Crypto API를 사용합니다. 키 데이터는 브라우저 밖으로 전송되지 않습니다.

RSA 키: 암호화와 서명

RSA 키는 SSH 이외에도 TLS 인증서, JWT 서명, 암호화 이메일(PGP), API 인증 등 다양한 용도로 활용됩니다.

주요 RSA 활용 사례:

RS256을 사용한 JWT(JSON Web Tokens):

  • RSA 개인 키로 토큰에 서명
  • 클라이언트는 공개 키로 검증
  • HS256(대칭 방식)과 달리 검증하는 쪽에서 서명 비밀키를 알 필요 없음

코드 서명:

  • 개인 키로 릴리스 아티팩트에 서명
  • 사용자는 공개된 공개 키로 서명 검증
  • 아티팩트가 본인으로부터 왔으며 변조되지 않았음을 증명

TLS/SSL 인증서:

  • 인증 기관(CA)이 자신의 개인 키로 공개 키에 서명
  • 브라우저는 CA의 공개 키(브라우저에 내장)를 사용해 검증

브라우저에서 RSA Key Generator를 사용해 PEM 형식의 RSA 키 쌍을 생성하세요 — 2048비트 또는 4096비트, 모두 브라우저 내에서 처리됩니다.

PEM 형식 설명

RSA와 SSH 키는 일반적으로 PEM(Privacy Enhanced Mail) 형식으로 배포됩니다:

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7o4qne60...
-----END PRIVATE KEY-----

헤더와 푸터는 키의 종류를 나타냅니다. 중간 부분은 base64로 인코딩된 키 데이터입니다. 헤더에 따라 키 종류가 구분됩니다:

  • BEGIN RSA PRIVATE KEY — 전통적인 PKCS#1 형식
  • BEGIN PRIVATE KEY — PKCS#8 형식 (최신 도구에서 더 일반적)
  • BEGIN PUBLIC KEY — PKCS#8 형식의 공개 키
  • BEGIN OPENSSH PRIVATE KEY — SSH 키를 위한 OpenSSH 전용 형식

개인 키 보호하기

개인 키 보안은 매우 중요합니다:

  1. 절대 git에 커밋하지 마세요.gitignore*.pem, id_rsa, id_ed25519를 추가하세요
  2. 패스프레이즈를 사용하세요 — 키를 저장 시 암호화합니다. 누군가 파일을 입수하더라도 패스프레이즈 없이는 사용할 수 없습니다
  3. 권한을 제한하세요 — SSH는 개인 키 파일에 chmod 600 설정을 요구하며, 다른 사용자가 읽을 수 있는 키는 사용을 거부합니다
  4. 유출 시 즉시 교체하세요 — 새 키 쌍을 생성하고 모든 서버에서 기존 공개 키를 제거하세요
# 개인 키의 권한을 올바르게 설정
chmod 600 ~/.ssh/id_ed25519

키 핑거프린트

핑거프린트는 전체 키를 비교하지 않고도 신원을 확인할 수 있는 공개 키의 짧은 해시값입니다:

ssh-keygen -lf ~/.ssh/id_ed25519.pub
# 출력: 256 SHA256:abc123... your-email@example.com (ED25519)

처음 서버에 접속할 때 SSH는 서버의 핑거프린트를 보여주고 확인을 요청합니다. 수락하기 전에 별도의 경로(서버 제공업체의 문서 등)를 통해 이 핑거프린트를 반드시 검증하세요.

요약

SSH와 RSA 키 쌍은 비밀번호보다 근본적으로 강력한 인증 및 암호화를 제공합니다. SSH에는 Ed25519를, 서명 및 암호화에는 RSA-4096을 사용하고, 항상 패스프레이즈로 개인 키를 보호하며, 키는 반드시 로컬에서 생성하세요. 제3자 서비스가 개인 키를 대신 생성하도록 허용해서는 안 됩니다.