HTTP는 기본적으로 클라이언트와 서버사이에서 데이터를 주고받는 통신 프로토콜이다. 그러나 HTTP에는 단점이 존재했는데 주고 받는 데이터가 전송될 때 암호화되지 않기 때문에 보안에 취약하다는 것이었다. 이러한 문제를 해결하기 위해 중요한 정보를 주고 받을 때 도난당하는 것을 막게 하는 프로토콜이 생성되었다. 이를 HTTPS라고 한다. 기존의 HTTP를 암호화한 버전이 HTTPS가 된 것이다. SSL(Secure Socket Layer)이라는 프로토콜을 사용해 주고 받는 정보를 암호화한다. 이후 SSL은 TLS (Transport Layer Security)로 발전되어 현재는 SSL/TLS라는 단어를 혼용해서 사용하고 있다.
SSL이 동작하는 방식을 알기 위해서는 기본적인 암호화의 개념을 알아야 한다. 암호화(encryption)는 어떤 정보를 아무나 읽지 못하도록 키를 가지고 특정 알고리즘을 돌려 정보를 숨기는 것을 말한다. 키를 가지고 다시 알고리즘을 역행하면 복호화(decryption)가 된다. 키가 없으면 암호화와 복호화를 하지 못하기 때문에 키는 굉장히 중요한 역할을 한다고 볼 수 있다. 키도 여러가지 종류가 있는데 어떤 키를 사용할 것인가에 따라 암호화하고 복호화하는 방식도 달라진다.
- 공개키(Public Key)와 비밀키(Private Key) : 공개키는 모두가 볼 수 있는 키이며 비밀키는 소유자만이 가지고 있는 키로 암/복호화에 사용된다.
- 대칭키 암호화 : 서버와 클라이언트가 암호화/복호화에 동일한 비밀키를 사용하는 방식, 키를 공유하는데 어려움이 있으나 속도가 빠르다.
- 비대칭키 암호화 : 서버와 클라이언트가 암호화/복호화에 각각 다른 비밀키를 사용하는 방식, 공개키를 통해서 암호화를 하고 비밀키를 통해서 복호화를 한다. 공개키는 공개해도 상관없으니 키 관리에 어려움이 없으나, 속도가 느리다.
- 인증기관(Certificate Authority, CA) : 클라이언트가 접속을 요청한 서버가 의도한 서버가 맞는지 인증해주는 역할을 하는 보증된 기업들이다. 클라이언트는 서버에 요청을 해서 CA가 발급한 인증서를 받은 뒤 CA의 공개키로 복호화하여 신뢰할 만한 인증서인지 검증한다. CA의 공개키로 복호화되는 자료는 오직 CA의 비밀키로 암호화한 경우밖에 없기 때문에 복호화되면 신뢰할 만한 것이다.
SSL은 대칭키 방식과 비대칭키 방식을 적절히 섞어서 사용하면서 신뢰도를 높인다. 그 좋은 비대칭키 방식을 놔두고 대칭키를 혼용하여 사용하는 이유는 비대칭키의 방식이 컴퓨터에 과부화를 주기 때문이다. 그래서 처음에는 비대칭키를 사용해 대칭키를 공유한 후에 대칭키를 이용해 데이터를 주고 받는다. 세션이 종료되면 사용한 대칭키를 폐기하는 방식으로 보안성을 높인다.
- 클라이언트가 서버에 접속하기 위해 클라이언트가 생성한 랜덤 데이터(1)를 서버에 보낸다.
- 서버는 클라이언트에게 서버가 생성한 랜덤데이터(2)와 CA에서 발급받은 인증서를 보낸다. 인증서가 필요한 이유는 서버가 신뢰할 만한 서버인지 확인하기 위함이다.
- 클라이언트는 그 인증서를 받아 CA의 공개키로 복호화 한다. 인증서를 복호화 하면 접속하려는 사이트의 정보와 사이트의 공개키가 들어있다.
- 랜덤데이터1과 랜덤데이터2를 조합하여 대칭키로 사용할 것인데 이는 탈취당하면 안되기 때문에 인증서에 들어있던 공개키로 암호화하여 서버에 전송한다.
- 서버는 가지고 있는 비밀키를 이용해 복호화하여 클라이언트가 보낸 대칭키를 얻는다.
- 이후 그 대칭키를 통해 데이터를 주고 받는다.
- 세션이 종료되면 대칭키를 폐기한다.
HTTPS와 SSL 인증서, SSL 동작방법 블로그 글에서 가져온 그림인데 이해가 잘 되게끔 정리가 잘 되어 있다.