HTTP(HyperText Transfer Protocol)와 HTTPS(HyperText Transfer Protocol Security)는 웹에서 데이터를 전송하는 프로토콜이다.
이 둘의 주요 차이는 보안(Security)에 관한 것이다.
HTTP
웹 서핑을 할 때 서버에서 자신의 브라우저로 데이터를 전송해 주는 용도로 많이 사용되며, 서버-클라이언트 모델에 맞춰 데이터를 주고받기 위한 프로토콜이다.
인터넷 초기에 모든 웹 사이트에서 기본적으로 사용되었던 프로토콜이며 80번 포트를 기본적으로 사용하고 있다.
HTTP는 암호화가 되지 않은 평문 데이터를 전송하는 프로토콜이기 때문에 HTTP로 비밀번호나 주민등록번호 같이 중요한 정보를 주고받으면 제 3자가 정보를 조회할 수 있다.
이런 보안의 문제를 해결하기 위해 HTTPS가 등장하게 되었다.
HTTPS
HTTP에 데이터 암호화가 추가된 프로토콜이다.
443번 포트를 기본적으로 사용하고 있으며, 데이터를 암호화하기 때문에 주고받는 과정에서 제 3자가 볼 수 없다.
HTTPS는 SSL인증서를 사용해 사용자가 사이트에 제공하는 데이터를 암호화한다.
TLS 프로토콜을 사용해서 보안을 유지한다. TLS는 데이터 무결성을 보장해서 데이터가 전송 중에 수정되거나 손상되는 것을 방지하며 사용자가 접속하려는 웹사이트와 통신하고 있음을 증명할 수 있는 인증 기능도 가지고 있다.
TLS는 SSL의 대체제로, SSL보다 안전하고 더 향상된 버전이다.
SSL 프로토콜의 사용이 중단되고 대신 TLS가 채택되었지만 사람들은 여전히 이 유형의 기술을 'SSL'이라고 부른다.
대칭 키 vs 비대칭 키
대칭키
데이터를 암호화하고 복호화할 때 같은 키를 사용하는 것을 말한다.
키가 노출되면 매우 위험하지만 속도가 빠른 장점이 있다.
비대칭 키
공개키와 개인키를 이용해 암호화 및 복호화를 진행한다.
키가 노출되어도 비교적 안전할 수 있지만 속도가 느린 단점이 있다.
- 공개 키 : 모두에게 공개가 가능한 키
- 개인 키 : 나만 가지고 있어야 하는 키
암호화를 공개 키로 할 것인지, 개인 키로 하는 것에 대해 역할이 나누어져 있다.
- 공개 키로 암호화 → 개인 키로 복호화 : 나만 데이터의 정보를 볼 수 있기 때문에 중요한 정보를 보낼 때 사용 된다.
- 개인 키로 암호화 → 공개 키로 복호화 : 공개 키는 모두가 사용 가능하므로 내가 인증한 정보임을 알려 신뢰성을 보장받을 수 있다.
HTTPS는 대칭 키와 비대칭 키를 둘 다 사용하여 데이터를 주고받는다.
SSL 인증서
신뢰성이 엄격하게 공인된 기업들이 참여된 CA(Certification Authority)라는 기업들이 발급해 준 인증서를 말한다.
개발자는 HTTPS를 적용하려면 신뢰할 수 있는 CA 기업의 인증서를 구입해야 하고, 이 인증서를 구입하게 되면 CA 기업의 개인 키를 이용하여 암호화 한 인증서를 준다.
SSL 인증서는 서비스의 정보(인증서를 발급한 CA, 서비스의 도메인 등)와 서버 측 공개 키가 들어 있다.
우리가 사용하는 각 브라우저들은 CA의 공개키를 알고 있기 때문에 SSL 인증서를 받으면 CA의 공개키로 복호화하여 서버가 보내준 정보와 서버 측 공개키를 획득할 수 있다.
SSL Handshake
이전 포스팅에서 TCP는 3-way handshake로 연결된다는 것을 공부하였다.
SSL handshake는 3-way handshake로 연결된 이후에 서버와 클라이언트가 4번의 과정을 통해 키를 주고받는다
- ClientHello : 클라이언트가 서버에 연결을 시도하며 전송하는 패킷이다. Session Id, SSL 프로토콜 버전 등을 전달
- ServerHello : 클라이언트가 보낸 패킷을 받고 자신의 정보(SSL 프로토콜 버전 등)를 다시 전달한다.
- Certificate : CA로부터 인증된 자신의 SSL 인증서를 클라이언트에게 전달한다. 내부에는 서버 측 공개 키가 있다.
- ServerHelloDone : 서버가 행동을 마쳤음을 전달한다.
- ClientKeyExchange : SSL 인증서를 CA의 공개 키로 복호화하여 서버 측 공개 키를 획득한다. 그리고 데이터 암호화에 사용할 대칭 키를 생성한 후 서버 측 공개 키로 대칭 키를 암호화하여 전달한다.
- ChangeCipherSpec / Finished : 클라이언트와 서버 모두가 서로에게 보내는 패킷으로, 교환할 정보를 모두 교환한 뒤 통신할 준비가 다 되었음 알린다.
(서버는 사용자가 보낸 암호화된 대칭키를 서버 측 개인 키로 복호화하여 대칭 키를 획득한다.)
그리고 Finished 패킷을 보내어 SSL Handshake를 종료한다.
실전
Q. HTTP와 HTTPS의 차이에 대해 설명해 주세요.
A. HTTP와 HTTPS는 둘 다 데이터를 전송하는 방식으로 가장 큰 차이는 보안적인 측면에 있습니다.
먼저 HTTP는 80 포트를 기본으로 사용하며 서버와 클라이언트가 데이터를 암호화하지 않은 평문으로 데이터를 전송하는 프로토콜입니다. 암호화 및 복호화 과정이 없기 때문에 속도 측면에서는 빠르다는 장점이 있지만 제 3자가 조회하였을 시 평문이기에 데이터가 그대로 노출이 되어 보안적인 측면에서 굉장히 약하다는 단점이 있습니다.
위 문제점을 해결하기 위해 나온 프로토콜이 HTTPS입니다. HTTPS는 443 포트를 기본으로 사용하며, 대칭 키와 비대칭 키를 사용하여 데이터를 주고받을 때 암호 문을 사용합니다. 그래서 제 3자가 조회하였을 시 암호문을 해독할 수 없어 보안적인 측면에서 강하다는 장점이 있지만 암호화 및 복호화를 진행하는 과정이 필요하기 때문에 속도가 느리다는 단점이 있습니다.
참고
https://steady-coding.tistory.com/512
https://developer-ellen.tistory.com/189
항해 개발자 리부트 코스를 수강하고 작성한 콘텐츠 입니다.
IT 커리어 성장 코스 항해99, 개발자 취업부터 현직자 코스까지
항해99는 실무에 집중합니다. 최단기간에 개발자로 취업하고, 현직자 코스로 폭발 성장을 이어가세요. 실전 프로젝트, 포트폴리오 멘토링, 모의 면접까지.
hanghae99.spartacodingclub.kr
'멋진 개발자 > Network' 카테고리의 다른 글
개발자 취준 기록 37 - HTTP 상태 코드 (0) | 2024.04.01 |
---|---|
개발자 취준 기록 32 - HTTP Method (0) | 2024.03.27 |
[항해 취업코스] 개발자 취준 기록 24 - 쿠키와 세션 (0) | 2024.03.19 |
[항해 취업코스] 개발자 취준 기록 23 - TCP와 UDP (0) | 2024.03.18 |
[항해 취업코스] 개발자 취준 기록 22 - CORS는 무엇인가 (2) | 2024.03.16 |