HTTP(HyperText Transfer Protocol)란, 하이퍼텍스트(해당 문서가 아닌, 다른 문서(or 자료 등)등의 위치를 표현할 수 있는 텍스트)를 전송하는 통신 규약이다.
HTTPS(HTTP Secure)란, HTTP에 데이터 암호화 기능이 추가된 프로토콜을 말한다.
대칭 키 + 비대칭 키 방식을 혼합해서 사용한다.
대칭 키 방식 vs 비대칭 키 방식
대칭 키 방식은 클라이언트와 서버가 동일한 키를 사용해 암호화/복호화하는 방식으로, 속도가 빠르지만 키가 노출되었을 때 위험성이 큼.
비대칭 키 방식은 한 쌍의 공개 키/개인 키를 가지고 암호화/복호화하는 방식으로, 키가 노출되어도 위험성이 비교적 작은 대신 속도가 느리다.공개 키와 개인 키
공개 키는 외부에 드러낼 수 있는 키이고, 개인 키는 자신만 알고있어야 하는 키이다. 한쪽 키로 암호화한 데이터는, 다른 쪽 키로만 복호화할 수 있다.이러한 특징으로 인해, 암호화를 공개 키로 할 때와 개인 키로 할 때, 얻을 수 있는 효과가 다르다.
- 공개 키로 암호화하면, 개인 키를 가진 사람만 볼 수 있다.
- 개인 키로 암호화하면, 해당 데이터가 "내가 암호화한 데이터" 임을 보증할 수 있다.
위에 말했듯, HTTPS는 대칭 키 + 비대칭 키 방식을 혼합해서 사용한다.
이 과정을 자세히 알아보자.
데이터를 교환하는 과정에서는, 대칭 키 방식을 사용한다. 속도 면에서의 이점이 크기 때문이다.
이 대칭 키를 세션 키라고 하며, HandShake 과정에서 생성한다.
대칭 키는 속도가 빠른 대신, 키가 노출되면 위험성이 크다고 했다. 이 문제를 해결하기 위해, 세션 키를 교환할 때는 비대칭 키 방식을 사용한다.
이렇게 함으로써 통신을 빠른 속도로 수행하면서도, 키 노출의 위험성을 줄일 수 있다.
후술하겠지만 이는 RSA방식의 키 교환 시 과정이며, 많이 사용되는 Diffie-Hellman 계열 방식에서는 위에서 클라이언트가 세션 키를 생성하여 서버로 전달하던 과정에서,
세션 키 생성에 필요한 파라미터들을 공유한 뒤 각자 생성하는 것으로 바뀐다.
위 과정을 보면 클라이언트 또는 서버가 갖고있는 세션 키를 탈취하거나, 서버의 개인 키를 탈취하지 않는 이상 웬만큼 안전함을 알 수 있다. 1~2번 과정에서 "누군가 서버인 척 대신 자신의 공개 키를 응답하고 이후 과정을 대신하면 보안을 뚫을 수 있지 않을까?" 했지만, 이 과정에서 CA(Certificate Authority) 기관들이 관여하므로, 이럴 가능성 또한 희박하지 않을까 생각한다.
우리가 브라우저로 특정 링크를 들어갔을 때, 인증된 CA기관의 인증서가 아닌 경우 신뢰할 수 없는 링크라는 알림이 뜬다. 이 때가 위와 같은 경우일 것 같다.
위의 인증서와 관련된 부분에서, CA 기관들이 관여한다. 이 부분을 자세히 살펴보자.
같은 기능이지만, 최초 개발사인 Netscape가 SSL 업데이트에 참여하지 않게 되며, 소유권 변경을 위해 명칭만 바뀐 것이다.
SSL은 꽤 오래 전(1996년)부터 업데이트가 중단되었다.
그 이후론 TLS만 발전되어 왔다.
아래는 TLS 1.2버전, Diffie Hellman 방식을 기준으로 Handshake 과정을 알아본다.

Cipher Suit
SSL/TLS 과정에서 사용되는 암호화 알고리즘의 조합이다.
키 교환 방식, 인증서 검증 방식, 데이터 암호화 방식 등의 정보를 담는다.
Handshake 과정에서, 클라이언트가 서버에게 사용 가능한 Cipher Suite 목록을 전달하면,
서버가 그 중에서 사용할 방식 하나를 선택하여 클라이언트에 전달한다.

서로 다르다. 3-way handshake가 끝난 후, SSL/TLS handshake가 수행된다.

대칭 키 생성에 필요한 재료를 교환한다.
서버와 클라이언트가 서로의 개인 키를 몰라도, 같은 대칭 키를 생성할 수 있다.
(1) 둘 다 아는 공통 정보
(2) 서버의 개인 키
(3) 클라이언트의 개인 키
위 3개로 대칭 키를 생성하며, 서로의 개인 키는 당연히 공유하지 않는다.
아래 생략한 부분을 간단히 요약하자면,
{(1) & (2)} & (3) = {(1) & (3)} & (2)
이다.
여기서 (1) & (2)는 서버의 공개 키, (1) & (3)은 클라이언트의 공개 키이다.
참고) 기반이 되는 식은 다음과 같다.
G = 정수, P = 소수일 때,
(G^a mod P)^b mod P = (G^b mod P)^a mod P
a = 서버의 개인 키
b = 클라이언트의 개인 키
G^a mod P = 서버의 공개 키
G^b mod P = 클라이언트의 공개 키
(G^a mod P)^b mod P = (G^b mod P)^a mod P = 대칭 키
가 된다.
다만 이 방식은 CPU 부하가 커서, 효율을 개선한 ECDH 알고리즘도 존재한다.
위에 언급한 ECDH에 PFS기능을 더한 ECDHE라는 방식을 주로 사용한다고 한다.
TLS 1.3부터는 Diffie-Hellman 계열 중 세션 키를 주기적으로 갱신하는 방식만 지원한다고 한다.
보안상의 취약점 때문에, TLS 1.3버전부터 RSA 키 교환 방식은 지원 중단되었다.
위의 HTTPS 동작 과정 부분과 같은 방식이다.
클라이언트가 세션 키를 생성 후, 서버의 공개 키로 암호화하여 전달하면, 서버는 개인 키로 복호화하여 사용한다.
이는 서버의 개인 키가 노출되면 위험성이 크고, PFS를 지원하지 않아 과거의 데이터까지 복원할 수 있게 되는 문제가 있다.
위조/사칭 사이트를 방지하고, 서버의 신뢰도를 높이기 위해 필요하다.
클라이언트는 인증서 유효성 검사 단계를 통해, 서버가 믿을 만한 곳인지를 확인할 수 있다. HTTPS 키 교환 과정에서 인증서가 아닌 서버의 공개 키만을 사용한다면 통신 내용을 제3자가 확인하는 것은 막을 수 있겠지만, 정작 대상 서버가 믿을 만한 곳인지는 판별하기 어렵다.
[참고 링크]
- [Web] HTTP와 HTTPS의 개념 및 차이점 - mangkyu.tistory
- SSL이란?, SSL과 TLS 정의 및 차이 - kanoos-stu.tistory
- HTTPS 통신 과정 쉽게 이해하기 #3(SSL Handshake, 협상 - aws-hyoh.tistory
- https의 cipher suite 및 RSA, DHE 키 교환 방법 - Jinyeong You.medium
- SSL/TLS #4, Forward Secrecy와 디피 헬만 키교환 방식, RSA 키교환 방식 - aws-hyoh.tistory
- [암호학] 암호학의 미궁 - 암호학의 발달 과정, Diffie-Hellman, RSA, 공개키 암호화 - loosie.tistory
- [ODOP:16]사이퍼 스위트(Cipher Suite/TLS v1.2)
- HTTPS 통신과정 쉽게 이해하기 번외편(Perfect Forward Secrecy) - aws-hyoh.tistory
- SSL/TLS #2, 인증서 검증과 Chain - aws-hyoh.tistory
- 알아두면 쓸데없는 신비한 TLS 1.3