📌 이 포스팅에서는 HTTP와 HTTPS의 차이점에 대해 정리하였습니다.
🔥 HTTP와 HTTPS 란?
🔥 대칭키와 비대칭키
🔥 SSL의 동작 방식
✔️ HTTP란 Hyper Text를 통신하기 위한 규약으로 80번 포트를 사용하고, 상태를 유지하지 않는 Statless한 특징을 갖고 있다.
✔️ HTTP의 구조는 Method, Path, Version, Headers, Body 등으로 구성되어 있다.
✔️ HTTP는 암호화가 되지 않는 평문 데이터를 전송하는 프로토콜이다.
✔️ 이에 민감한 개인정보(로그인 정보, 은행 비밀번호) 등을 주고 받으면 제 3자가 이를 확인할 수 있다는 취약점이 존재한다.
✔️ 기존의 HTTP에서 Secure Socket가 추가된 보안이 강화된 통신 프로토콜이 HTTPS 이다.
✔️ HTTPS는 사용자가 싸이트에 보내는 정보들을 제 3자가 보지 못하게 암호화하고 접속한 싸이트가 신뢰할 수 있는 싸이트인지 판별함으로써 보안의 취약점을 강화하였다.
✔️ 또한 HTTPS는 보안의 장점 뿐 아니라, 검색 엔진 최적화(SEO) 가산점을 받을 수 있기 때문에 서비스를 노출시키는데도 효과적이다.
✔️ HTTP와 HTTPS의 가장 큰 차이점은 HTTPS가 가진 SSL 인증서이다. SSL 인증서는 공개키와 개인키를 통해 암호화 및 복호화를 하기 때문에 제 3자가 이를 취득하더라도 이를 해독할 수 없다.
✔️ 또한 HTTPS는 TLS(전송 계층 보안) 프로토콜을 통해 데이터의 무결성을 입증하고, 신뢰하고 있는 싸이트와 통신하고 있음을 검증시켜준다.
✔️ 참고로 TLS와 SSL은 같은 것이다. 네스케이프에 의해 SSL이 발명되었고, 폭넓게 사용되어오다 표준화 기구인 IETF가 관리를 맡게되면서 이름만 TLS로 바뀐 것이다. 실제로 TLS라는 이름 보다는 SSL로 많이 불리고 있다.
✔️ 또한 HTTPS와 SSL의 관계는 SSL 프로토콜 위에서 HTTPS 프로토콜이 작동되기 때문에 SSL이 좀 더 포괄적인 개념으로 이해해야 한다.
✔️ HTTPS는 대칭키 암호화 방식과 비대칭키 암호화 방식을 모두 사용하고 있다.
✔️ 대칭키 암호화 방식은 클라이언트와 서버가 동일한 키를 사용해 암호화와 복화화를 진행하는 것을 의미한다.
✔️ 대칭키의 단점으로는 서로 같은 키를 갖고 있어야하기 때문에 키를 공유하는 과정에서 탈취된다면 보안이 문제가 생기는 것이고, 장점으로는 연산 속도가 빠르기 때문에 대용량의 데이터를 암호화 시키는데 효과적이다.
✔️ 비대칭키 암호화 방식은 1개의 쌍(공개키 & 개인키)를 가지고 암호화와 복호화를 진행하고, 공개키가 노출되어도 비교적 안전하지만 연산 속도가 느리기 때문에 리소스를 많이 소모시킨다.
✔️ 비대칭키의 암호와 방식에 있어 공개키란 모두에게 공개 가능한 키를 의미하고, 개인키는 나만가지고 있어야하는 키를 의미한다.
✔️ 비대칭키에서 사용되는 공개키와 개인키는 서로 1쌍으로 이루어져있는데, 클라이언트에서 데이터를 공개키로 암호화해서 서버로 보내면, 서버에서는 서버가 갖고 있는 개인키를 통해 이를 복호화하여 데이터를 확인한다.
✔️ 공개키로 암호화한 데이터는 개인키로만 복호화가 가능하기 때문에 공개키가 제 3자에게 탈취된다하더라도 공개키로는 데이터 복호화가 불가능하다.
✔️ 반대로 서버에서 개인키로 암호화해서 ㅋ보내는 정보들을 클라이언트에서 서버에게 받은 공개키로 복화하는데, 이를 통해 서버가 신뢰할 수 있는 서버인지 확인이 가능하다.
✔️ SSL 인증서에는 서비스의 정보(인증서를 발급한 CA, 서비스의 도메인 등)가 담겨있는데 이를 통해 클라이언트가 접속한 서버가 신뢰할 수 있는 서버임을 보장한다.
✔️ 또한 SSL 인증서에는 통신에 사용할 서버측의 공개키(공개키 내용, 공개키의 암호화 방법) 정보가 있기 때문에 이를 통해 암호화 및 복호화하여 데이터가 제 3자에게 전달되어도 데이터를 해석할 수 없게 만든다.
✔️ SSL의 통신의 동작 방식은 악수(Handshake), 전송, 세션 종료 3가지로 나뉘어져있다.
✔️ 맨 처음 이뤄지는 Client Hello 단계에서는 우선 클라이언트가 서버에 최초 접속을 시도하는 것을 의미한다. 이 때 클라이언트측에서 생성한 랜덤한 데이터와 함께 클라이언트가 지원하는 암호화 방식을 서버에게 알려준다.
✔️ 그 다음 서버는 클라이언트에 대한 응답으로 Server Hello 단계가 이뤄지는데, 이 때 서버측에서 생성한 랜덤 데이터와 함께 클라언트가 보낸 암호화 방식 중 하나를 채택해서 응답한다. 이 과정에서 SSL 인증서 또한 클라이언트로 전달된다.
✔️ 서버에게 SSL 인증서를 받은 클라이언트는 이 인증서가 CA를 통해 발급된 것인지 웹브라우저의 CA 리스트를 확인하는 절차를 가진다. CA 리스트에 이 인증서가 존재한다면 CA의 공개키를 이용해 인증서를 복호화한다. 이 과정을 통해 서버가 신뢰할 수 있는 서버인지 판별한다.
✔️ 이후 클라이언트는 최초 자신이 서버에게 보낸 랜덤 데이터와 서버에게 받은 랜덤 데이터를 조합해 pre master secret 이라는 키를 생성한다. 클라이언트가 pre master secret 키를 생성했다면, 서버가 준 인증서를 복호화해서 획득한 서버의 공개키를 통해 pre master secret 값을 암호화하고 서버에 전달한다. 그럼 서버는 자신의 개인키를 통해 클라이언트에게 받은 pre master secret 키를 복호화한다. 이를 통해 서로 같은 pre master secret 키 공유하게 된다.
✔️ 이제 클라이언트와 서버는 일련의 과정을 통해 pre master secret 값을 master secret 값으로 만들고, master secret 값을 통해 session key를 생성한다. 이제 클라이언트와 서버는 악수(handshake) 단계의 종료를 서로에게 알린다.
✔️ 악수(handshake) 단계가 이상 없이 끝났다면, 세션 단계가 이어진다. 여기서는 실제 데이터가 암호화되어 전송되고, 복호화되어 확인하는 통신 과정이 이뤄진다. 이 때 session key를 이용하여 대칭키 방식으로 암호화와 복호화가 이뤄진다.
✔️ 마지막으로 세션 종료 단계에서는 서로 SSL 통신이 끝낫음을 알려주고, session key를 서로 폐기한다.