본문 바로가기

World Wide Web/HTTP

HTTP와 HTTPS

HTTP 통신을 하다보면 몇 가지 보안상의 이슈가 발생하게 된다. HTTP 자체는 굉장히 단순한 프로토콜이고, 요청과 응답의 BODY가 암호화된 상태에서 통신이 이루어지지 않기 때문이다. 그래서 그에 대한 대안으로 HTTP 요청/응답의 메시지를 암호화해서 보내는 방식이 있다. 이것은 HTTP 자체를 암호화하는 것이 아니라 HTTP 통신은 그대로이나 그 안에 담긴 메시지만 암호화하는 것이다. 그럼에도 불구하고 이 방식은 범용성이 낮다는 점에서 한계가 존재한다. 메시지 자체를 암호화하는 것이기 때문에 클라이언트의 브라우저가 이 메시지를 해독하지 못할 확률이 존재하기 때문이다. 

 

HTTPS는 HTTP를 SSL로 감싸는 것이다

그래서 HTTP 메시지 자체를 암호화하는 것이 아니라 HTTP를 암호화하는 방식이 대안으로 제시되었다. HTTPS는 HTTP를 SSL로 감싸는 것이다. HTTPS라느 어플리케이션 계층에서 HTTP와 구분되는 별개의 프로토콜이 아니다. HTTP는 그대로 이면서 TCP와 HTTP 사이에 SSL이라는 계층이 추가된 것이다. 

 

그렇다면 HTTPS를 가능하게 하는 SSL 프로토콜은 무엇인가? SSL 프로토콜은 공개키와 비밀키로 작동한다.

 

클라이언트는 공개키를 갖고, 웹 서버는 비밀키를 갖는다

브라우저에서 SSL 프로토콜을 사용하겠다고 요청을 보내면, 웹서버는 응답과 함께 공개키를 클라이언트에 전달한다. 클라이언트는 서버로부터 전달받은 공개키를 가지고 난수를 생성하고, 이를 서버에 전달한다. 서버는 비밀키로 암호화된 데이터를 해독하고 이것이 성공적으로 이루어졌음을 클라이언트에 알려준다. 

 

이렇게 SSL 프로토콜에 대한 HandShake가 완료되면 이것을 바탕으로 HTTP 통신을 시작하게 된다. HTTP 통신이 이루어지는 동안은 SSL 프로토콜이 계속 유지되는 것이 HTTPS 통신인 것이다.