인터넷 환경에서 대칭키 암호화 방식의 한계
인터넷이 우리 삶의 필수적인 부분이 되면서, 온라인 상의 정보 보안은 그 어느 때보다 중요했다. 특히, 민감한 정보를 안전하게 주고받기 위한 암호 기술의 역할은 막대하다. 가장 기본적인 암호화 방식 중 하나인 대칭키 암호화는 하나의 키로 암호화와 복호화를 모두 수행하는 특징을 가진다. 이는 연산 속도가 빠르고 효율적이라는 장점을 가지고 있다.
대칭키 = 정보
그러나 대칭키 방식은 인터넷 환경에서 심각한 문제에 직면한다. 암호화된 정보를 복호화하기 위해서는 송신자와 수신자가 동일한 대칭키를 공유해야 한다. 문제는 바로 이 “키”를 안전하게 전달하는 방법이다.
- 키 자체도 정보: 대칭키는 기밀성을 유지해야 하는 중요한 정보이다.
- 안전한 키 전달의 어려움: PC가 서버와 비밀 통신을 원할 때, 인터넷이라는 공개된 네트워크를 통해 대칭키를 안전하게 전달할 마땅한 방법이 없다. 물리적으로 USB 등을 통해 키를 전달하는 것은 비현실적이며, 네크워크를 통해 전달할 경우 중간에 탈취될 위험이 있다.
이러한 이유로 대칭키 암호화는 효율적이지만, 인터넷과 같은 공개된 환경에서는 직접적인 비밀 통신 수단으로 부적절하다
비대칭키 암호화 방식의 등장
대칭키 방식의 한계를 극복하기 위해 등장한 것이 바로 비대칭키 암호화 방식이다. 비대칭키 방식은 ‘키 쌍(Key Pair)’이라는 개념을 도입한다. 이 키 쌍은 다음과 같이 구성된다
- 공개키 (Public Key): 외부에 공개해도 안전한 키이다. 주로 암호화에 사용된다
- 개인키 (Private Key): 사용자 본인만 소유하고 외부에 절대 공개하지 않는 키이다. 주로 복호화에 사용된다
이 방식의 핵심 원리는 다음과 같다
- 키 쌍 생성: 통신하려는 PC와 서버는 각자 공개키와 개인키를 생성한다
- 공개키 교환: PC는 서버의 공개키를, 서버는 PC의 공개키를 인터넷을 통해 교환한다. 공개키는 공개되어도 안전하므로 이 과정에서 보안 문제는 발생하지 않는다
- 암호화 및 복호화
- PC가 서버에게 암호화된 정보를 보낼 때는, 서버의 공개키로 정보를 암호화한다
- 서버는 자신의 개인키로 암호화된 정보를 복호화하여 평문을 얻는다
- 반대로 서버가 PC에게 암호화된 정보를 보낼 때는, PC의 공개키로 정보를 암호화한다
- PC는 자신의 개인키로 암호화된 정보를 복호화하여 평문을 얻는다
이러한 과정을 통해 PC와 서버 간에 비밀 통신 채널(터널)이 형성되며. 이를 보안 세션(Secure Session)이라고 부른다. 이 터널을 통해 전송되는 암호문은 오직 해당 개인키를 가진 당사자만이 복호화할 수 있다
비대칭키 암호화의 고려 사항
- 키 생성 시간: 비대칭키 쌍을 생성하는 과정은 대칭키보다 훨씬 많은 연산을 요구하며, 시간이 오래 걸린다
- 키 길이: 공개키는 어느 정도 공개되므로, 개인키를 유추하기 어렵도록 대칭키보다 훨씬 긴 키 길이를 사용해야 한다
- 유효 기간: 모든 암호키에는 유효 기간이 있어 일정 기간이 지나면 갱신해야 한다
비대칭키는 대칭키의 키 전달 문제를 해결했지만, 연산 효율성 면에서는 대칭키보다 떨어진다
혼합 사용
인터넷 환경에서 암호화 통신의 효율성과 보안성을 동시에 극대화하기 위해, 실제 SSL/TLS (Secure Sockets Layer / Transport Layer Security) 프로토콜은 대칭키와 비대칭키 방식을 혼합하여 사용한다. 이것이 바로 현재 사용하는 HTTPS의 기반이 되는 기술이다.
혼합 사용의 원리는 다음과 같다
- 서버의 키 쌍 생성: 서버는 비대칭키 쌍(공개키와 개인키)을 생성하여 준비한다
- PC의 대칭키(세션 키) 생성: PC는 서버와 통신할 때 사용할 대칭키를 생성한다. 이 대칭키를 세션 키(Session Key)라고 부르는데, 이는 해당 통신 세션 동안만 임시로 사용되는 키이다
- 서버 공개키 전송: 서버는 자신의 공개키를 PC에게 보낸다
- 세션 키 암호화 및 전송: PC는 자신의 생성한 세션 키를 서버로부터 받은 서버의 공개키로 암호화하여 서버에게 전송한다. 이 과정에서 세션 키는 암호화된 형태로 안전하게 터널을 통해 전달된다
- 세션 키 복호화: 서버는 자신의 개인키로 암호화된 세션 키를 복호화하여 PC가 생성한 세션 키를 얻는다
- 대칭키(세션 키) 통신: 이제 PC와 서버는 동일한 세션 키를 공유하게 된다. 이후의 실제 데이터 통신은 모두 이 세션 키를 이용한 대칭키 암호화 방식으로 이루어진다. 대칭키는 연산 속도가 빠르므로 대량의 데이터를 효율적으로 암호화하고 복호화할 수 있다
이러한 혼합 방식은 다음과 같은 장점을 가진다
- 대칭키의 효율성 활용: 실제 데이터 전송에는 효율적인 대칭키를 사용하여 성능을 확보한다
- 비대칭키의 보안성 활용: 비대칭키는 오직 ‘세션 키’를 안전하게 교환하는 역할에만 사용된다. 이 세션 키 교환 과정에서 비대칭키의 강력한 보안성이 발휘되어, 공개된 인터넷 환경에서도 키를 안전하게 전달할 수 있게 된다
- 세션별 독립성: 각 통신 세션마다 새로운 세션 키를 생성하므로, 특정 세션의 키가 노출되더라도 다른 세션의 보안에는 영향을 미치지 않아 보안성이 더욱 강화된다
중간자 공격(MITM Attack)과 신뢰 문제
혼합 암호 방식은 강력하지만, 한 가지 중요한 문제가 남아있다. 바로 “수신한 공개키를 신뢰할 수 있을까?”이다
PC 입장에서 “서버에서 보낸 공개키”라고 생각하고 받았지만, 실제로는 악의적인 해커(Man-in-the-Middle, MITM)가 중간에 끼어들어 자신의 공개키를 서버의 공개키인 것처럼 위장해서 보낼 수 있다
이러한 중간자 공격(MITM Attack) 시나리오는 다음과 같다
- PC → 서버 공개키 요청: PC가 서버에게 “네 공개키를 줘”라고 요청한다
- 해커의 개입: 이 요청이 서버에 도달하기 전에 해커가 가로챈다
- 해커의 위장: 해커는 자신의 공개키를 생성하고, 이를 서버의 공개키인 것처럼 위장하여 PC에게 보낸다
- PC의 세션 키 암호화(해커의 공개키로): PC는 해커의 공개키를 진짜 서버의 공개키로 착각하고, 자신이 생성한 세션 키를 이 해커의 공개키로 암호화하여 서버에게 보낸다
- 해커의 세션 키 탈취: 해커는 PC가 보낸 암호화된 세션 키를 가로채서, 자신의 개인키로 복호화하여 PC의 세션 키를 탈취한다
- 해커 → 서버 세션 키 전달(위장): 해커는 이제 탈취한 세션 키를 진짜 서버의 공개키(서버로부터 미리 가로챈)로 다시 암화화하여 서버에게 보낸다. 서버는 이를 자신의 개인키로 복호화해 세션 키를 얻는다
- 이후 통신 도청: PC와 서버는 해커가 중간에서 조작한 세션 키를 가지고 비밀 통신을 시작하지만, 해커는 이미 세션 키를 알고 있기 때문에 모든 통신 내용을 도청할 수 있게 된다
이러한 공격을 방어하기 위해서는 PC가 수신한 공개키가 진짜 서버의 공개키가 맞는지 검증하는 절차가 필수적이다. 단순히 “서버에서 보냈다”고 믿어서는 안 된다.