Hyun Don's Blog

About Now Notes Resume Portfolio

TLS 핸드셰이크와 암호화

최근 HTTP 버전 별 차이, HTTP와 HTTPS의 차이 등 HTTP 작동 방식에 대해 공부하는 중인데, TLS 계층의 작동 방식에 대해 흥미를 갖게 되었다. TLS는 안전한 네트워크 통신을 위한 보안 프로토콜로, HTTPS에서 HTTP 데이터를 암호화는 데 사용된다. 이 글에서는 TLS가 무엇인지, TLS 핸드셰이크 과정은 어떤 방식으로 작동하는지, 그리고 이 과정에서 사용되는 암호화 방식에 대해 정리해보고자 한다.

TLS란?

TLS (Transport Layer Security) 는 데이터를 암호화하고, 통신에 참여하는 상대방의 신원을 확인할 수 있도록 하는 네트워크 보안 프로토콜이다. HTTPS에서는 응용계층(HTTP)와 전송계층(TCP) 사이에서 작동하며, 클라이언트와 서버가 주고 받는 데이터를 보호한다. TLS의 사용은 HTTPS에만 국한되지 않고, FTP(파일 전송 프로토콜), SMTP(이메일 전송 프로토콜) 등 다양한 프로토콜에서 쓰이고 있다.

TLS에 대한 자료를 찾아보면 SSL (Secure Sockets Layer) 이라는 용어와 혼용되는 경우를 볼 수 있다. SSL은 TLS의 전신으로, 1990년대에 Netspace에서 개발되어 1996년도에 배포된 SSL 3.0이 널리 사용되었다. 하지만 그 이후 SSL 3.0을 기반으로 한 TLS가 등장해 SSL은 더 이상 사용되지 않게 되었다. 현재는 TLS 1.2와 TLS 1.3이 널리 사용되고 있지만, 그럼에도 SSL이라는 용어는 아직도 많이 사용되고 있다.

TLS 핸드셰이크란?

모든 TLS 통신 세션은 TLS 핸드셰이크 과정을 거쳐 시작된다. 이 과정에서 클라이언트가 서버의 신원을 확인하고, 암호화를 위한 키를 생성하는데 필요한 정보를 주고 받는다.

TLS 핸드셰이크의 세부 절차는 클라이언트와 서버가 채택한 키 교환 방식에 따라 달라질 수 있다. 다음은 Diffie-Hellman* (DH) 키 교환 방식을 사용하는 TLS 핸드셰이크 과정을 설명한 것이다.

* Diffie-Hellman 키 교환: 클라이언트와 서버가 각자 정한 DH 파라미터를 주고 받아 세션 키를 생성하는 방식. Modulo 연산을 사용해 서로 다른 계산식을 통해 같은 값을 생성한다.

TLS 핸드셰이크 과정

* Cipher Suite: 사용할 암호화 알고리즘, 해시 함수, 키 교환 방식 등을 조합한 문자열

비대칭 암호화, 대칭 암호화

TLS 핸드셰이크 과정에서 비대칭 암호화대칭 암호화가 중요한 역할을 한다. 비대칭 암호화는 두 개의 키를 활용해 데이터를 암호화하고 복호화하는 방식으로, 공개키와 비밀키를 구분해 사용하기 때문에 공개키 암호화 라고도 한다.

비대칭 암호화 방식의 특징 중 하나는 공개키와 비밀키가 독립적으로 생성되는 것이 아니라, 연관된 한 쌍의 키로 생성되며, 사용자가 임의로 하나를 공개키로, 다른 하나를 비밀키로 사용한다는 점이다. 보통 데이터 암호화는 비밀키로, 복호화는 공개키로 하는 것으로 생각하는데, 실제로는 두 키 모두 암호화와 복호화에 쓰일 수 있다.

비대칭 암호화 방식을 사용하면 공개키로부터 비밀키를 유추할 방법이 없기 때문에 공개키로 암호화한 값은 비밀키 보유자만 해독할 수 있다는 장점이 있다. 다만 비대칭 암호화 방식은 리소스를 많이 사용하고 느리게 작동하는 단점이 있다. 또한, 보통 공개키와 비밀키는 매번 생성하지 않고 재사용하기 때문에, 비밀키가 탈취당할 경우 그동안 주고받은 암호화된 데이터가 모두 노출될 위험이 있다.

대칭 암호화는 서버와 클라이언트가 하나의 키를 활용해 데이터를 암호화하고 복호화하는 방식이다. 이 방식은 비대칭 암호화 방식보다 빠르고 효율적이기 때문에 속도와 효율성을 중시하는 상황에서 많이 사용된다. 하지만 대칭 암호화 방식을 택할 경우 서버가 클라이언트에 키를 안전하게 전달하기 어렵다는 큰 단점이 존재한다. 만약 키가 전달 과정에서 탈취되면, 클라이언트와 서버 간 오고 가는 데이터가 그대로 노출될 수 있다.

각 암호화 방식의 특징과 장단점을 고려해 TLS 핸드셰이크 과정은 이 두 방식을 조합해 사용한다. 비대칭 암호화 방식은 TLS 핸드셰이크 과정 중 클라이언트가 서버의 신원을 확인할 때 사용된다. 예를 들어, 클라이언트는 서버가 비밀키로 암호화한 디지털 서명을 서버의 공개키를 활용해 복호화해 서버의 신원을 확인한다. 서버의 인증서 역시 비대칭 암호화 방식의 일환으로, 인증서는 인증 기관의 비밀키로 암호화되어 있으며, 클라이언트는 브라우저에 내장된 인증 기관의 공개키로 이를 복호화한다.

실제 데이터를 암호화해 주고받는 과정에서는 속도와 효율성을 위해 대칭 암호화 방식이 사용된다. 이때, 클라이언트와 서버는 세션 키가 탈취당하지 않도록 다양한 키 교환 방식을 사용한다. 예를 들어, DH 키 교환 방식에서는 키 생성을 위한 값만 교환되며 클라이언트와 서버는 이를 토대로 동일한 키를 생성한다. 키를 생성하기 위한 값만 오고가고, 실제 생성된 세션 키는 클라이언트와 서버 사이 전달되지 않기 때문에 제3자가 키를 탈취할 위험이 적다. 또한, 세션 별로 키를 생성하기 때문에 키가 탈취되더라도 다른 세션의 데이터는 노출되지 않는다.

마무리

그동안 개발을 하며 HTTPS 프로토콜을 사용해왔지만, HTTPS 프로토콜 상에서는 오고가는 데이터가 암호화된다는 점 외에는 큰 관심을 갖지 않았다. TLS 계층, TLS 핸드셰이크 과정, 비대칭 암호화와 대칭 암호화의 원리 등에 대해 공부하면서, 실제로 HTTPS 프로토콜이 어떻게 작동하는지, 데이터가 어떻게 암호화되는지에 대해 이해할 수 있었다.

프론트엔드 웹 개발자도 CORS, XSS, CSRF 등 다양한 보안 이슈에 대해 알아야 하고, 이를 위해서는 네트워크와 보안에 대한 이해가 필요하다. 이번 기회를 통해 그동안 잘 모르고 있던 분야에 대한 이해도가 조금이나마 높아진 것 같고, 앞으로도 네트워크와 보안에 대해 더 깊이 공부해보고 싶다는 생각이 든다.

참고자료