HTTP는 Hyper Text Transfer Protocol의 약자이다. HTTP 서버와 클라이언트 간에 정보를 어떻게 주고 받을지에 대한 규약이다.
HTTP 통신은 '상태'가 없다는 특징이 있다. '상태'가 없다는 말은 HTTP 통신 하나는 다른 HTTP 통신과 무관하고 독립적으로 요청이 되고 응답을 받는 다는 것이다.
이렇게 '상태'가 없는 특징 때문에 HTTP 통신은 Stateless
하다고 이야기들 한다.
HTTP 통신은 기본적으로 클라이언트와 서버 사이에서 사용하는 통신이고, 클라이언트가 어떤 정보나 행위를 요청(Request)하면, 서버가 그에 대한 응답(Response)을 하는 형태를 띄고 있다.
웹 서비스는 대부분 HTTP 통신을 사용하고 있기 때문에 우리가 웹 브라우저로 웹 서핑을 하는 동안 수 많은 HTTP를 활용한 요청을 서버에게 하는 것이다.
예시로 우리가 구글에 접속할 때, 어떤 HTTP 요청을 하는지 살펴보자. 위 이미지를 보면 뭔가 상당히 많은 정보들과 함께 요청을 보내는 것을 확인할 수 있다.
데이터의 종류가 많을 뿐이지 HTTP 요청은 기본적으로 이런 형식의 문자열이라고 보면 된다.
그렇다면, 이러한 요청에 대한 서버의 응답은 어떻게 생겼을까?
먼저 구글에 접속했을 때 우리가 요청한 것에 대한 응답을 먼저 보자.
역시나 많은 양의 정보가 있지만 핵심만 요약하면 아래와 같은 구조를 갖고 있다.
내 컴퓨터에서 다른 컴퓨터로 특정 정보를 전송한다고 가정해보자. 이 때, 이 정보의 대략적인 이동 경로는 아래와 같은 것이다.
이러한 일련의 네트워크 통신 과정을 7개의 계층으로 나눈 것이 OSI 7계층이다.
이 7개의 계층 중, HTTP 통신이 사용하는 계층은 가장 바깥 쪽에 위치한 7번째 계층이다(Application 계층). 하나의 통신을 7개의 계층으로 나눠서 그렇지 결국에는 하나의 패킷으로 만들어져서 전송이 되는 것이고, HTTP 통신에서 사용하는 정보가 7번째 계층에 해당하는 영역에 기입이 된다는 의미이다.
HTTPS 는 HTTP + Secure의 줄임말이다.
기본적으로는 HTTP와 모든 것이 동일한데, 암호화가 된 문자열로 통신을 주고 받는 것을 의미한다.
예를 들어서 클라이언트가 서버에게 안녕하세요
라고 전달했다면, HTTP통신을 사용할 때는 그대로 안녕하세요
라는 문자열이 네트워크를 통해서 전달이 되는 것이고, HTTPS를 사용할 때는 asdlkfjasldkfjafldkjaldk124jrql2kfwe
뭐 이런 암호화된 문자열이 전달된다.
그래서 중간에 악의적인 의도를 갖고 패킷을 탈취해도 어떤 데이터를 주고 받는지 알 수 없으므로 안전한 통신이 가능한 것이다.
그렇다면, 이렇게 암호화된 문자열을 전달 받는 곳에서는 어떻게 해독할 수 있을까?
HTTP 통신은 하나의 요청에 대한 하나의 응답만 존재하지만, HTTPS 통신을 사용할 때는 SSL Handshake
과정이 추가된다.
쉽게 생각하면, 클라이언트와 서버가 서로 안전하다고 인증하고 암호화된 문자열을 해독하기 위한 키를 주고 받는 것이라고 볼 수 있다. 그 과정에 대해서 자세히 알아보자.
HTTPS 통신을 사용하고 싶은 웹사이트는 검증된 기관으로부터 인증서를 발급받아야한다. 그 전에 서버는 Public Key
와 Private Key
를 생성하고, 인증서 발급 기관에는 서버의 정보와 Public Key를 제공한다.
그러면 인증 기관에서는 이상한 서버가 아닌지, 정보가 정확한지 등등을 판단해서 인증서를 발급하게 된다.
즉, 이 인증서에는 서버의 정보
와 Public Key
가 담겨 있는 것이고, 이 때부터 해당 서버는 HTTPS 통신이 가능하게 된다.
SSL Handshake는 문자 그대로 서버와 클라이언트가 안전한 통신을 하기 위해서 SSL 인증서로 악수를 하는 것을 의미한다.
이 때, 서로 신뢰할 수 있는지 확인하고 신뢰할 수 있다고 판단이 되면 암호화에 및 복호화에 사용되는 대칭키
를 갖게 되는데, 이 과정을 자세히 알아보자.
클라이언트가 처음에 서버에 Handshake 요청을 하면 서버는 응답에 아래의 내용들을 넘긴다.
- 암호화에 사용할 알고리즘
- 서버에서 갖고 있던 SSL 인증서
이러한 정보를 받은 클라이언트는 서버에서 전달한 인증서가 옳바른 것인지 검증기관을 통해서 확인한다.
옳바른 SSL 인증서라고 검증이 되면, 클라이언트에서는 Public Key로 암호화한 키를 서버에 전달한다.
서버는 클라이언트가 전달한 이 키를 서버가 갖고 있던 Private Key로 복호화해서 갖게 된다.
이렇게 동일한 키를 클라이언트와 서버가 갖게 되는데, 이게 통신에 사용될 대칭키
이다.
위 과정을 모두 마치면 결과적으로 클라이언트와 서버가 동일한 대칭키를 갖게 되는 것이다.
💡 [참고]
- Public Key로 암호화된 문자열은 Private Key로만 복호화가 가능하고, Private Key로 암호화된 문자열은 Public Key로만 복호화가 가능하다.
- 대칭키로 암호화된 문자열은 동일한 대칭키로만 복호화가 가능하다.
이제 클라이언트와 서버가 동일한 대칭키도 갖고 있고 어떤 알고리즘으로 암호화하는 지도 아니까 서로 서로 암호화된 문자열을 주고 받을 수 있게 된다.
이렇게 HTTP에 암호화를 더한 HTTPS 통신이 가능하게 된다.