HTTP는 간단한 프로토콜인 만큼 나름대로의 장점이 있지만, 통신에 있어 암호화를 사용하지 않기 때문에 보안에 취약하다.
따라서 HTTP에 SSL을 추가해 HTTP 통신의 보안 취약점을 해결한 것이 HTTPS이다.
즉, HTTPS는 인터넷 상에서 정보를 암호화하는 SSL 프로토콜을 사용하여 클라이언트와 서버가 데이터를 주고받는 통신 규약이다.
기본적으로 TCP/IP 포트 번호는 443을 사용하며, TLS(Transport Layer Security)라고도 한다.
TCP/IP 모델(초록색 테두리)에서는 전송 계층과 응용 계층간의 통신을 위해 소켓을 사용하며, 두 계층 사이에는 어떠한 계층도 존재하지 않는다.
하지만 HTTPS 프로토콜은 전송 계층과 응용 계층 사이에 SSL 계층이 추가되어 있다. 따라서 TCP는 SSL과 통신하고 SSL은 HTTP와 통신하는 구조가 되어 HTTP는 SSL 위에서 동작하게 된다.
SSL을 사용하면 성능이 조금 느리지만, 보안이 중요하기 때문에 SSL 사용을 권장하고 있다.
HTTPS를 사용하려면 신뢰할 수 있는 사이트라는 것을 인증할 수 있는 인증서가 필요하다.
인증서는 클라이언트가 접속하려는 웹 사이트(서버)가 신뢰할 수 있는 사이트인지 보장한다.
즉, 클라이언트는 접속하려는 사이트가 공인된 기관(CA)으로부터 SSL 인증서를 발급받았는지를 통해 신뢰할 수 있는 사이트인지 보장받는다.
Root CA(Certificate Authority)
무조건 신뢰할 수 있는 최상위 인증 기관이다.
이 기관들은 본인들만의 고유한 비밀 키를 가지고 있고, 이에 대응하는 공개 키를 전 세계에 배포한다.
기관의 고유한 비밀 키는 절대로 유출되지 않아야한다는 전제 조건이 필요하지만, 이러한 기관들은 보안을 전문으로 하는 회사이기 때문에 보통 안전하다고 생각하면 된다.
우리가 사용하는 크롬, 파이어폭스 등 브라우저에는 이미 공개 키가 내장되어 있다.
인증서는 SSL 통신에 사용할 공개 키를 클라이언트에게 제공한다. 클라이언트는 제공받은 공개 키를 통해 서버와 통신을 할 때 데이터를 암호화, 복호화 할 수 있다.
1. 서버(웹 사이트)는 공개 키와 개인 키를 만들고, 인증 기관에 자신의 정보와 공개 키를 준다.
2. 인증 기관은 서버의 정보를 검증하고, 인증 기관의 개인 키로 해당 정보를 암호화하여 인증서를 발급한다.
1. 클라이언트(브라우저)가 서버에 접속하면 서버는 클라이언트에게 인증서를 전송한다.
2. 클라이언트는 미리 알고 있던 인증 기관의 공개 키로 서버의 인증서를 복호화한 후 검증한다.
3. 클라이언트는 랜덤으로 대칭 키를 생성하고 서버의 공개 키로 암호화하여 서버에 보낸다.
4. 서버는 암호화 된 대칭 키를 서버의 개인 키로 복호화하고, 이후부터 클라이언트와 서버는 대칭 키로 통신을 할 수 있게 된다.
[참고]