[CS] SSL와 TLS이란?

giggle·2023년 8월 8일
0

📌 SSL/TLS란?

SSL은 무엇일까?

과거 데이터는 가로채면 누구나 읽을 수 있는 일반 텍스트 형태로 전송 되었다. 이러한 문제로 보안 이슈가 발생하게 되었고, 인터넷 통신의 개인정보 보호, 인증, 데이터 무결성을 보장하기 위해 Netscape가 처음 SSL을 개발하였습니다.

SSL(Secure Scokets Layer)은 암호화 기반 인터넷 보안 프로토콜입니다. 전달되는 모든 데이터를 암호화하고 특정한 유형의 사이버 공격도 차단합니다. SSL은 TLS(Transport Layer Security) 암호화의 전신이기도 합니다.

또한, SSL/TLS 를 사용하는 웹사이트 URL은 HTTP 대신 HTTPS가 사용됩니다.

TLS은 무엇일까?

TLS 는 SSL의 업데이트 버전으로 SSL의 최종버전인 3.0과 TLS의 최초버전의 차이는 크지않으며, 이름이 바뀐것은 SSL을 개발한 Netscape가 업데이트에 참여하지 않게 되어 소유권 변경을 위해서였다고 합니다.(이름 변경)

결과적으로 TLS는 SSL의 업데이트 버전이며 명칭만 다르다고 볼 수 있습니다.

SSL/TLS의 작동방식

1. Handshake (핸드셰이크)
클라이언트가 서버에 접속하면, 클라이언트와 서버는 핸드셰이크 과정을 시작합니다. 클라이언트는 서버에 암호화 방식과 암호화에 사용할 랜덤 데이터를 전송합니다. 이에 서버는 클라이언트의 요청에 응답하고, 서버의 공개키와 서버의 정보를 포함한 인증서를 전송합니다. 클라이언트는 서버의 인증서를 확인하고, 클라이언트에서 생성한 랜덤 데이터와 서버의 랜덤 데이터를 사용하여 세션 키를 생성합니다.

2. Key Exchange (키 교환)
핸드셰이크 단계에서 생성한 세션 키를 사용하여 통신에 사용할 대칭키 (세션 키)를 교환합니다. 이때 대칭키는 데이터의 암호화와 복호화에 사용됩니다.

3. Data Transfer (데이터 전송)
데이터가 대칭키를 사용하여 암호화되고, 네트워크를 통해 전송됩니다. 자신의 개인키로 해당 세션 키를 복호화하여 원래 데이터를 얻습니다.

4. Connection Closure (연결 종료)
통신이 끝나면, 클라이언트나 서버 중 한쪽에서 연결 종료 요청을 보냅니다. 연결 종료 단계에서는 각 측에서 사용한 키 및 세션 정보를 정리하고 연결을 종료합니다.

📌 SSL/TLS 핸드셰이크

진행 순서

  1. 클라이언트는 서버에게 client hello 메시지를 담아 서버로 보낸다. 이때 암호화된 정보를 함께 담는데, 버전, 암호 알고리즘, 압축 방식 등을 담는다.

  2. 서버는 클라이언트가 보낸 암호 알고리즘과 압축 방식을 받고, 세션 ID와 CA 공개 인증서를 server hello 메시지와 함께 담아 응답한다. 이 CA 인증서에는 앞으로 통신 이후 사용할 대칭키가 생성되기 전, 클라이언트에서 handshake 과정 속 암호화에 사용할 공개키를 담고 있다.

  1. 클라이언트 측은 서버에서 보낸 CA 인증서에 대해 유효한 지 CA 목록에서 확인하는 과정을 진행한다.
  1. CA 인증서에 대한 신뢰성이 확보되었다면, 클라이언트는 난수 바이트를 생성하여 서버의 공개키로 암호화한다. 이 난수 바이트는 대칭키를 정하는데 사용이 되고, 앞으로 서로 메시지를 통신할 때 암호화하는데 사용된다.
  1. 만약 2번 단계에서 서버가 클라이언트 인증서를 함께 요구했다면, 클라이언트의 인증서와 클라이언트의 개인키로 암호화된 임의의 바이트 문자열을 함께 보내준다.
  1. 서버는 클라이언트의 인증서를 확인 후, 난수 바이트를 자신의 개인키로 복호화 후 대칭 마스터 키 생성에 활용한다.
  1. 클라이언트는 handshake 과정이 완료되었다는 finished 메시지를 서버에 보내면서, 지금까지 보낸 교환 내역들을 해싱 후 그 값을 대칭키로 암호화하여 같이 담아 보내준다.
  1. 서버도 동일하게 교환 내용들을 해싱한 뒤 클라이언트에서 보내준 값과 일치하는 지 확인한다. 일치하면 서버도 마찬가지로 finished 메시지를 이번에 만든 대칭키로 암호화하여 보낸다.
  1. 클라이언트는 해당 메시지를 대칭키로 복호화하여 서로 통신이 가능한 신뢰받은 사용자란 걸 인지하고, 앞으로 클라이언트와 서버는 해당 대칭키로 데이터를 주고받을 수 있게 된다.

참고


피드백 및 개선점은 댓글을 통해 알려주세요😊

profile
배움을 글로 기록하는 개발자가 되겠습니다.

0개의 댓글