http는 Hyper Text를 전송하기 위한 통신규약입니다.
간단하게 말하면 클라이언트가 http를 통하여 정보를 요청하면 서버는 요청한 정보를 제공하는 클라이언트와 서버간의 정보를 주고받을 때 사용하는 통신규약입니다.
일반적으로 TCP/IP 통신 위에서 동작하며 80번 포트를 사용합니다.
http는 암호화되지 않은 텍스트를 주고받는 것이기 때문에 보안에 취약해서 제 3자가 어렵지 않게 신호를 감청할 수 있기 때문에 나온것이 https입니다.
https는 데이터를 암호화 하는 SSL(Secure Socket Layer)프로토콜을 이용하여 http의 단점을 보완하였고 http와는 다르게 443번 포트를 사용합니다.
데이터를 암호화하여 전송하기 때문에 민감한 정보들을 안전하게 전송할 수 있고, 수신된 데이터가 잘못된 데이터인지, 아닌지 알 수 있습니다.
SSL은 클라이언트와 서버간의 통신의 보안을 위해서 만들어진 프로토콜입니다.
대칭키는 암호를 만드는 행위인 암호화를 할 때와 암호를 푸는 행위인 복호화를 할 때 사용됩니다.
만약 어떤 키를 이용해서 암호화를 한다면 복호화를 할 때는 반드시 암호화를 했을때의 키를 통해서 복호화를 할 수 있습니다.
예를 들어서 암호화를 할 때 1234라는 값을 통해서 암호화를 한다면 복호화를 할 때도 1234라는 값이 필요한 것입니다.
이렇듯 암호화나 복호화 둘 다 동일한 키를 사용한다고 해서 대칭키라고 말합니다.
하지만 이 대칭키에는 아주 큰 단점이 있습니다.
데이터를 송, 수신하는데 대칭키를 전달하는게 너무 어렵다는 것입니다.
만약 키가 유출된다면 암호화를 한 이유가 없어지기 때문에 이 문제를 해결하기 위해서 공개키라는 방식이 나오게 됩니다.
공개키 방식은 공개키(Public Key)와 비공개키(Private Key)를 사용합니다.
공개키로 암호화된 데이터는 오직 비공개키로만 복호화를 할 수 있고, 비공개키로 암호화된 데이터는 오직 공개키로만 복호화를 할 수 있도록 만들어졌습니다.
공개키 방식의 단점은 너무 많은 컴퓨터 파워를 소모한다는 것입니다.
SSL은 공개키와 대칭키를 조합해서 사용하며 악수(handshake)->세션->세션 종료 총 3단계를 거치게 됩니다.
악수(handshake)
handshake는 통신 과정에서 가장 중요한 단계입니다.
어떤 암호화 기법을 사용할지, 대칭키를 어떤 식으로 만들지에 대해서 정보를 주고받습니다.
Client Hello
클라이언트가 서버에 접속하는것을 말합니다. 클라이언트는 서버에 아래의 정보들을 보냅니다.
Client Hello
서버측에서 클라이언트에게 응답합니다. 아래의 정보를 클라이언트에게 회신합니다.
클라이언트는 서버가 보낸 인증서가 CA에서 발급된 인증서인지 클라이언트에 내장된 CA리스트를 확인합니다.(브라우저 내부에 CA리스트가 있음)
만약 없다면 사용자에게 경고메시지를 보냅니다. 이 메시지는 우리가 종종 볼 수 있는 '신뢰할 수 없는 연결'이라는 메시지입니다.
그렇지 않고 CA리스트에 있다면 해당 CA의 공개키를 통해서 인증서를 복호화합니다.
이 과정에서 우리는 이 데이터가 서버측에서 보낸 데이터가 맞다는 것을 확인할 수 있습니다.
그 이유는 CA의 공개키로 복호화가 가능하다는 뜻은 CA의 비밀키로 암호화를 했다는 뜻이기 때문에 해당 인증서는 신뢰할 수 있고 그에 따라 해당 데이터도 신뢰할 수 있게 되는 것 입니다.
수신된 데이터를 신뢰할 수 있으니 클라이언트가 생성한 랜덤데이터와 서버측에서 생성한 랜덤데이터를 조합해서 pre master secret라는 키를 만들게 됩니다.
이제 이렇게 만들어진 키를 인증서 내부에 있는 서버의 공개키를 통해서 암호화를 한 후 서버에 보냅니다.
서버는 클라이언트가 암호화한 pre master secret을 서버의 비밀키로 복호화하게되면 클라이언트와 서버는 동일한 pre master secret을 갖게 되고 일련의 과정을 거쳐서 master secret값으로 만든 후 이 master secret값은 session key를 만드는데 사용됩니다.
이 session key가 서버와 클라이언트가 사용 할 대칭키가 됩니다.
이제 이 대칭키를 통해서 서버와 클라이언트는 암호화된 데이터를 주고받을 수 있게 되었습니다.
클라이언트와 서버는 handshake 단계를 종료합니다.
세션
세션 단계는 실제로 서버와 클라이언트가 정보를 주고받고 주고받는 데이터는 handshake에서 생성한 대칭키인 session key를 통해서 암호화되게 됩니다.
그럼 이렇게 복잡한 과정을 왜 거치게 되는 것 일까요? 그냥 공개키를 사용하면 안되는 것 일까요?
이전에도 말했듯 공개키의 방식은 많은 컴퓨터 파워를 소모하기 때문에 접속자가 많게 되면 그만큼 많은 비용을 지불하게 됩니다. 그렇기 때문에 대칭키와 공개키를 같이 사용하는 것 이죠.
세션 종료
이제 모든 데이터의 전송이 종료되면 SSL통신이 종료되었다는것을 알리고, 사용된 대칭키(session key)를 폐기합니다.
참고
HTTPS와 SSL 인증서
Http와 Https 이해와 차이점 그리고 오해(?)
HTTPS 란 무엇입니까?
웹사이트 보안을 위한 방법, SSL이란?
SSL 인증서에 대한 이해