대칭키는 하나의 키로 암호화와 복호화를 모두 처리하는 방식입니다.
속도가 빨라 실제 데이터 암호화에 적합하지만, 그 키를 상대에게 안전하게 공유해야 한다는 문제가 있습니다.
비대칭키는 공개 키와 개인 키 한쌍을 사용하는 방식입니다.
공개 키로 암호화하고 개인 키로 복호화하면 개인 키를 가진 대상만 열 수 있으므로 기밀성을 제공합니다.
개인 키로 서명하고 공개 키로 검증하면 그 개인 키의 소유자가 만든 것인지 확인하는 인증/서명 목적이 됩니다.
대칭키 암호화는 암호화와 복호화에 같은 비밀키를 사용하는 방식입니다. 연산 비용이 상대적으로 작아 많은 데이터를 암호화하기에 적합하지만, 통신 상대와 비밀키를 안전하게 공유해야 합니다.
비대칭키, 즉 공개키 암호 방식은 공개키와 개인키라는 한 쌍의 키를 사용하는 방식입니다. 공개키는 배포하고 개인키는 소유자만 보관합니다. 공개키 암호화에서는 수신자의 공개키로 암호화하고 수신자의 개인키로 복호화합니다. 공개키 기술은 전자서명이나 키 합의에도 사용되며, 용도에 따라 알고리즘과 연산이 다릅니다. MDN: 대칭키, MDN: 공개키
HTTPS에서는 공개키 기술로 상대를 인증하고 키를 안전하게 합의한 뒤, 실제 HTTP 데이터는 대칭키로 암호화하는 방식을 함께 사용합니다.
| 구분 | 대칭키 암호화 | 공개키 기술 |
|---|---|---|
| 키 | 공유하는 비밀키 | 공개키·개인키 쌍 |
| 주된 용도 | 대량 데이터 암호화 | 인증, 전자서명, 키 합의 또는 암호화 |
| 예시 | AES-GCM, ChaCha20-Poly1305 | RSA, ECDSA·EdDSA(서명), ECDHE(키 합의) |
| 핵심 주의점 | 비밀키의 안전한 공유·보관 | 공개키가 실제 상대의 것인지 검증 |
주요 꼬리질문
대칭키가 빠르다면 왜 비대칭키가 필요한가요?
처음 통신하는 상대와는 공유한 비밀키가 없기 때문입니다. 비밀키를 평문으로 보내면 도청될 수 있습니다. 공개키 기술을 이용해 상대를 인증하고 공유 비밀을 합의한 뒤, 효율적인 대칭키 암호화로 데이터를 전송합니다.
비대칭키로 모든 데이터를 암호화하면 안 되나요?
공개키 암호화는 일반적으로 연산 비용이 크고 처리 가능한 데이터 크기에도 제약이 있어 대량 데이터 전송에 비효율적입니다. 따라서 키 설정과 실제 데이터 보호의 역할을 나누는 하이브리드 방식을 사용합니다.
개인키로 암호화하고 공개키로 복호화하는 것이 전자서명인가요?
그렇게 일반화하면 부정확합니다. 전자서명은 개인키로 메시지에 대한 서명을 생성하고 공개키로 검증하는 별도 연산입니다. 암호화는 기밀성, 서명은 무결성과 서명자 인증이 목적입니다. 공개키를 가진 누구나 검증할 수 있으므로 서명만으로 내용이 숨겨지지는 않습니다. ECDSA처럼 암호화 용도가 아닌 서명 알고리즘도 있습니다.
공개키가 공개되어 있어도 안전한 이유는 무엇인가요?
적절한 알고리즘과 키 길이를 사용하면 공개키로부터 개인키를 계산하는 것이 현실적으로 어렵기 때문입니다. 다만 공격자가 자신의 공개키를 서버의 공개키인 것처럼 전달하는 문제는 별개이므로, 인증서와 신뢰 체인을 통해 공개키의 주인을 확인해야 합니다.
HTTPS는 대칭키를 서버 공개키로 암호화해서 전달하나요?
과거 TLS의 RSA 키 전송 방식에서는 클라이언트가 만든 premaster secret을 서버 공개키로 암호화해 전달했습니다. 하지만 TLS 1.3에서는 이 RSA 키 전송 방식을 사용하지 않습니다. 일반적인 인증서 기반 연결에서는 (EC)DHE로 공유 비밀을 합의하고 트래픽 키를 파생합니다. RSA 인증서도 서명 용도로는 사용할 수 있습니다. RFC 8446 §1.2
ECDHE는 비밀키를 보내지 않고 어떻게 같은 키를 만드나요?
양쪽이 각자의 임시 개인값과 교환한 공개값을 이용해 같은 공유 비밀을 계산합니다. 공유 비밀 자체를 네트워크로 전송하지 않으며, TLS는 이를 입력으로 암호화에 필요한 키를 파생합니다. 키 합의만으로는 상대의 신원이 확인되지 않으므로 인증 과정도 필요합니다.
암호화와 해시는 어떻게 다른가요? 비밀번호도 AES로 저장하나요?
암호화는 키를 이용해 원문을 복원하지만, 해시는 원문 복원을 목적으로 하지 않는 단방향 연산입니다. 비밀번호 검증에는 사용자별 salt와 bcrypt·scrypt·Argon2 같은 비밀번호 해시를 사용합니다. Spring Security에서는
PasswordEncoder와 연결해 공부할 수 있습니다. 자세한 내용은 비밀번호는 어떻게 안전하게 저장해야 하나요를 참고합니다.
함께 복습하기
- HTTPS란 무엇이며 동작 과정에 대해 설명해주세요
- JWT의 정의와 구조에 대해 설명해주세요: 서명된 JWT의 payload가 암호화된 것은 아니라는 점과 연결하기