HTTPS 설명하기
HTTPS를 잘 이해해보자. HTTP는 TCP 연결 이후 평문으로 요청을 전달한다. 즉, 중간에 탈취되었을 때 내용이 모두 노출된다는 것이다. 이런 문제를 해결하기 위해서 HTTPS를 사용한다. 어떻게 암호화 하는 건지 정리해봤다.
HTTP Over Secure Socket Layer 의 약자이다. 평문을 암호화 해서 보내는 것이 핵심 기술이다. 여기에 사용되는 방식은 비대칭키, 대칭키 암호화 방식이 사용된다.
비대칭키 (공개키 암호 방식)
공개키 암호화 방식이라고도 하는 비대칭키 방식은, 두 개의 키를 가지고 암호화 및 복호화가 이루어진다. 하나는 공개키, 다른 하나는 비밀키라고 불린다. 공개키는 누구나 알아도 되지만, 비밀키는 소유자만이 알고 있어야 한다. 공개키 암호 방식은 두 가지 역할을 할 수 있다. 첫 번째는 암호화, 두 번째는 인증이다. 암호화는 암호화 방식이라는 이름에 맞게, 컨텐츠를 암호화 하고, 그 내용을 특정 사람만 확인할 수 있게 하는 방식이다. 공개키로 암호화 한 내용은 개인키로 복호화 할 수 있고, 개인키로 암호화 한 내용은 공개키로 복호화 할 수 있다. 인증은 해당 내용을 특정 대상이 맞음을 확인하는 것이다. 비밀키로 암호화 한 내용은 공개키로만 복호화 가능하기 때문에, 이 내용을 특정인이 보냈음을 확신할 수 있다. 이 두 가지 기능이 HTTPS에서 모두 적절하기 잘 활용된다.
대칭키 방식은 암호화 하는 키와 복호화 하는 키가 같다.
인증
HTTPS에서 인증이란, 자신이 받은 정보가, 올바른 사람이 전송한 것이 맞는지 확인하는 것을 인증이라고 할 수 있다. 공개키 방식은 누구나 공개키를 획득할 수 있기 때문에, 비밀키로 암호화한 정보는 암호화의 의미가 없다. 그러나 비밀키로 암호화한 정보를 공개키로 복호화 할 수 있다는 것은, 다시 말해 암호화 한 주체가 틀림없이 비밀키를 가지고 있음을 인증한다고 말할 수 있다. 이것이 “인증서”의 원리이다.
SSL 인증서
인증서는 다음 두 가지 역할을 하게 된다.
- 클라이언트가 접속한 서버가 신뢰할 수 있는 서버임을 보장한다.
- SSL 통신에 사용할 공개키를 클라이언트에게 제공한다.
CA (Certificate Authority)
클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지를 보장하는 역할을 하기 위해서, 특정 민간 기업이 이 역할을 해준다. 이런 기업들을 CA, 혹은 Root Certificate라고 한다. 이 CA는 브라우저에 탑재되어 있다. 브라우저는 CA의 리스트와 함께 인증서를 복호화 하기 위한 CA의 공개키를 가지고 있다.
사설 인증 기관
개발이나 사적인 목적을 위해, SSL의 암호화 기능을 이용할 때, 직접 CA 역할을 할 수 있다. 이 경우에는 브라우저가 경고를 표시한다.
서비스의 보증
인증서 안에는 다음과 같은 내용이 포함되어있다.
- 서비스의 정보(CA, 서비스 도메인 등)
- 서버의 공개키 (공개키 내용 및 암호화 방법 등)
브라우저는 처음 서버에 접근할 때, 인증서를 받게 되고, 해당 인증서가 공인된 (브라우저에 저장된) CA 리스트 안에 있는 회사의 인증서임을 확인한다면, 알고 있는 공개키로 인증서를 복호화한다. 복호화가 가능하다는 것은 해당 인증서를 발급한 기관이 틀림 없이 보증된 회사임을 증명하는 것이다.
그렇다면 이제 브라우저는 위 “서비스의 정보”와 “서버의 공개키”가 생겼다. 이제 브라우저는 서버의 공개키를 통해 HTTP 평문을 암호화 할 수 있게 되었다. 이하 내용은 구체적으로 SSL이 어떻게 동작하게 되는 것인지를 담고 있다.
SSL 동작
실제로는 HTTP 내용을 비대칭키 방식으로 데이터를 암호화 하는 것이 아니다. 공개키 방식으로 암, 복호화 하는 과정은 컴퓨팅 파워의 소비가 필요하기 때문에, 실제 내용은 비교적 컴퓨팅 파워가 덜 소모되는 대칭키를 통해 암, 복호화 하게 된다.
우선 서버와 클라이언트가 연결되면서, Handshake 과정을 거치게 된다. 다음과 같은 과정을 지난다.
Client Hello
클라이언트가 서버에 접속하고 다음 정보를 가져온다.- 클라이언트에서 생성한 랜덤 데이터
- 클라이언트가 지원하는 암호화 방식: 클라이언트와 서버측이 사용할 암호화 방식에 대한 협상을 위해 클라이언트가 사용 가능한 암호화 방식을 전송한다.
- 세션 아이디: 이미 SSL Handshaking이 이루어진 상태라면, 기존 세션을 재활용하게 된다. 이때 사용할 세션 아이디를 서버에 전송한다.
Server Hello
서버는 클라이언트 Hello를 받고 다음 응답을 보내준다.- 서버측에서 생성한 렌덤 데이터
- 서버가 선택한 클라이언트 암호방식: 클라이언트가 전달한 암호화 방식 중, 서버에서도 사용할 수 있는 암호화 방식을 선택해 클라이언트로 전달한다.
- 인증서
클라이언트가 가지고 있는 CA 리스트에서 인증서를 확인한다. CA 리스트 중에 있다면, 가지고 있는 해당 CA의 공개키를 통해 복호화한다.
클라이언트는 서버의 랜덤 데이터와 클라이언트의 랜덤 데이터를 조합해pre master secret
이라는 키를 생성한다. 이 키는 이후 데이터를 암호화 하기 위해 사용된다. 위에서 언급했듯, 데이터를 암호화 하는 기법은 대칭키이므로 외부에 노출되어선 안된다.
이제 만든pre master secret
을 전달해야 한다. 이 값을 안전하게 전달하기 위해서 인증서에서 획득한 공개키로 암호화해 서버로 전송하게 된다.서버는
pre master secret
을 개인키로 복호화한다. 이제 클라이언트와 서버 모두pre master secret
키 값을 가지고 있는데, 일련의 과정을 통해master secret
을 만든다. 그리고 이 키값을 통해 세션 키를 만들게 된다. 이 세션 키를 이용해 서버와 클라이언트는 데이터를 대칭키 방식으로 암호화한 후 주고 받는다.클라이언트와 서버는 핸드쉐이크 단계의 종료를 서로에게 알린다.