2020. 6. 8. 12:00ㆍ네트워크, 통신
SSL이란
SSL(Secure Socket Layer)이란 웹 서버와 브라우저간 통신의 보안을 위해 만들어진 프로토콜입니다. SSL은 Certificate Authority라 불리는 서드 파티로부터 서버와 클라이언트의 인증을 하는데 사용됩니다. SSL 통신은 공개키 암호화 방식과 비공개키 암호화 방식을 조합해 사용합니다. SSL에서는 통신을 수행할 때 먼저 통신 상대의 인증서를 체크함으로써 위장 여부를 확인합니다, 이 때, 인증서 체크는 공개키 암호화 방식에 기초한 것입니다. 공개키 암호화 방식은 처리 부하가 크기 때문에 대량 데이터 전송이 어렵기 때문에 SSL에서는 먼저 공개키 암호화 방식으로 비공개키를 암호화하여 통신 상대 사이에서 안전하게 비공개키를 배송합니다. 그리고 실제 대이터는 비공개키 암호화 방식을 사용합니다. 실제 데이터 암호화에 비공개키 암호화 방식을 사용함으로써 고속 처리를 가능하게 한 것입니다.
SSL 인증서
SSL 인증서는 클라이언트와 서버 간의 통신을 제 3자가 보증해주는 전자화된 문서입니다. 클라이언트가 서버에 접속한 직후, 서버는 클라이언트에게 이 인증서 정보를 전달하게 됩니다. 클라이언트느 이 인증서 정보가 신뢰할 수 있는 것인지를 검증한 후에 다음 절차를 수애하게 됩니다.
SSL 인증서의 이점
- 통신 내용이 공격자에게 노출되는 것을 방지할 수 있습니다.
- 클라이언트가 접속하려는 서버가 신뢰할 수 있는 서버인지를 판단할 수 있습니다.
- 통신 내용의 악의적인 변경을 방지할 수 있습니다.
- 클라이언트가 접속한 서버가 신뢰할 수 있는 서버임을 보장합니다.
CA
인증서는 접속한 서버가 클라이언트가 의도한 서버가 맞는지 보장하는 역할을 합니다. 이 역할을 하는 민간 기업들이 있는데 이러한 기업들을 CA혹은 Root Certificate라고 부릅니다.
SSL 인증서의 내용
SSL 인증서에는 서비스의 정보와 서버 측 공개키라는 정보들을 담고 있습니다. 서비스의 정보는 접속한 서버가 클라이언트가 의도한 서버가 맞는지에 대한 내용을 담고 있고, 서버 측 공개키는 서버와 통신할 때 사용할 공개키의 내용과 공개키의 암호화 방법들의 정보를 담고 있습니다.
SSL의 동작 방법
Handshake
실제 데이터를 주고 받기 전에 클라이언트와 서버는 일종의 인사인 Handshake를 합니다. 이 과정을 통해서 서로 상대방이 존재하는지, 또 상대방과 데이터를 주고 받기 위해서는 어떤 방법을 사용해야 하는지를 파악합니다. SSL 방식을 이용해서 통신을 하는 브라우저와 서버 역시 Handsahke를 하는데, 이 때 SSL 인증서를 주고 받게 됩니다.이 단계에서 클라이언트와 서버가 통신하는 과정을 순서대로 살펴보면 다음과 같습니다.
(1) 클라이언트가 서버에 접속합니다. 이 단계를 Client Hello라고 합니다. 이 단계에서 주고 받는 정보는 아래와 같습니다.
- 클라이언트 측에서 생성한 랜덤 데이터
- 클라이언트가 지원하는 암호화 방식틀: 클라이언트와 서버가 지원하는 암호화 방식이 서로 다를 수 있기 때문에 상호간에 어떤 암호화 방식을 사용할 것인지에 대한 협상을 해야 합니다. 이 협상을 위해서 클라이언트 측에서는 자신이 사용할 수 있는 암호화 방식을 전송하게 됩니다.
- 세션 아이디: 이미 SSL Handshaking을 했다면 비용과 시간을 절약하기 위해서 기존의 세션을 재활용하게 되는데 이 때 사용할 연결에 대한 식별자를 서버 측으로 전송합니다.
(2) 서버는 Client Hello에 대한 응답으로 Server Hello를 하게 됩니다. 이 단계에서 주고 받는 정보는 아래와 같습니다.
- 서버 측에서 생성한 랜덤 데이터
- 서버가 선택한 클라이언트의 암호화 방식: 클라이언트가 전달한 암호화 방식 중에서 서버 쪽에서도 사용할 수 있는 암호화 방식을 선택해서 클라이언트로 전달합니다. 이로써 암호화 방식에 대한 협상이 종료되고 서버와 클라이언트는 이 암호화 방식을 이용해서 정보를 교환하게 됩니다.
- 인증서
(3) 클라이언트는 서버의 인증서가 CA에 의해서 발급된 것인지를 확인하기 위해서 브라우저에 내장된 CA 리스트를 확인합니다. CA리스트에 인증서가 없다면 사용자에게 경고 메시지를 출력하게 됩니다. 인증서가 CA에 의해서 발급된 것인지를 확인하기 위해서 브라우저에 내장된 CA의 공개키를 이용해 인증서를 복호화 합니다. 복호화에 성공했다면 인증서는 CA의 개인키로 암호화된 문서임이 암시적으로 보증된 것입니다. 이러한 절차로 인증서를 전송한 서버를 신뢰할 수 있게 됩니다.
클라이언트는 서버의 랜덤 데이터와 클라이언트가 생성한 랜덤 데이터를 조합해서 pre master secret이라는 키를 생성하게 됩니다. 이 키는 뒤에서 살펴볼 세션 단계에서 데이터를 주고 받을 때 암호화하기 위해서 사용될 것입니다. 이 때 사용할 암호화 기법은 비공개키이기 때문에 pre master secret 값은 제 3자에게 절대로 노출 되어서는 안됩니다.
(4) 서버는 클라이언트가 전송한 pre master secret 값을 자신의 비공개키로 복호화합니다. 이로서 서버와 클라이언트 모두 pre master secret 값을 공유하게 되었습니다. 그리고 서버와 클라이언트는 모두 일련의 과정을 거쳐서 pre master secret 값을 master secret 값으로 만듭니다. master secret은 session key를 생성하는데 이 session key 값을 이용해서 서버와 클라이언트는 데이터를 비공개키 방식으로 암호화한 후에 주고 받게 됩니다.
세션
세션은 실제로 서버와 클라이언트가 데이터를 주고 받는 단계입니다. 이 단계에서 핵심은 정보를 상대방에게 전송하기 전에 session key 값을 이용해서 비공개키 방식으로 암호화 한다는 점입니다. 암호화된 정보는 상대방에게 전송될 것이고, 상대방도 session key 값을 알고 있기 때문에 암호를 복호화할 수 있습니다.