SSL/TLS 통신 과정

HTTP (Hyper Text Transfer Protocol)

HTTP는 서버와 클라이언트가 서로 데이터를 주고 받기 위한 프로토콜로 OSI 7계층 중 응용 계층에서 작동한다. 예를 들어, 사용자가 웹 사이트에 방문하면 사용자 브라우저가 웹 서버에 HTTP 요청을 전송하고, 웹 서버는 HTTP로 응답을 한다.

  • 상태 없음: 클라이언트에서 서버로의 각 요청은 독립적이다. 즉 첫 번째 통신에서 데이터를 주고 받아도 두 번째 통신에서 클라이언트는 앞서 받은 데이터를 유지하지 않는다.
  • 유연성: 클라이언트와 서버에서 콘텐츠 유형을 처리할 수 있다면, HTTP는 어떤 유형의 데이터도 전송할 수 있다.
  • 비연결성: 한 번 통신을 주고받으면 연결을 끊는다.

하지만 HTTP에는 큰 문제가 있다.

  • 보안 취약성: 통신 상태를 확인하지 않고, 데이터를 암호화하지 않으며 평문으로 전송하여, 중간에 제3자가 데이터를 엿볼 수 있다.
  • 무결성: 데이터가 전송 중에 변경되거나 조작될 수 있다.

이러한 문제를 해결하기 위해서 HTTPS가 나타났다.

HTTPS (Hyper Text Transfer Secure)

HTTPS는 HTTP의 보안 버전으로 HTTP의 문제를 해결하기 위하여 개발되었다. HTTPS는 Transport Layer Security (TLS) 또는 이전의 Secure Sockets Layer (SSL)을 사용하여 암호화된다.

SSL/TLS

SSL/TLS는 데이터를 안전하게 전송하기 위하여 데이터 링크 계층에서 작동하는 프로토콜이다. (TLS는 SSL의 후속 버전이지만 일반적으로 “SSL/TLS” 라는 용어로 언급되거나 특별하게 구분하지 않는다.) SSL은 클라이언트와 서버 간에 보안된 채널을 제공하여 데이터가 도청, 간섭, 위조로부터 보호되도록 한다.

대칭키/공개키

SSL/TLS는 암호화를 위해 대칭키/공개키 기법을 사용한다.

대칭키

하나의 키로 암호화 복호화를 둘 다 할 수 있는 암호화 기법이다. 클라이언트와 서버가 동일한 키를 가지고 있다가 데이터가 왔을 때 이 키로 복호화하고, 데이터를 보낼 떄는 해당 키로 암호화하여 전송하는 것이다.

공개키에 비해 암호화/복호화 속도가 빠르지만, 서로 키를 안전하게 교환하기 어렵다는 단점이 있다. 클라이언트와 서버가 서로 키를 주고받다가 중간에 누군가 키를 가로챌 수도 있기 때문이다.

공개키

대칭키 기법의 보안 문제를 해결하기 위해 탄생한 것이 바로 공개키 기법이다. 공개키 기법은 서로 다른 키 두 개로 암호화/복호화를 한다는 특징을 가지고 있다. 클라이언트가 데이터를 공개키로 암호화하여 서버에게 전달했다면, 서버는 개인키로 데이터를 복호화할 수 있는 것이다.

중간에 누군가 공개키를 가로채더라도, 개인키를 모르기 때문에 데이터를 온전히 복호화할 수 없어 대칭키 기법에 비해 느리지만 더 안전하게 데이터를 주고받을 수 있다는 장점이 있다.

SSL 동작 방법

SSL은 핸드셰이크, 세션, 세션 종료의 세 단계로 이루어진다.

핸드셰이크

image

  1. 클라이언트는 서버에게 인사를 하며, 랜덤한 데이터와 현재 지원할 수 있는 암호화 방식을 전달한다.
  2. 서버는 클라이언트에게 인사를 하며, 세 가지 내용을 전달한다.
  • 랜덤 데이터
  • 지원 가능한 암호화 방식
  • 인증서

인증서

CA(Certificate Authority)에서 발급받은 문서로, 서버가 신뢰할 수 있는지 보장하는 역할

  1. 클라이언트는 CA가 발급한 인증서 목록 중에 서버가 전달한 인증서가 있는지 확인한다. 그리고 CA에서 공유하는 공개키로 인증서를 복호화한다. 복호화가 된다면 서버가 비밀키로 인증서를 암호화했다는 것이 검증되니 서버를 신뢰할 수 있게 된다.
  2. 클라이언트는 서로 주고받은 데이터를 조합하여 임시키를 생성한다. 이때 공개키로 암호화하여 서버에게 전달한다.
  3. 서버는 자신이 갖고 있던 비밀키로 복호화하여 임시키를 전달 받는다.
  4. 임시키를 세션키로 바꾸고, 세션키를 사용하여 클라이언트와 서버가 통신하게 된다.

세션

세션 단계에서는 세션키를 사용하여 대칭키 기법으로 데이터를 암호화하여 통신한다.

세션 종료

데이터 전송이 끝나면 세션을 종료하여 통신을 마친다.