이 장에서는 디지털 암호화를 이용해 도청이나 위조로부터 HTTP 트랜잭션을 안전하게 보호하는 더 복잡하고 적극적인 기술을 제시한다.
웹은 중요한 트랜잭션(인터넷 뱅킹 등)을 위해 HTTP와 디지털 암호화 기술을 결합한 안전한 방식의 HTTP를 필요로 한다.
HTTPS는 HTTP 를 안전하게 만드는 방식 중에 가장 널리 사용되는 것이다.
HTTPS를 사용하면 모든 HTTP 요청과 응답 데이터가 네트워크로 보내지기 전에 암호화된다.
HTTPS는 HTTP 하부(TCP 위, HTTP 아래)에 전송 레벨 암호보안 계층을 제공함으로써 동작한다. 이 보안 계층은 SSL
혹은 TLS
(SSL을 계승, 이 책에서는 SSL로 통일하여 부른다)을 이용해서 구현한다.
어려운 인코딩 및 디코딩 작업의 대부분이 SSL 라이브러리에서 이뤄지기 때문에 HTTPS를 사용하기 위해 웹 클라이언트와 서버가 프로토콜을 처리하는 로직을 크게 변경할 필요가 없다.
HTTPS는 HTTP 프로토콜에 대칭, 비대칭 인증서 기반 암호 기법의 강력한 집합을 결합한 것이다.
HTTPS는 그냥 보안 전송 계층을 통해 전송되는 HTTP 이다.
HTTP 메시지를 TCP 로 보내기 전에 먼저 그것들을 암호화하는 보안 계층으로 보낸다.
HTTPS를 사용하는 것을 말해주기 위해서 URL의 스킴에 http 대신 https를 접두사로 사용한다.
클라이언트는 트랜잭션 수행을 요청받으면 URL의 스킴을 검사하여 https인 경우 443 포트로 연결한다.
HTTPS에서의 절차는 SSL 보안 계층 때문에 좀 더 복잡하다.
HTTPS에서 클라이언트는 먼저 웹서버의 443포트로 연결한다.
일단 TCP연결이 되면 클라이언트와 서버는 암호법 매개변수와 교환 키를 협상하면서 SSL 계층을 초기화 한다.
핸드셰이크가 완료되면 SSL 초기화가 완료되고 클라이언트는 요청 메시지를 보안 계층에 보낼 수 있다. 이 메시지는 TCP 로 보내지기 전에 암호화 된다.
암호화된 HTTP 메시지를 보내기 전에, 클라이언트와 서버는 SSL 핸드셰이크
를 할 필요가 있다.
<SSL 핸드셰이크에서 일어나는 일>
보안 HTTPS 트랜잭션은 항상 서버인증서를 요구한다.
사용자가 서버에 개인정보 등을 보내기 전에 그 서버를 얼마나 신뢰할 수 있는지 평가하는 것을 도와준다.
SSL 은 복잡한 바이너리 프로토콜로, SSL 클라이언트와 서버 프로그래밍을 쉽게 만들어주는 상용 혹은 오픈 소스 라이브러리들이 존재한다.
OpenSSL 은 SSL과 TLS의 가장 인기 있는 오픈 소스 구현이다.
클라이언트는 종종 웹 프락시 서버를 이용한다. 많은 회사가 기업 네트워크와 공공 인터넷을 잇는 경계에 보안을 위한 프락시를 설치하고, 이 프락시는 방화벽 리우터가 HTTP트래픽의 교환을 허락한 유일한 장치이므로, 이 프락시를 통해 접근해야 한다.
그러나 클라이언트가 서버로 보낼 데이터를 서버의 공개키로 암호화하기 시작했다면 프락시는 더이상 HTTP 헤더를 읽을 수 없고, 프락시는 요청을 어디로 보내야 하는지 알 수 없어진다. (프락시는 암호화된 요청을 다룰 수 없다.)
HTTPS가 프락시와도 잘 동작할 수 있게 하기 위해 HTTPS SSL 터널링 프로그램
을 사용한다.
1. 클라이언트는 먼저 프락시에게 자신이 연결하고자 하는 안전한 호스트와 포트를 말해준다.
2. 클라이언트는 이 내용을 프락시가 읽을 수 있도록 암호화가 시작되기 전에 평문으로 말해준다. 이를 CONNECT라는 메서드를 이용해서 말해준다.
3. 2번이 완료되면 클라이언트와 서버 사이에서 데이터가 직접 오갈 수 있게 해주는 터널을 만든다.