HTTPS
HTTPS는 HTTP 프로토콜상에 SSL 레이어를 추가한 통신 프로토콜로, 암호화된 HTTP 통신 프로토콜이다.
서버와 클라이언트 간의 통신에서 중간에 악성 행위자로 하여금 데이터가 가로채어지거나 변조되지 않도록 하는 데이터의 전송과정에서의 보안 요소로, 기밀성과 무결성을 보장한다.
SSL 인증서
SSL/TLS 프로토콜을 이용해 다른 시스템에 암호화된 안전한 연결을 수행할 수 있도록 하는 디지털 객체
SSL 인증서는 주로 웹 서비스와 사용자 간에 신뢰할 수 있는 통신을 위해 사용된다. SSL 인증서는 제3 인증기관(CA)이 발급해주며,
브라우저의 URL 좌측에서 HTTPS로 연결된 사이트에 대한 SSL 연결과 그 인증서 내용을 확인할 수 있다.
근래 거의 대부분의 웹 사이트에는 HTTPS를 사용해 연결하도록 되어있으며, HTTP 통신을 수행하는 경우 접속 시 경고문을 띄워주기까지 하는 것을 볼 수 있다.
SEO 방면에서도 SSL 인증서를 통한 HTTPS 지원 사이트에 대한 우선순위를 주기도 하니 웹 서비스 운영에 있어서는 기본 중에 기본인 단계라고 보아도 무방할 정도다.
SSL 인증서 구조
SSL 인증서는 기본적으로 아래와 같은 5가지를 가지고 있다.
- 인증서 소유자의 퍼블릭 키
- 인증서 일련번호
- 인증서 소유자 정보 (도메인 이름)
- 인증서 유효기간
- 인증서 발급기관(CA)
SSL 인증서 발급
- 인증서를 발급받기 원하는 서버가 인증기관(CA)에 인증서 발급 요청
- CA는 CA의 프라이빗 키를 통해 해당 서버에 대해 인증서를 발급
이와 같은 과정을 거쳐 서버는 CA로부터 (CA의 프라이빗 키로 암호화된) SSL 인증서를 발급받게 되며, HTTPS 접근하는 클라이언트들을 대상으로 이 인증서를 전달함으로써 신뢰할 수 있는 사이트임을 검증받게 된다.
각 브라우저와 OS에는 대표적인 CA들의 퍼블릭 키가 내장되어 있기 때문에, 접근하고자 하는 서버가 주는 SSL 인증서를 검증할 수 있게 되는 것이다.
CA의 계층
CA는 계층 구조를 가지고 있다.
가장 최상단에 위치한 CA는 Root CA라고 하며, Root CA가 인증한 인증서는 무조건 신뢰하게 되어있다.
Root CA의 퍼블릭 키는 모든 브라우저와 OS에 기본적으로 내장되어있으며, 자신을 스스로 인증하는 Self-signed를 거친다.
Root CA 하단에는 Intermediate CA가 존재한다. Intermediate CA의 인증서는 Root CA의 개인키를 통해 서명받아 생성된다.
Intermediate CA는 Root CA로부터 권한을 위임받아 최종 사용자의 인증서 발급을 수행하며, Root CA와 최종 사용자 사이에서 중개를 담당한다.
따라서, 최종 사용자의 인증서는 Intermediate CA의 서명을 통해 생성된다. 이 최종 사용자 인증서의 서명은 Intermediate CA를 거쳐 Root CA까지 거슬러 올라가며 인증받게 된다. [인증서 체인 (Chain of Trust)]
이러한 계층적 구조는 Root CA의 직접적인 노출을 방지하는 이점을 가지고 있다.
HTTPS 통신 과정 ( + SSL 핸드셰이크)
HTTPS를 통한 통신과정은 TCP 핸드셰이크로 연결을 수립한 뒤, 암호화된 통신을 위한 세션키의 공유과정을 거친 뒤 해당 세션 키를 이용한 통신의 세가지 단계로 나누어 볼 수 있다.
TCP Handshake
SSL 핸드셰이크에 앞서 서버-클라이언트 간의 연결을 수립하기위한 기본적인 3 way 핸드셰이크
- 클라이언트 : 연결해도 될까요? [SYN]
- 서버 : ㅇㅋ 요청 잘 들었고, 연결 준비 됐슴다 [SYN+ACK]
- 클라이언트 : 넵 연결 시작합니다 [ACK]
SSL Handshake
TCP 핸드셰이크를 통해 서버와 클라이언트간의 연결을 수립한 뒤, SSL 암호화된 통신을 위해 세션 키를 공유하는 과정
Client Hello
- 클라이언트가 서버에 연결을 시도하는 과정
- 클라이언트는 자신이 사용가능한 Cipher Suite, SSL TLS 버전, 세션 ID, 난수 등의 정보를 전달
Server Hello
- 서버는 Client Hello로 부터 전달받은 값들을 바탕으로 Cipher Suite를 선택하고 클라이언트에 전달
Certificate
- 서버는 자신의 SSL 인증서를 클라이언트에 전달
- 클라이언트는 브라우저에 내장된 CA의 퍼블릭 키를 바탕으로 서버의 SSL 인증서를 신뢰할 수 있는지 검증
Server Hello Done
- 신뢰할 수 있는 사이트로 검증되면 클라이언트는 SSL 인증서 내의 서버의 퍼블릭 키를 획득
- 만약 SSL 인증서 내에 서버의 퍼블릭 키가 없는 경우, 서버가 직접 퍼블릭 키를 전달 [Server Key Exchange]
Client Key Exchange
- 클라이언트는 서버와 실제로 통신하기 위한 세션키(대칭키)를 생성
- 서버의 퍼블릭 키를 바탕으로 생성한 세션키를 암호화 후 서버로 전달
Finished
- 서버는 프라이빗 키를 통해 클라이언트가 전달한 세션키를 획득
데이터 전송
이후 서버와 클라이언트는 동일한 대칭키를 가지게 되며, 모든 통신은 대칭키를 통해 암호화되어 전달된다.