인터넷에서 내 정보를 어디론가 전달하거나, 열람 하는 경우가 많다.
예를 들면, 포털 사이트에 내 아이디와 비밀번호를 입력하여 로그인을 하거나,
은행 사이트에 들어가서 내 계좌정보를 조회하는 경우 등이 있다.
만약 인터넷에서 누군가가 귀중한 정보를 송수신하는 동안에 정보를 몰래 감시해서,나의 정보를 보거나, 악용한다면 더이상 안전한 거래를 할 수 없을것이다.
HTTP는 암호화 되지 않는 방법으로 데이터를 전송하기 때문에
서버와 클라이언트가 주고 받는 데이터를 스니핑 하는것이 매우 쉽다.
이를 방지하기 위해 만든 것이 HTTPS이다.
HTTPS는 HTTP에 Secure라는 말이 추가 된 것이다.
즉, HTTPS는 보완이 강호된 HTTP라는 것을 짐작할 수 있다.
인터넷은 안전한 통신을 위하여 암호화를 한다.
암호화란 일반적인 평문을 알아볼 수 없도록 암호문으로 만드는 과정이다.
암호문을 상대방에게 전달하고, 상대방은 이를 다시 복호화 하여 평문으로 볼 수 있다.
이와 같은 과정을 웹 브라우저와 웹 서버에서 사용하는 대표적인 기술이 바로
HTTPS(Hyper-Text-Transfer-Secure)이다.
인터넷 콘텐츠를 전달하는 TCP프로토콜의 일종인 HTTP에 Secure 기능을 더한 것 이다.
HTTPS는 SSL(Secure Socket Layer)/TLS(Transport Layer Security)전송 기술을 사용한다.
TCP,UDP와 같은 일반적인 인터넷 통신에 보안계층을 추가 하는 방식이다.
그리고 이 기술을 구현하기 위해 웹 서버에 설치하는것이 SSL/TLS 인증서 이다.
TLS는SSL의 개선 버전으로, 최신 인증서는 TLS를 사용하지만 편의상 SSL인증서라고 부르고 있다.
대칭키 암호화 박식이란, 하나의 키로 평문을 암호화 하고 , 다시 암호문을 복호화 할때 같은 키를 사용하는 방식이다.
대칭키 암호화 방식은 키를 단 하나만 사용한다는 간편함이 있지만,
같은 키를 사용하기 위해선 클라이언트에서 서버로 대칭키를 보내야하고,
이 키가 중간에 가로채져 악용 될 수 있다는 단점이 있다.
공개키 암호화 방식은 공개키,개인키 이렇게 두개의 키를 한 쌍으로 각각 암호화/복호화에 사용한다.
일반적으로 공개키로 암호화를 하고 개인키로 복호화를 진행한다.
개인키를 먼저 만들고, 여기서 공개키를 파생하여 한 쌍의 키를 만들기 때문에
key pair라 부르기도 한다.
만약 같은 쌍이 아닌 키를 사용하려면 암호화/복호화가 불가능하다.
공개키는 말 그대로 누구에게나 공개할 수 있는 키이다.
엇필 들으면 보안에 사용하는 키를 누구에게나 공개 할 수 있다는 점이 불안해 보일 수 있지만,
개인키 없이는 복호화가 불가능 하기 때문에 안전하다.
참고) 개인 키와 공개 키는 쌍으로 동시에 생성이 된다.
비공개키의 소유자는 비공개 키를 이용해서 정보를 암호화 한 후에 공개키와 함께 암호화된 정보를 전송한다.
정보와 공개키를 획든한 사람은, 공개키를 이용해 암호화된 정보를 복호화한다.
이 과정에서 공개키가 유출 된다면, 의도하지 않은 공격자에 의해 데이터가 복호화될 위험이 있다.
이런 위험에도 불구하고 비공개키를 이용해 암호화 하는 이유는 뭘까?
비공개키는 데이터를 보호하는것이 목적이 아니다.
암호화된 데이터를 공개키를 가지고 복호화할 수 있다는 것은 그 데이터가 공개키와 쌍을 이루는 비공개키에 의해서 암호화되었다는 것을 의미힌다.
즉, 공개키가 데이터를 제공한 사람의 신원을 보장해주는 것이다.
이러한 것을 전자서명 이라 한다.
SSL을 적용하기 위해서는 인증서가 필요하다.
SSL인증서는 아래의 2가지를 제공한다.
CA는 이 SSL인증서를 발급해 주는 기업이다.
인증서가 보안에 관련된 것인만큼 CA는 신뢰할 수 있는 기업에서만 가능하다.
SSL 인증서 및 내용은 CA에 의해서 암호화 된다.
이때 CA는 자신의 비공개키로 서버가 제출한 인증서를 암호화한다.
CA의 비공개키는 절대로 유출되어서는 안된다.
브라우저는 내부적으로 CA의 리스트를 미리 알고 있다.
즉, 브라우저 소스안에 CA리스트가 존재한다.
CA리스트 뿐만 아니라,각 CA의 공개키도 이미 브라우저 안에 내장되어 있다.
브라우저가 서버에 접속할 때, 서버는 클라이언트에게 인증서를 제공한다.
브라우저는 서버에서 받은 인증서가 자신이 가지고 있는 CA리스트에 있는가를 확인한다.
비교 후 정상적인 인증서면,해당 CA의 공개키를 이용하여, 인증서를 복호화한다.
복호화가 되었다면, 그 인증서는 CA의 비공개키로 암호화된것을 의미한다.
즉, 해당 CA에 의해 정상적으로 발급된 인증서라는 의미가 되며, 그것은 클라이언트가 접속한 서버에서 제공한 인증서가 해당 CA에 의해 정상적으로 발급됐다는 의미이다.
클라이언트, 서버 간의 통신을 하기 전 실제 통신을 할 수 있는지, 서로 검토하는 단계 이다.
클라이언트가 서버에 처음 접속하게 되는 시점, 단계를 client hello라 하고,
또한, 서버는 Client Hello에 대한 응답으로 Server Hello를 하게 된다.
Client Hello 단계
Sever Hello 단계
Client 인증 단계
클라이언트는 서버의 인증서가 CA에 의해서 발급된것인지를 확인하기 위해
클라이언트에 내장된 CA리스트를 확인힌다.
CA리스트에 인증서가 없다면 사용자에게 경고 메세지를 출력한다.
인증서가 CA에의해서 발급된 것인지를 확인하기 위해 클라이언트에 내장된 CA의 공개키를 이용해서 인증서를 복호화한다.
복호화에 성공했다면, 인증서는 CA의개인키로 암호화된 문서임이 암시적으로 보증된 것이다.
클라이언트는 server hello단계에서 받은 랜덤한 데이터와 client hello단계에서 생성한 랜덤한 데이터를 조합하여 pre master secret키를 생성한다.
이 키는 데이터를 주고 받을때 사용하기 위한 암호화 키이며, 대칭키 방식으로 사용되어질 키 값이다.이 키는 절대 제 3자에게 노출되어서는 안된다.
pre master secret키 값을 서버에게 전달할 때 서버가 제공한 공개키로 암호화하여 전송하며, 서버는 자신의 비공개키로 복호화하여 값을 취득한다.
클라이언트가 사용한 공개키는 Server Hello 단계에서 전달받은 인증서 안에 들어있다.
Sever 인증 단계
실제로 서버와 클라이언트가 데이터를 주고 받는 과정이다.
상대방에게 데이터를 송수신하기 전,악수 단계에서 발생한 새션키 값으로 데이터를 대칭키방식으로 암호화 한다.
암호화된 데이터는 상대방으로 송신되며, 상대방도 세션키를 알고 있기 때문에 데이터를 복호화할 수 있다.
SSL통신은 공개키 방식, 대칭키 방식의 하이브리드 조합으로 통신한다.
공개키 방식은 컴퓨터 자원을 많이 사용함으로 비용이 많이 들며, 또한 대칭키 방식만 사용하게 되면 인터넷 상 대칭키를 서로 주고 받아야 하는 상황에서 보안생 매우 위험하다.
그래서 속도는 느리지만, 데이터를 안전하게 주고 받을 수 있는 공개키 방식으로 대칭키를 암호화 하고, 실제 데이터를 주고 받을때는 대칭키를 이용해서 데이터를 주고 받는 것이다.