공개키 암호화(비대칭 암호화라고도 함)는 SSL/TLS의 기반입니다. 수학적으로 연결된 한 쌍의 키 — 공개키와 개인키 — 를 사용하여 데이터를 암호화하고, 신원을 검증하고, 보안 연결을 설정합니다. 모든 HTTPS 연결이 이에 의존합니다.
키 쌍 개념
| 공개키 | 개인키 | |
|---|---|---|
| 보유자 | 모든 사람 (인증서에 포함) | 서버 소유자만 |
| 암호화 가능 | ✅ | ✅ |
| 복호화 가능 | 개인키로 암호화된 것만 | 공개키로 암호화된 것만 |
| 공유 여부 | 예 — 그것이 목적 | 절대 안 됨 |
핵심: 공개키로 암호화된 데이터는 일치하는 개인키로만 복호화할 수 있습니다. 그 반대도 마찬가지입니다. 두 키는 수학적으로 연결되어 있지만, 공개키로부터 개인키를 유도할 수 없습니다.
SSL/TLS에서의 사용
공개키 암호화는 모든 HTTPS 연결에서 세 가지 목적을 가집니다:
1. 키 교환 — 공유 비밀 설정
TLS 핸드셰이크 중에 서버와 브라우저는 트래픽 암호화를 위한 공유 세션 키에 합의해야 합니다. 이 키를 평문으로 전송할 수 없습니다 — 누군가 가로챌 수 있으니까요.
해결책: Diffie-Hellman 키 교환(구체적으로 최신 TLS의 ECDHE). 양쪽이 임의 값을 기여하고, 수학을 통해 실제로 전송하지 않고도 동일한 공유 비밀을 계산할 수 있습니다. 서버의 개인키가 서버의 기여분에 서명하여 서버 신원을 증명합니다.
2. 인증 — 신원 증명
서버의 SSL 인증서에는 공개키가 포함되어 있습니다. 인증서는 인증 기관에 의해 서명됩니다. 핸드셰이크 중 서버는 일치하는 개인키를 보유하고 있음을 증명합니다. 이를 통해 서버가 인증서에 명시된 대로의 서버임을 증명합니다.
이 단계 없이는 누구나 google.com이라고 주장할 수 있습니다.
3. 디지털 서명 — 데이터 무결성 증명
개인키는 디지털 서명을 생성할 수 있습니다 — 특정 데이터가 키 보유자에 의해 서명되었고 변조되지 않았다는 수학적 증명입니다. TLS 핸드셰이크 메시지는 변조를 방지하기 위해 서명됩니다.
대칭 vs 비대칭 암호화
| 비대칭 (공개키) | 대칭 (세션 키) | |
|---|---|---|
| 키 | 두 개 (공개 + 개인) | 하나 (공유 비밀) |
| 속도 | 느림 (약 1000배 느림) | 빠름 |
| 용도 | 키 교환 + 인증 | 실제 데이터 암호화 |
| 알고리즘 | RSA, ECDSA, ECDHE | AES-GCM, ChaCha20 |
| TLS에서 | 핸드셰이크 중에만 | 핸드셰이크 후 (모든 트래픽) |
HTTPS는 양쪽 모두를 사용합니다: 핸드셰이크에서 비대칭 암호화(신원 증명, 키 교환), 그 후 실제 데이터 전송에서 대칭 암호화(훨씬 빠르므로).
SSL 뒤의 알고리즘
RSA
여전히 사용 중인 가장 오래된 공개키 알고리즘(1977년). 큰 소수의 인수분해 난이도에 기반합니다. 서명과 키 교환 모두에 사용되지만, RSA 키 교환(Diffie-Hellman 없이)은 순방향 비밀성을 제공하지 않으며 TLS 1.3에서 제거되었습니다.
ECDSA (타원 곡선 디지털 서명 알고리즘)
타원 곡선 수학을 사용하는 최신 서명 알고리즘. 256비트 ECC 키는 3072비트 RSA 키와 동등한 보안을 제공합니다 — 더 작은 키, 더 빠른 서명. GetHTTPS는 기본적으로 ECDSA P-256을 사용합니다.
ECDHE (임시 타원 곡선 Diffie-Hellman)
최신 TLS에서 사용되는 키 교환 메커니즘. “임시”는 모든 연결에 대해 새 키 쌍이 생성됨을 의미합니다 — 순방향 비밀성을 제공합니다. TLS 1.2와 1.3 모두에서 사용됩니다.
AES-GCM
핸드셰이크 후 실제 트래픽을 암호화하는 대칭 암호화. AES(Advanced Encryption Standard)와 GCM(Galois/Counter Mode)은 암호화와 인증을 모두 제공합니다. 최신 CPU에서 AES-NI 명령어를 통해 하드웨어 가속됩니다.
GetHTTPS에서 공개키 암호화의 사용
GetHTTPS를 사용할 때:
- 브라우저가 Web Crypto API를 사용하여 키 쌍을 생성합니다 — TLS 자체가 사용하는 것과 동일한 암호화 기본 요소
- 공개키가 Let’s Encrypt에 보내는 CSR에 들어갑니다
- 개인키는 브라우저 메모리에 남아 있습니다 — 전송되지 않음
- Let’s Encrypt가 공개키에 서명하고 인증서를 반환합니다
- 인증서(공개)와 개인키를 서버에 다운로드합니다
개인키가 브라우저 메모리에만 존재하는 것이 원격 서버에서 키를 생성하는 도구보다 GetHTTPS가 더 프라이버시를 보호하는 이유입니다.
자주 묻는 질문
양자 컴퓨터가 공개키 암호화를 깨뜨릴 수 있나요?
현재 양자 컴퓨터로는 불가능합니다. 하지만 충분히 강력한 양자 컴퓨터가 쇼어 알고리즘을 실행하면 RSA와 ECC를 깨뜨릴 수 있습니다. 업계는 양자 공격에 내성이 있는 새 알고리즘(ML-KEM, ML-DSA)을 갖춘 후양자 암호화를 준비하고 있습니다. TLS는 인증서 작동 방식을 변경하지 않고 하이브리드 모드(고전 + 후양자)로 이를 채택할 것입니다.
비대칭 암호화만 모든 곳에 사용하면 안 되나요?
속도 때문입니다. 비대칭 연산은 대칭보다 약 1000배 느립니다. RSA로 웹페이지를 암호화하면 비현실적으로 느릴 것입니다. 대신 TLS는 핸드셰이크에서만 비대칭 암호화를 사용하고(약 1ms), 데이터에는 대칭(AES)으로 전환합니다 — 하드웨어 속도로 실행됩니다.
256비트 ECC 키가 정말 충분히 안전한가요?
256비트 ECC는 약 128비트의 보안을 제공합니다 — 공격자가 이를 깨뜨리려면 약 2^128 연산이 필요합니다. 이는 관측 가능한 우주의 원자 수보다 많은 연산입니다. 양자 컴퓨터를 제외하면 예측 가능한 미래에 안전합니다(양자 컴퓨터는 완전히 다른 알고리즘을 필요로 합니다).
암호화와 서명의 차이점은?
암호화: 기밀성 보호. 수신자의 공개키로 암호화 → 그들의 개인키만 복호화 가능. 서명: 진위 증명. 자신의 개인키로 서명 → 공개키를 가진 누구나 자신이 보낸 것이며 변조되지 않았음을 검증 가능. TLS 인증서는 서명을 사용하고, TLS 데이터 전송은 암호화를 사용합니다.