도서 정리/혼자 공부하는 네트워크

[혼자 공부하는 네트워크] Chapter 7 - 2 안전성을 위한 기술

라일라엘 2024. 8. 20. 03:11

암호와 인증서

통신을 하는 과정에서 메시지를 주고받을 때 제 3자가 메시지를 훔쳐보거나 가로채 변조할 수 있기 때문에 암호화가 필요하다.

암호화와 복호화의 핵심은 키이다. 컴퓨터상에선 키를 통해 암호화를 할 수 있다.

대칭 키 암호화 방식과 공개 키 암호화 방식

키는 무작위해 보이는 문자열처럼 생겼으며, 키와 원문 데이터에 수학적 연산 과정을 거치면 암호문이 생성된다. 이 수학적 연산 과정을 ‘암호화 알고리즘’이라고 부른다. 암호문을 수신자 측에서 복호화하면 원문 메시지를 얻을 수 있다. 복호화하지 않은 암호문은 제3자가 몰래 본다 해도 그 의미를 알 수 없다.

데이터를 암호화하고 복호화하는 방법에는 두 가지 방식이 있다.

  • 대칭 키 암호화
    • 암호화와 복호화에 동일한 키를 사용한다.
    • 상대방에게 안전하게 키를 전달하는 게 어렵다.
    • 적은 부하로 인해 빠르게 암호화와 복호화를 할 수 있다.
  • 비대칭 키 암호화
    • 암호화를 위한 키와 복호화를 위한 키가 다르다. 이 한 쌍의 키를 공개키와 개인키라 부른다.
    • 공개키로 암호화하고 개인키로 복호화가 가능하기 때문에 공개키는 유출이 되어도 상관없지만, 개인키는 유출되어선 안된다.
    • 암호화와 복호화에 시간과 부하가 상대적으로 많이 들지만, 키를 안전하게 공유할 수 있다.

이런 장단점을 고려해 공개키 암호화 방식을 사용하는 경우가 있다. 이러한 방식으로 사용되는 대칭키를 세션키라고 부른다.

인증서와 디지털 서명

인증서는 무언가 증명하기 위한 문서이다. 네트워크에서 사용되는 인증서라는 용어는 공개 키 인증서를 일컫는다. 공개 키 인증서란 공개 키와 공개 키의 유효성을 입증하기 위한 전자 문서이다. 즉, 키의 생성자와 조작 여부, 유효기간 등의 정보가 포함되어 있어 유효성을 입증할 수 있다.

이러한 인증서는 인증 기관이라는 제3의 기관에서 발급한다. 인증 기관은 인증서의 발급, 검증, 저장과 같은 역할을 수행할 수 있는 공인기관이다. 일반적으로 CA라고 불여서 부른다.

CA가 발급한 인증서에는 내용을 보증한다는 내용을 담은 서명값이 있다. 클라이언트는 이 서명값을 바탕으로 인증서를 검증할 수 있다.

서명값은 인증서 내용에 대한 해시값을 CA의 개인 키로 암호화하는 방식으로 만들어진다. CA는 이렇게 얻어낸 정보를 서명값으로 삼아 클라이언트에게 인증서와 함께 전송한다.

클라이언트가 인증서 검사를 하기 위해 가장 먼저 할 일은 서명값과 인증서를 분리하는 것이다.

서명값은 인증서 내용에 대한 해시 값을 CA의 개인 키로 암호화한 것이다. 서명 값은 CA의 공개 키로 복호화할 수 있기 때문에, 인증서 내용에 대한 해시 값을 얻을 수 있다.

인증서 데이터에 대한 해시 값을 구한 뒤, 이를 복호화한 값과 비교한다. 일치했다면 CA의 개인 키로 만들어졌다고 보장할 수 있다.

이처럼 개인 키로 암호화된 메시지를 공개 키로 복호화함으로써 신원을 증명하는 절차를 디지털 서명이라고 부른다.

HTTPS: SSL과 TLS

SSL과 TLS는 대칭 키 공개 키, 공개키 인증서 방식을 기반으로 동작하는 프로토콜이다. SSL과 TLS는 인증과 암호화를 수행하는 프로토콜이며, TLS는 SSL을 계승한 프로토콜이다.

SSL/TLS를 사용하는 대표적인 프로토콜은 HTTPS이다. HTTPS는 HTTP 메시지의 안전한 송수신을 위해 개발된 프로토콜이다.

오늘날 주로 사용되는 TLS 1.3을 기반으로 HTTPS가 어떻게 동작하는지 간단하게 알아보자. HTTPS 메시지의 송수신 단계는 다음과 같다.

  1. TCP 쓰리 웨이 핸드 셰이크
  2. TLS 핸드 셰이크
  3. 암호화된 메시지 송수신

TCP 쓰리웨이 핸드 셰이크는 이미 학습한 내용이므로 넘어간다.

TLS 핸드 셰이크

TLS 핸드 셰이크의 핵심은 두 가지이다.

  • 암호화 통신을 위한 키를 교환한다.
  • 인증서 송수신과 검증이 이루어진다.

다음은 TLS 핸드 셰이크 과정이다. 굵은 글자로 표기된 부분을 위주로 보자.

  • 클라이언트의 ClientHello 메시지
    • 암호화된 통신을 위해 맞춰봐야 할 정보들을 제시
    • 지원되는 TLS 버전, 사용 가능한 암호화 방식과 해시 함수, 키를 만들기 위한 클라이언트 난수
    • 사용가능한 암호화 방식과 해시 함수를 암호 스위트라고 함
  • 서버의 ServerHello 메시지
    • 클라이언트가 제시한 정보들을 선택하는 메시지

두 메시지가 오고 간 뒤엔 클라이언트와 서버는 키로 암호화된 암호문을 주고받을 수 있게 된다.

이후 서버는 Certificate 메시지와 CertificateVerify 메시지를 전송한다. 이는 각각 인증서와 검증을 위한 디지털 서명을 의미한다. 클라이언트는 이를 토대로 서버의 공개 키를 검증하게 된다. 마지막으로 서버와 클라이언트는 Finished 메시지를 주고받으며 TLS 핸드 셰이크를 종료한다.