HTTPS와 SSL Handshake
대칭키와 비대칭키
대칭키
하나의 키로 데이터를 암호화하고 복호화한다. 하나의 키로 암호화와 복호화를 할 수 있기 때문에 해당 키가 노출된다면 보안상 아주 치명적인 문제가 발생한다. 하지만 암호화 및 복호화에 드는 비용이 적다는 장점이 있다.
비대칭키
공개 키와 개인 키로 암호화 및 복호화를 수행한다. 공개 키로 데이터를 암호화하면 개인 키로만 복호화가 가능하고 개인 키로 데이터를 암호화하면 공개 키로만 복호화 할 수 있다. 비대칭 키는 보안성이 좋지만 구현하기 어렵고 암호화 및 복호화 속도가 느리다는 단점이 있다.
SSL은 대칭 키 방식과 비대칭 키 방식을 섞어서 사용한다. 대칭키와 공개키 암호화 방식을 적절히 혼합하여 SSL 탄생의 시초가 되었다.
- A가 암호화 통신에 사용할 대칭키를 B의 공개키로 암호화해서 암호화 된 대칭키를 B에게 보낸다.
- B는 암호문을 받아서 자신의 개인키로 복호화하여 대칭키를 얻는다.
- B는 A로부터 얻은 대칭키로 A에게 보낼 평문을 암호화하여 A에게 보낸다.
- A는 자신의 대칭키로 암호문을 복호화한다.
- 대칭키를 이용해서 암호화를 통신한다.
-> 대칭키를 주고받을 때만 공개키 암호화 방식을 사용하고 이후에는 대칭키 암호화 방식으로 통신한다.
CA(Certificate Authority)
사이트 인증서의 역할은 클라이언트가 접속한 서버가 의도한 서버가 맞는지 보장하는 것이다. 이 역할을 도와주는 기업들을 CA라고 부른다. 개발자 입장에서 사이트에 HTTPS를 적용하기 위해서는 신뢰할 수 있는 CA 기업의 인증서를 구입해야한다.
SSL 인증서
SSL 인증서에는 서비스의 정보와 서버 측 공개키가 들어 있다. 이 정보들을 인증 기관의 개인키로 암호화하여 암호화된 인증서를 서버에게 준다. 우리가 사용하는 브라우저에는 CA 기관의 리스트와 해당 기관의 공개 키를 이미 가지고 있으므로, 암호화된 인증서를 복호화할 수 있다.
SSL Handshake의 동작 과정
- ClientHello
클라이언트가 서버에 연결을 시도하며 전송하는 패킷이다. 브라우저가 사용하는 SSL 정보, 암호화 방식 모음, 세션 아이디 등의 정보를 담고 있다.
cipher suit란 보안의 궁극적 목표 (안전한 키 교환, 전달 대상 인증, 암호화 알고리즘, 메시지 무결성 확인 알고리즘)를 달성하기 위해 사용하는 방식을 패키지 형태로 묶어 놓은 것을 의미한다.
- ServerHello
브라우저의 암호화 방식 정보 중에서 서버가 지원하고 선택한 암호화 방식을 보내준다. 또한 SSL 프로토콜 버전 등의 정보도 담고 있다.
- Certificate
서버가 자신의 SSL 인증서를 클라이언트에게 전달한다. 인증서에는 서버가 발행한 공개 키를 담고 있고 CA의 개인키를 이용해 암호화되어 있는 상태다.
- ServerHello Done
서버의 공개 키가 SSL 인증서 내부에 없는 경우, 서버가 직접 전달한다는 뜻이다. 인증서 내부에 서버의 공개 키가 있다면 클라이언트가 CA의 공개 키를 통해 인증서를 복호화 한 후 서버의 공개키를 확보할 수 있다. 그리고 서버가 행동을 마쳤음을 전달한다.
- Client Key Exchange
클라이언트는 개인키로 암호화된 SSL 인증서를 모두에게 공개된 CA의 공개 키를 사용하여 복호화하는데, 복호화에 성공하면 이 인증서가 진짜임을 검증할 수 있다. 만약 등록된 CA가 아니거나, 위조 인증서라면 브라우저 경고를 보낸다.
브라우저는 자신이 생성한 난수와 서버의 난수를 사용해 premaster secret을 만든다. 서버의 공개키로 이것을 암호화하여 서버로 전송한다.
서버는 개인키로 브라우저가 보낸 premaster secret 값을 복호화하여 세션키를 생성한다. 세션 키는 대칭키 암호화에 사용할 키이다. 통신이 끝나면 세션키를 폐기한다.
- ChangeCipherSpec / Finished
ChangeCipherSpec 패킷은 클라이언트와 서버 모두가 서로에게 보내는 패킷으로, 교환할 정보를 모두 교환한 뒤 통신할 준비가 다 되었음을 알리는 패킷이다. 그리고 Finished 패킷을 보내어 SSL Handshake를 종료하게 된다.
HTTPS(HyperText Transfer Protocol Secure)
HTTPS는 기본 골격이나 사용 목적 등은 HTTP와 거의 동일하지만, 데이터를 주고 받는 과정에 보안 요소가 추가되었다는 것이 가장 큰 차이점이다. HTTPS를 사용하면 서버와 클라이언트 사이의 모든 통신 내용이 암호화된다. HTTPS는 SSL이나 TLS 프로토콜을 통해 세션 데이터를 암호화하는데 SSL은 서버와 브라우저 사이에 안전하게 암호화된 연결을 만들 수 있게 도와주고 서버와 브라우저가 민감한 정보를 주고받을 때 정보가 도난당하는 것을 막아준다.
참고
https://brunch.co.kr/@sangjinkang/38
https://hanjungv.github.io/2017-11-07-1_CS_SSL/