본문 바로가기
Web Security

[1] HTTPS 프로토콜 쉽게 이해하기 - 대칭 키와 비대칭 키

by blackjack_96 2024. 5. 1.

HTTPS 프로토콜은 우리가 하루에도 몇십 번 이상 사용이 될 정도로 흔하지만,

그 기술의 동작 원리를 이해하는 것은 어렵습니다.

 

당장 유튜브나 각종 자료들을 둘러보아도 그 내용을 이해하는 데 많은 배경지식이 필요하며,

심지어는 사실과 다르게 설명이 되어 있음을 많이 보았습니다.

 

HTTPS를 이해하려면

대칭 / 비대칭 키 암호화와

인증서(Authentication Certificate)라는 배경지식이 필요한데,

이것을 하나의 포스팅으로 다루기엔 너무나 많은 분량이기 때문에

여러 차례 포스팅(3회 정도)을 거쳐

차례로 다루어 보도록 하겠습니다.

 

암호화(Encryption)가 무엇인가

 

일단 예를 하나 들어봅시다.

네이버에 로그인을 하려고 아이디와 비밀번호를 입력하면,

이 아이디와 비밀번호가 네트워크를 타고 "네이버 서버"에 전달이 됩니다.

 

우리가 사용하는 브라우저는

사용자가 입력한 아이디와 비밀번호를 이용해

HTTP 요청 메시지를 만들어서 서버로 전달하는 것이죠.

 

이 때,

요청 메시지의 바디(Body)부분에 우리가 입력한 아이디와 비밀번호 정보가 들어가게 됩니다.

 

그런데 이 때,

어떤 악의적인 사용자가,

네트워크를 감청하고 있다면 어떻게 될까요?

 

사용자가 입력한 아이디와 비밀번호 정보가

악성 사용자의 손에 넘어가게 됩니다.

 

암호화를 하지 않았을 때에

 

 그래서 이런 일을 미연에 방지하고자,

 송신하고자 하는 내용을 다음과 같이 암호화(Encryption)시켜서 서버로 전달하게 되는 것입니다.

 

 

암호화를 했을 때에

 

암호화를 거치게 되면,

중간에 가로채서 그 내용을 얻어도

도무지 무슨 내용인지 알 수 없게 되는 것입니다.

 

이렇게 되어 버리면 네트워크의 감청은 소용이 없게 되는 것이죠.

 

암호화를 함으로써, 

우리의 일차적인 목표는 성공했습니다.

 

그러나 문제가 하나 더 남아 있습니다.

복호화(Decryption)의 필요성

 

 암호화를 해서 서버로 보내고자 하는 데이터의 기밀성을 유지하는 데에는 성공을 했으나,

 서버가 이 암호화된 데이터를 알아먹지 못하면 소용이 없습니다.

 

 그래서 서버는 이 암호화 된 데이터를 복호화(Decryption)하여, 

 원래 클라이언트가 보내고자 하는 데이터가 무엇인 지 알아내는 과정을 거칩니다.

암호화된 데이터의 복호화

 

 즉, 위 과정을 두 문장으로 정리하면 다음과 같이 요약될 수가 있습니다.

 

"클라이언트는 자신이 보내고자 하는 정보를 암호화 하고,

서버는 이 암호화된 정보를 받아 복호화 한다."

 

 이로써, 

 데이터의 기밀성을 유지하면서 동시에, 

 서버는 클라이언트가 의도했던 요청을 이해할 수 있게 되었기 때문에

 보안이 유지된 통신이 이루어질 수 있었습니다.

 

 

이제 우리가 공부해야 할 것

 

 그러면 다음으로 우리가 공부해야 할 것은,

 "암호화라는 것을 어떻게 하고, 복호화라는 것을 어떻게 해 내는지"입니다.

 이것이 바로 HTTPS라는 기술을 이해하는 데 필수적인 지식이기 때문입니다.

 

 여기서, 암호화(Encryption)와 복호화(Decryption)가 어떻게 이루어지느냐에 따라서

 대칭 키 암호화 방식(Symmetric Key Encryption)

 비대칭 키 암호화 방식(Public-Key Encryption)으로 나뉩니다.

 

 

대칭 키(Symmetric Key Encryption) 암호화 방식

 

대칭 키 암호화 시스템을 한마디로 정의하면 다음과 같습니다.

 

"암호화 할 때 사용되는 키와

복호화 할 때 사용되는 키가 동일한

 암호화 시스템"

 

보통은 이렇게 정의되어 있는데, 풀어서 더 쉽게 설명하면 이렇게 됩니다.

 

 "어떤 데이터를 a라는 키로 암호화 시켰다.

이 것을 a라는 키로 복호화 시키면 본 데이터를 얻어낼 수가 있다."

 

가장 유명한 대칭 키 암호화 시스템 중 하나인 AES를 예로 들어보겠습니다.

 

  abc라는 문자열을

 "hellohellohelloh"라는 키를 이용하여 암호화 해 보겠습니다.

AES 암호화 결과

 

 abc를 

 "hellohellohelloh"라는 키를 이용하여 암호화한 결과

 "kYx2R9R/AEjJTx1zY33IQQ=="라는 문자열이 출력되었습니다.

 

 그러면 이제 

"kYx2R9R/AEjJTx1zY33IQQ=="라는 문자열을

 "hellohellohelloh"라는 동일한 키를 이용하여 복호화 해 보겠습니다.

 

AES 복호화 결과

 

 위에서 보시다시피, 

 암호화를 할 때 사용되는 키와 

 복호화를 할 때 사용되는 키가 동일한 것을 확인할 수가 있습니다.

 

 그런데 여기서 다음과 같은 의문이 들 수도 있습니다.

 

 "왜 abc라는 문자열을

hellohellohelloh라는 키로 암호화를 시키면

kYx2R9R/AEjJTx1zY33IQQ== 가 나오나요?"

 

 결론적으로 말씀을 드리면,

 암호화가 어떻게 이루어지는 지,

 그 원리까지는 우리가 당장 알 필요 없습니다.

 

 단지 우리는 다음과 같은 사실을 알기만 하면 업무를 진행하는 데 무리가 없기 때문입니다.

 

 "어떤 데이터를 암호화 시키기 위해서는 키(Key)라는 것이 필요하구나"

 "암호화된 데이터를 복구하기 위해서도 키(Key)가 필요하구나"

 

"abc라는 데이터를 hellohellohello라는 키로 암호화를 시키면

kYx2R9R/AEjJTx1zY33IQQ==  가 나오는구나"

 

 관련된 모든 정보를 이해해야 된다는 압박감은 학습자를 지치고 힘들게 합니다.

 암호화가 어떻게 이루어지는 지에 대한 정보가 필요할 때에 

 찾아서 공부하면 됩니다.

 

 대칭 키 암호화(Symmetric Key Encryption)를 정리하고 다음 주제로 넘어가겠습니다.

 

 어떤 데이터를 특정 키(key)로 암호화를 시켰을 때에,

 이 암호화된 것을 동일한 키(Key)로 복호화를 시키면 원본 데이터를 얻을 수 있다.

 

대칭 키(Symmetric Key Encryption) 암호화 방식의 단점

 대칭 키 암호화 방식은 언뜻 보기에 간단하고

 이해하기도 쉬워 친근감이 들지만

 치명적인 약점이 있어서 함부로 적용하지 못합니다.

 소통을 하고자 하는 당사자 간에,

 암호화에 사용하는 키를 사전에 공유하고 있어야 한다는 점입니다.

 

 

 소통하는 당사자 간에 암호화에 사용되는 키를 공유하고 있지 않으면 어떤 일이 일어날까요?

사전에 키가 공유되지 않은 상황

 

  사전에 키를 공유하고 있지 않습니다.

 클라이언트는 키를 가지고 있지 않네요. 

 그러면 클라이언트와 서버는 대칭 키 암호화 방식을 이용한 통신을 할 수가 없습니다.

 서버가 보낸 암호화된 통신문을

 클라이언트 측에서 복호화 할 수가 없기 때문이죠.

 

 그러니까, 다음 그림과 같이 어떻게든 서버에서 클라이언트 측으로 키를 전달해야만 합니다.

 

키를 공유하는 상황에서 발생하는 또 다른 문제점

 

 키를 공유하는 것 까지는 좋은데,

 이 키를 공유하는 과정에서 다른 악성 사용자에게 그 내용을 감청당할 수 있다는 점입니다.

 그렇게 되면 이 악성 사용자도 암호화된 통신문을 복호화 할 수 있는 키를 가지게 되고

 클라이언트와 서버 간의 통신문도

 결국 이 악성 사용자에게 복호화될 수 있다는 것입니다.

 

 그래서 결론은, 다음 그림과 같이,

 암호화 통신에 참여하는 당사자 간에 키(Key)를 공유하고 있어야 한다는 것입니다.

 이 키를 절대 네트워크상으로 노출시키는 일이 없게 만들어야 합니다.

 

사전에 키를 공유한 상황

 

 이러한 대칭 키(Symmetric Key Encryption)방식의 암호화의 단점을 보완하기 위하여 등장한 알고리즘이,

 바로 공개 키(Public Key Encryption)알고리즘입니다.

 공개 키 알고리즘에서는, 서버가 클라이언트에게 공개 키(Public Key)라는 것을 전달하는 데, 

 공개 키가 전달되는 과정에서 해커가 이것을 빼앗아도,

 해커는 절대로 암호문을 해독하지 못합니다.

 

공개 키(Public Key Encryption) 암호화 방식

 

 공개 키 암호화 방식에서는 두 개의 키 쌍(Public Key, Private Key)을 이용합니다.

 하나는 Public Key,

 그리고 다른 하나는 Private Key입니다.

 

 

공개 키로 암호화 된 암호문은 오로지 개인키로만 복호화가 가능

 

 공개 키(Public Key)를 이용해 암호화 된 암호문은,

 오로지 개인 키(Private Key)로만 복호화될 수 있으며

 

개인 키로 암호화 된 암호문은 오로지 공개 키로만 복호화가 가능

 

개인 키(Private Key) 를 이용해 암호화 된 암호문은,

 오로지 공개 키(Public Key) 로만 복호화될 수 있습니다.

 

이러한 공개 키 암호화 시스템의 동작 원리에 입각해서,

어떻게 클라이언트가 서버에게 보내는 데이터의 보안이 보장될 수 있는 지 알아보겠습니다.

 

다음과 같이, 서버는 공개 키와 개인 키

총 두 개의 키를 가지고 있습니다.

 

 

 

 서버는, 통신에 참여하고자 하는 클라이언트에게

 공개 키를 부여합니다.

 

다음과 같이 말하면서 말입니다.

 

"클라이언트야, 네가 나한테 데이터를 보낼 때는

이 키(공개 키)를 이용하여 데이터를 암호화한 뒤에 보내렴"

 

 최악의 상황을 가정하여,

 중간에 있는 해커가 네트워크를 감청하여

 이 공개키를 얻어냈다고 가정해 보겠습니다.

 

 

해커가 위와 같이 공개 키를 가지고 있는 모습입니다.

하지만 이렇게, 중간에 해커가 공개 키를 가지고 있다고 해도

클라이언트가 서버로 보내는 데이터를 절대로 감청할 수 없습니다.

왜냐하면,

 

 클라이언트가 서버로 데이터를 보낼 때, 공개 키(Public Key)를 이용해 데이터를 암호화한 뒤에 송신합니다.

 그런데 이렇게 공개 키를 이용해 암호화된 암호문은,

 오로지 개인 키(Private Key)를 통해서만 복호화가 가능합니다.

 

 해커는 오로지 공개 키(Public Key)만을 가지고 있기에,

 클라이언트가 서버로 보낸 암호문을 보아도, 

 절대 복호화할 수가 없다는 것입니다.

 

 이로써, 

 클라이언트가 서버로 보내는 데이터를 안전하게 송신할 수 있게 되었습니다.

 

 

공개 키(Public Key Encryption) 암호화 방식의 한계

 공개 키 시스템은 아주 강력한 암호화 알고리즘으로,

 그 알고리즘이 발견된 지 거의 60여년이 넘어가지만 

 현재까지 광범위한 산업에 걸쳐 사용이 되고 있을 정도로 완벽한 알고리즘입니다.

 

 절대적인 데이터 무결성을 보장할 수 있기 때문입니다.

 하지만 흠이 있다면,

 바로 공개 키 암호화 / 복호화는 많은 컴퓨팅 리소스를 필요로 한다는 것입니다.

 

 

 그래서 수많은 데이터가 빈번히 오가는 클라이언트와 서버 사이에서는 

 공개 키를 사용한 암/복호화가 부담스러울 수밖에 없습니다.

 

 다다음 시간에 정확하게 다룰 내용이지만,

 HTTPS 프로토콜에서는 이러한 공개 키 방식의 암복호화의 한계점을 해결하기 위하여

 데이터 전송 시 대칭 키(Symmetric Key)방식의 암복호화를 이용합니다.

 

이로써 HTTPS를 이해하기 위한 배경지식인 대칭 키와 공개 키 방식의 암호화를 공부하였습니다.