HTTP와 HTTPS의 차이
HTTP는 HyperText Transfer Protocol로, 클라이언트와 서버 사이에 이루어지는 요청/응답 프로토콜이다. 예를 들어, 클라이언트인 웹 브라우저가 HTTP를 통해서 서버로부터 웹페이지(HTML)나 그림 정보를 요청하면, 서버는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다. TCP/IP 모델에서 응용 계층에 해당하는 프로토콜이다.
웹 서핑을 할 때 서버에서 웹 브라우저로 데이터를 전송해주는 용도로 가장 많이 사용된다.
HTTPS는 HTTP + over Secure Socket Layer의 약자이다. 기존의 HTTP 프로토콜의 문제점은 서버에서 브라우저로 전송되는 정보가 암호화되지 않는다는 점이다. 즉, 데이터가 쉽게 도난당할 수 있다는 것이다. HTTPS 프로토콜은 기존의 HTTP 에 SSL(Secure Socket Layer)을 사용함으로써 이 문제를 해결했다.
HTTPS는 HTTP 통신하는 소켓 부분을 SSL이나 TLS(Transport Layer Security) 라는 프로토콜로 대체한 프로토콜이다. HTTP는 원래 TCP 와 직접 통신했지만, HTTPS에서는 HTTP는 SSL과 통신하고, SSL이 TCP와 통신하게 된다. SSL을 사용한 HTTPS는 암호화와 증명서, 안전성 보호를 이용할 수 있게 된다.
HTTPS의 SSL에서는 대칭키 암호화 방식과 공개키 암호화 방식을 혼합한 하이브리드 암호 시스템을 사용한다. 대칭키를 공개키 암호화 방식으로 교환한 다음에 다음으로부터의 통신은 대칭키 암호를 사용하는 방식이다.
* 대칭키 & 공개키
대칭키(Symmentric Key, 공통키) 알고리즘
암호화와 복호화에 같은 암호키(대칭키)를 사용하는 알고리즘
동일한 키를 주고 받기 때문에, 매우 빠르다는 장점이 있다.
하지만, 대칭키 전달 과정에서 해킹 위험에 노출될 수 있다.
공개키(Public Key) 알고리즘
암호화와 복호화에 사용하는 암호키를 분리한 알고리즘
자신이 가지고 있는 고유한 암호키(개인키/비밀키)로만 복호화할 수 있는 암호키(공개키)를 대중에 공개한다.
/*공개키로 암호화,공개키와 매칭되는개인키로 복호화*/
ㄴ 꼭 이런건 아니다!!
공개키 암호화 방식 진행 과정
- A가 웹 상에 공개된 B의 공개키를 이용해 평문을 암호화하여 B에게 보낸다.
- B는 A가 보낸 암호화된 평문을 자신의 개인키로 복호화한 후, A의 공개키로 응답을 암호화하여 A에게 보낸다.
- A는 자신의 개인키로 암호화된 응답문을 복호화한다.
이는 대칭키의 단점을 완벽하게 해결했지만, 암호화하는 키와 복호화하는 키가 서로 다르기 때문에 암호화, 복호화가 매우 복잡하다.
대칭키 + 공개키 -> SSL 탄생의 시초
- A 가 B의 공개키로 암호화 통신에 사용할 대칭키를 암호화하고 B에게 보낸다.
- B는 암호문을 받고, 자신의 비밀키로 복호화한다.
- B는 A로부터 얻은 대칭키로 A에게 보낼 평문을 암호화해서 A에게 보낸다.
- A는 자신의 대칭키로 암호문을 복호화한다.
- 앞으로 이 대칭키로 암호화를 통신한다.
즉, 대칭키를 주고 받을 때만 공개키 암호화 방식을 사용하고, 이후에는 계속 대칭키 암호화 방식으로 통신한다.
[HTTPS 통신 흐름]
[서버 - CA]
- 애플리케이션 서버(A)를 만드는 기업은 HTTPS를 적용하기 위해 공개키와 개인키를 생성한다.
- 신뢰할 수 있는 CA 기업을 선택하고, 그 기업에게 내 공개키 관리를 부탁하며 계약을 한다.
- CA(Certificate Authority): 공개키를 저장해주는 신뢰성이 검증된 민간 기업
- 계약된 CA 기업은 해당 기업의 이름, A 서버의 공개키, 공개키 암호화 방법, 유효기간 등을 담은 인증서를 만들고, 해당 인증서를 CA 기업의 개인키로 암호화해서 A 서버에게 제공한다.
- A 서버는 암호화된 인증서를 갖게 되었다. 이제 A 서버는 발급받은 인증서와 자신의 개인키를 서버에 설정하여 HTTPS 통신을 할 수 있다.
- 클라이언트, 즉 웹 브라우저에는 여러 인증 기관의 공개키를 포함한 인증서가 이미 설치되어 있다. 그래서 웹 서버와 통신 시 인증 기관의 개인키로 서명된 인증서를 받았을 때 이미 설치되어 있는 인증기관의 공개키로 복호화가 가능한 것이다.
[클라이언트 접속]
- 클라이언트가 웹 브라우저로 사이트에 접속하면 A 서버는 인증서를 브라우저에게 보낸다. 이 인증서에는 인증기관의 개인키로 암호화된 사이트의 정보와 A 서버의 공개키가 들어있다.
- 웹 브라우저는 이미 가지고 있는 인증기관의 공개키로 A 서버에서 받은 인증서를 복호화해서 확인한다.
- 웹 브라우저는 실제 데이터의 암호화에 사용될 대칭키를 생성하고, 인증서에서 꺼낸 A 서버의 공개키로 암호화해서 A 서버로 보낸다.
- A 서버는 자신이 가지고 있는 개인키로 웹 브라우저가 보내온 대칭키를 복호화해서 얻는다. 이제 이 대칭키로 데이터를 암호화해서 주고 받게 된다.
* 신뢰받는 CA 기업이 아닌 자체 인증서를 발급한 경우 등 HTTPS도 무조건 안전한 것은 아니다. 이 때는 HTTPS지만 브라우저에서 주의 요함
, 안전하지 않은 사이트
와 같은 알림으로 주의받게 된다.
[모든 웹 페이지에서 HTTPS를 사용하지 않는 이유?]
평문 통신에 비해서 암호화 통신은 CPU나 메모리 등 리소스가 많이 필요하다. 통신할 때마다 암호화를 하면 많은 리소스를 소비하기 때문에 서버 한 대당 처리할 수 있는 리퀘스트의 수가 줄어들게 된다. 그렇기 때문에 민감한 정보를 다룰 때만 HTTPS에 의한 암호화 통신을 사용한다.
cf) HTTP 2.0이 발전하면서 HTTPS 가 HTTP보다 빠르다고 한다. 요기서
Reference
https://offbyone.tistory.com/274
'Computer Science > 네트워크' 카테고리의 다른 글
[네트워크] OSI 7계층과 TCP/IP 4계층 (0) | 2020.11.28 |
---|---|
[네트워크] TCP & UDP (0) | 2020.11.14 |
[Web] 쿠키(Cookie)와 세션(Session) (0) | 2020.10.10 |
[Web] URI & URL & URN (0) | 2020.10.09 |
[Web] 주소창에 naver.com을 검색하면 일어나는 일 (DNS) (0) | 2020.10.06 |