HTTPS: SSL/TLS 핸드셰이크와 세션 관리 이해하기

임채령·2024년 11월 17일

PKI를 통해 전자서명과 전자봉투를 생성하고 생성된 전자봉투를 더 안정적으로 전송하기위해서 사용하는 SSL/TLS를 좀 더 깊게 공부하려한다 ! 웹에서 HTTPS를 사용한다는 것은 단순히 주소창에 https://를 붙이는 것을 넘어, 보안을 보장하기 위한 SSL/TLS 프로토콜을 활용한 암호화 과정을 의미한다. 이 포스팅에서는 HTTP에서 HTTPS로의 변환 과정SSL/TLS 핸드셰이크 과정을 포함해 HTTPS가 어떻게 데이터를 보호하는지 알아보겠다 !

1. HTTPS란?

HTTPS는 HTTP에 SSL/TLS 보안 계층을 추가하여 암호화된 안전한 통신을 가능하게 하는 프로토콜이다. HTTPS는 주로 웹사이트에서 개인정보 보호를 위해 사용된다. 예를 들어, HTTPS는 데이터 전송 중 도청, 변조를 방지하여 사용자 정보가 안전하게 보호된다.

HTTP vs HTTPS

  • HTTP는 데이터가 평문으로 전송되기 때문에 도청 위험이 있다.
  • HTTPS는 SSL/TLS 암호화를 사용해 데이터 전송을 보호하며, 이를 위해 핸드셰이크 과정을 통해 클라이언트와 서버 간 암호화 키를 교환한다.

2. HTTPS 전환의 핵심: SSL/TLS 핸드셰이크

HTTPS 통신에서 핸드셰이크(Handshake) 과정이 초기 연결의 핵심이다. 핸드셰이크 과정은 클라이언트와 서버가 암호화 방식과 키를 협상하고 안전한 통신을 설정하기 위한 단계이다. 각 단계에서 클라이언트와 서버는 특정 데이터를 교환하고, 대칭 키를 생성하여 이후 통신에서 사용할 준비를 한다.

핸드셰이크 과정 요약

핸드셰이크는 크게 다음 단계로 나뉜다:

  1. ClientHello: 클라이언트가 지원하는 암호화 방식, TLS 버전, 클라이언트 난수 전송
  2. ServerHello: 서버가 선택한 암호화 방식, 서버 난수 전송
  3. 서버 인증서 전송: 서버는 자신의 공개 키를 포함한 인증서를 클라이언트에 전송
  4. 프리마스터 시크릿 전송: 클라이언트가 생성한 프리마스터 시크릿을 서버 공개 키로 암호화해 전송
  5. 대칭 키 생성: 클라이언트와 서버는 클라이언트 난수, 서버 난수, 프리마스터 시크릿을 조합해 대칭 키 생성
  6. 암호화 통신 시작: 이후 데이터는 이 대칭 키를 사용해 암호화하여 통신

3. 단계별 HTTPS 핸드셰이크 과정 자세히 살펴보기

밑의 그림은 SSL/TLS의 전체적인 동작흐름과 CA가 인증서를 서명하는 과정까지를 내가 직접 그려보았다 ! 참고 해서 밑의 정리된 글을 읽으면 더 이해가 조금이라도 잘 되지않을까.. 싶다 ..

3.1. ClientHello 메시지 전송

  1. 클라이언트는 서버에 ClientHello 메시지를 전송한다.
  2. 이 메시지에는 클라이언트가 지원하는 암호화 방식 목록, TLS 버전, 그리고 클라이언트 난수가 포함된다.

3.2. ServerHello 메시지 전송

  1. 서버는 클라이언트의 요청을 수신한 후 클라이언트의 암호화 방식 목록 중 하나를 선택하여 암호화 방식을 결정한다.
  2. 서버 난수를 생성하여 ServerHello 메시지로 클라이언트에게 응답한다.

3.3. 서버의 인증서 전송

  1. 서버는 인증서(Certificate)를 클라이언트에게 전송한다.
  2. 인증서에는 서버의 공개 키와 서버의 신원 정보를 포함하고 있으며, 인증 기관(CA)이 서명하여 신뢰성을 보장한다.

3.4. 클라이언트의 프리마스터 시크릿 전송

  1. 클라이언트는 서버의 공개 키를 사용해 프리마스터 시크릿(Premaster Secret)을 생성한 후, 이를 서버의 공개키로 암호화하여 서버로 전송한다.
  2. 서버는 자신의 개인 키로 이 프리마스터 시크릿을 복호화하여 원래 값을 얻는다.

3.5. 대칭 키 생성

  1. 클라이언트 난수, 서버 난수, 프리마스터 시크릿을 조합하여 클라이언트와 서버 모두 같은 대칭 키(세션 키)를 생성한다.
  2. 이 대칭 키는 이후의 통신 데이터를 암호화하는 데 사용된다.

3.6. 암호화된 데이터 전송

핸드셰이크가 완료되면 클라이언트와 서버는 이제 대칭 키로 데이터를 암호화하여 안전하게 통신을 시작할 수 있다.

4. 세션 재사용으로 핸드셰이크 간소화하기

핸드셰이크 과정은 많은 연산을 필요로 하므로, 세션 ID 또는 세션 티켓을 통해 세션 재사용을 지원하여 이후 요청에서 핸드셰이크 과정을 생략할 수 있다.

세션 ID 방식

세션 ID는 서버와 클라이언트 간의 연결을 유지하고, 동일한 세션을 재사용할 수 있게 하기 위해 사용되는 고유한 식별자이다. 세션 ID 방식은 다음과 같은 방식으로 작동한다.

  1. 세션 생성: 클라이언트가 처음 서버에 연결할 때, 서버는 세션 ID를 생성하여 클라이언트에게 제공한다. 이 세션 ID는 쿠키에 저장되어 클라이언트의 브라우저에 남아 있게 된다 !
  2. 세션 정보 저장: 서버는 생성한 대칭키와 관련된 암호화 매개변수 등의 세션 정보를 서버 내부의 데이터베이스 또는 메모리에 저장한다. 이때, 세션 정보에는 이 연결에 사용된 대칭키가 포함되며, 이 데이터를 참조할 수 있는 위치(주소)가 세션 ID에 쌓이게 된다.
  3. 세션 재사용 요청: 클라이언트가 다시 서버에 연결할 때, 쿠키에 저장된 세션 ID를 서버에 전송한다. 서버는 이 세션 ID를 사용해 데이터베이스나 메모리에서 해당 세션 정보를 조회한다.
  4. 대칭키 복원: 세션 ID에 쌓여있는 메모리나, 데이터베이스 주소를 통해 서버는 기존 세션에 사용되었던 대칭키와 관련된 정보를 복원한다. 이로 인해 서버와 클라이언트 간의 핸드셰이크 과정을 생략하고, 이전 세션에서 사용된 대칭키를 그대로 재사용할 수 있다.
  5. 빠른 연결 설정: 이렇게 복원된 대칭키를 이용해 서버와 클라이언트는 빠르게 데이터를 암호화하여 통신할 수 있다. 즉, 모든 복잡한 핸드셰이크 과정을 다시 수행하지 않고도 암호화된 상태로 데이터 전송이 가능해지는것이다 ! ! !

세션 ID 방식의 핵심은 세션 ID가 단순히 세션 정보를 저장하고 있는 위치를 가리키는 역할을 한다는 점이다. 실제 대칭키와 기타 세션 관련 정보는 서버 쪽에 저장되며, 세션 ID는 이를 참조할 수 있는 인덱스 역할을 한다 ! !

세션 티켓 방식

세션 티켓 방식은 세션 정보를 서버에 저장하지 않고, 클라이언트 측에 전달하여 다음 연결 시 재사용하는 방식이다. 이는 세션 ID 방식과 다르게 서버의 메모리를 절약하고, 서버에 대한 부담을 줄이는 장점이 있다. 세션 티켓 방식은 다음과 같은 방식으로 작동한다.

  1. 세션 티켓 생성: 처음 서버와 클라이언트가 연결을 맺을 때, 서버는 연결에 사용된 대칭키와 암호화 매개변수 등의 정보를 담은 세션 티켓을 생성한다. 이 세션 티켓은 서버가 보유한 대칭키를 사용하여 암호화되기 때문에, 클라이언트는 이 티켓의 내용을 알 수 없다.
  2. 세션 티켓 전달: 서버는 이 암호화된 세션 티켓을 클라이언트에게 전달한다. 클라이언트는 이 세션 티켓을 쿠키로컬 스토리지에 저장하여 이후 서버와의 연결에 사용할 수 있게 한다.
  3. 세션 티켓 재사용: 클라이언트가 서버와 다시 연결을 맺을 때, 이전에 받은 세션 티켓을 서버에 다시 전송한다. 서버는 자신의 대칭키를 사용해 이 세션 티켓을 복호화하고, 이전에 사용된 대칭키와 암호화 매개변수를 복원한다.
  4. 빠른 연결 설정: 이렇게 복원된 대칭키를 이용해 서버와 클라이언트는 핸드셰이크 과정 없이 빠르게 연결을 설정하고, 대칭키로 데이터를 암호화하여 통신할 수 있다.

세션 티켓 방식의 핵심은 세션 정보를 클라이언트 측에 저장하여 서버의 메모리 부담을 줄이는 것이다. 서버는 단지 세션 티켓을 복호화하여 정보를 복원하는 역할을 하며, 이를 통해 세션을 재사용할 수 있게 된다 !

세션 ID / 세션 티켓

  • 세션 ID 방식세션 정보가 서버에 저장되고, 클라이언트는 세션을 식별하기 위한 세션 ID만을 보유한다. 서버는 해당 세션 정보를 기반으로 대칭키를 복원하여 재사용한다.
  • 세션 티켓 방식세션 정보가 클라이언트 측에 저장된다. 서버는 클라이언트가 제공한 세션 티켓을 복호화하여 필요한 정보를 복원하고 세션을 재사용한다.

하지만 ?! 주로 세션 아이디만을 사용하는거같긴하다 !

HTTPS는 SSL/TLS 프로토콜을 사용하여 HTTP 요청을 암호화된 상태로 전송함으로써 웹의 보안을 강화한다. HTTPS 전환 과정은 핸드셰이크를 통해 이루어지며, 세션 재사용 기능을 통해 성능을 최적화한다. 공개 키와 개인 키 쌍은 보안을 강화하는 핵심이며, HTTPS는 이 과정을 통해 클라이언트와 서버 간 안전한 데이터 전송을 보장할수있다 !!

0개의 댓글